事务具有ACID四种特性。
但是Isolation并发可能引起如下问题:
1.脏读
允许读取到未提交的脏数据。
2.不可重复读
如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。
3.幻读
解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。
由ANSI/ISO定义的SQL-92标准定义的四种隔离级别
1.Read Uncommitted
2.Read Committed
3.Repeatable Read
4.Serializable
隔离解别 | 脏读 | 不可重复读 | 幻读 |
Read Uncommitted | Y | Y | Y |
Read Committed | N | Y | Y |
Repeatable(default) | N | N | Y |
Serializable | N | N | N |
下面用Mysql数据库做一些小实验
Mysql 版本号
mysql> select version(); +------------+ | version() | +------------+ | 5.1.52-log | +------------+ 1 row in set (0.00 sec)
查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别
mysql> select @@global.tx_isolation,@@tx_isolation; +-----------------------+-----------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
更改会话级的隔离级别
Session 1: mysql> set session tx_isolation='read-uncommitted'; Query OK, 0 rows affected (0.00 sec) mysql> select @@global.tx_isolation,@@tx_isolation; +-----------------------+------------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+------------------+ | REPEATABLE-READ | READ-UNCOMMITTED | +-----------------------+------------------+ 1 row in set (0.00 sec) Session 2: mysql> select @@global.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
更改系统级的隔离级别
Session 1: mysql> set global tx_isolation='read-uncommitted'; Query OK, 0 rows affected (0.00 sec) mysql> select @@global.tx_isolation,@@tx_isolation; +-----------------------+------------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+------------------+ | READ-UNCOMMITTED | READ-UNCOMMITTED | +-----------------------+------------------+ 1 row in set (0.00 sec) Session 2: mysql> select @@global.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | READ-UNCOMMITTED | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
关闭SQL语句的自动提交
mysql> set autocommit=off; Query OK, 0 rows affected (0.00 sec)
查看SQL语句自动提交是否关闭
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+ 1 row in set (0.00 sec)
建立实验表
mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1)); Query OK, 0 rows affected (0.08 sec) mysql> show create table tao \G; *************************** 1. row *************************** Table: tao Create Table: CREATE TABLE `tao` ( `col1` tinyint(3) unsigned NOT NULL DEFAULT '0', `col2` varchar(20) DEFAULT NULL, PRIMARY KEY (`col1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
演示脏读
更改隔离级别为Read Committed后,不存在脏读的问题。
mysql> set global tx_isolation='read-committed'; Query OK, 0 rows affected (0.00 sec) mysql> set session tx_isolation='read-committed'; Query OK, 0 rows affected (0.00 sec)
演示不可重复读
更改隔离级别为Repeatable Read后,不存在不可重复读的问题。
mysql> set global tx_isolation='repeatable-read'; Query OK, 0 rows affected (0.00 sec) mysql> set session tx_isolation='repeatable-read'; Query OK, 0 rows affected (0.00 sec)
幻读
更改隔离级别为完全串行化 Serializable 后,不存在幻读的问题。
mysql> set global tx_isolation='serializable'; Query OK, 0 rows affected (0.00 sec) mysql> set session tx_isolation='serializable'; Query OK, 0 rows affected (0.00 sec)
在这种情况下,只允许一个事务在执行,其它事务必须等待这个事务执行完后才能执行。没有并发,只是单纯的串行。
相关推荐
实验过程展示了不同隔离级别下的行为。在 Read Uncommitted 隔离级别下,事务A可以看到事务B未提交的更改,导致脏读。而在 Read Committed 隔离级别下,虽然解决了脏读,但事务A两次查询的结果不同,显示了不可重复...
4. **事务隔离级别**:了解READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE四种隔离级别及其应用场景。 ### 九、视图与存储过程 1. **创建视图**:`CREATE VIEW 视图名 AS SELECT 语句;`创建...
通过一个简单的实验来演示“读提交”隔离级别的行为: 首先,我们有两个查询终端A和B,都开启了事务。此时,两个终端看到的`order`表中的`number`字段值都是1。接着,B终端执行更新操作,将`number`改为2,但不提交...
【数据库原理实验报告——SQL Server 2000系统安装及管理】 实验目的:掌握SQL Server 2000的安装、配置、管理和基本操作,包括数据库的创建、修改、删除以及查询分析器的使用。 一、SQL Server 2000安装与配置 1...
6. **事务与并发控制**:学习如何使用事务(TRANSACTION)确保数据的一致性,以及理解隔离级别(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE)和死锁(Deadlock)的概念。 7. **存储引擎**:...
你将学习如何开始事务、提交事务、回滚事务以及理解隔离级别。 7. **视图**: 视图是虚拟表,基于一个或多个表的查询结果。它们可以简化复杂的查询,提供安全访问控制,并帮助保持数据一致性。 8. **存储过程和...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,它提供了丰富的功能,包括视图和事务处理,这两个概念在本实验中被深入探讨。视图是数据库中一个虚拟的表,它基于一个或多个现有表的查询结果,而事务则是确保...
在本次实验中,史文翰探讨了两种类型的事务模式以及MySQL中的四种事务隔离级别。 首先,实验介绍了两种数据库事务模式:显示事务和隐式事务。 1. **显示事务**: 显示事务是通过明确的开始(BEGIN)、提交...
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID) 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会...
- 事务(Transactions):理解ACID(原子性、一致性、隔离性和持久性)原则,保证数据的完整性。 - 索引(Indexes):创建索引以优化查询性能,了解B-Tree、Hash、Full-text等不同类型的索引。 3. **MySQL性能...
实验121主要探讨了MySQL中的InnoDB存储引擎在处理并发事务时的隔离级别和其对数据一致性的影响,特别是不可重复读和幻影读的问题。InnoDB存储引擎是MySQL中最常用的事务型存储引擎,它支持多种事务隔离级别,以确保...
- 实践事务的提交、回滚和隔离级别设置 - 索引的创建与管理,分析索引对查询性能的影响 - 查询优化,如使用EXPLAIN分析查询执行计划 通过对这三个实验的逐步学习,学生将能够掌握数据库系统的基本操作,理解数据库...
实验四:可能会探讨事务处理和并发控制,讲解ACID(原子性、一致性、隔离性、持久性)特性,以及事务的提交、回滚和隔离级别。学生将学习如何在多用户环境下保证数据的一致性和完整性。 实验五:聚焦于数据库备份与...
实验报告涉及的是数据库系统的事务隔离级别以及锁的概念,主要通过MySQL数据库进行操作。实验的核心是理解和展示不同隔离级别下可能出现的问题,以及如何通过锁机制来防止这些问题。 首先,实验12.1展示了未提交读...
在进行数据库优化时,除了索引和存储过程,还有其他因素需要考虑,例如:合理设置数据库参数(如innodb_buffer_pool_size、query_cache_size等)、使用合适的事务隔离级别、适当的数据类型选择以及数据库设计模式等...
《数据库进阶-事务索引问答》探讨了MySQL数据库中关于事务隔离级别的深入理解,特别是Read Committed(RC)和Repeatable Read(RR)隔离级别的差异。在这个案例中,我们通过一个具体的实验来分析RC隔离级别如何处理...
- 调整数据库参数,例如增大缓冲池大小、调整事务隔离级别等,以适应特定工作负载。 通过这个实验,你将深入理解MySQL的日常管理和性能优化,为构建高效、可靠的数据库环境打下坚实基础。记得在实践中不断学习和...
- 权限系统:MySQL提供多种级别的权限,如SELECT、INSERT、UPDATE、DELETE等,以及全局、数据库、表和列级别。 9. **备份与恢复** - 数据备份:使用`mysqldump`命令生成SQL脚本或二进制文件。 - 数据恢复:导入...
MySQL支持事务的开始(BEGIN)、提交(COMMIT)、回滚(ROLLBACK)操作,以及四种事务隔离级别(读未提交、读已提交、可重复读、串行化)。 7. **视图**: 视图是从一个或多个表中选择数据的虚拟表,不存储实际数据...