事务隔离级别
事务隔离是数据库处理的基础之一。隔离是缩写ACID中的I;当多个事务同时进行更改和查询时,隔离级别是微调性能与可靠性、一致性和结果再现性之间平衡的设置。
InnoDB提供SQL:1992标准描述的所有四种事务隔离级别: READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
InnoDB 的默认隔离级别是 REPEATABLE READ。
用户可以使用 SET TRANSACTION 语句更改单个会话或所有后续连接的隔离级别。
要为所有连接设置服务器的默认隔离级别,可以在命令行或选项文件中使用 --transaction-isolation 选项。
InnoDB使用不同的锁定策略支持这里描述的每一种事务隔离级别。
-
你可以使用默认的
REPEATABLE READ级别来执行高度的一致性,用于对ACID合规性非常重要的关键数据的操作。 -
在批量报告等情况下,精确的一致性和结果的可重复性没有最大限度减少锁定开销那么重要,这时可以使用
READ COMMITTED或甚至READ UNCOMMITTED放宽一致性规则。 -
SERIALIZABLE执行比REPEATABLE READ更严格的规则,主要用于特殊情况,如 XA 事务以及并发和死锁问题的故障诊断。
下面的列表描述了 MySQL 如何支持不同的事务级别。该列表从最常用的级别到最不常用的级别依次排列。
可重复读(REPEATABLE READ)
这是 InnoDB 的默认隔离级别。同一事务中的一致读取会读取第一次读取建立的快照。这意味着,如果在同一事务中发出多条普通(非锁定)SELECT 语句,这些 SELECT 语句之间也是一致的。
对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 和 DELETE 语句,锁定取决于语句是使用带有唯一搜索条件的唯一索引,还是使用范围类型的搜索条件。
- 对于具有唯一搜索条件的唯一索引,InnoDB 只锁定找到的索引记录,而不锁定之前的空白。
- 对于其他搜索条件,InnoDB 会锁定所扫描的索引范围,使用间隙锁或下一键锁来阻止其他会话插入该范围所覆盖的间隙。
读提交内容(READ COMMITTED)
即使在同一个事务中,每次一致读取都会设置并读取自己的新快照。
对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 语句和 DELETE 语句,InnoDB 只锁定索引记录,而不锁定它们之前的间隙,因此允许在锁定记录旁边自由插入新记录。间隙锁定仅用于外键约束检查和重复键检查。
由于间隙锁定被禁用,可能会出现幽灵行问题,因为其他会话可以在间隙中插入新记录。
READ COMMITTED 隔离级别仅支持基于行的二进制日志记录。如果使用带有 binlog\_format=MIXED 的 READ COMMITTED,服务器会自动使用基于行的日志记录。
使用 READ COMMITTED 还会产生其他影响:
-
对于 UPDATE 或 DELETE 语句,InnoDB 只为其更新或删除的记录加锁。非匹配记录的记录锁会在MySQL评估完WHERE条件后释放。这大大降低了死锁发生的概率,但死锁仍有可能发生。
-
对于UPDATE语句,如果记录已经被锁定,InnoDB会执行 "半一致 "读取,向MySQL返回最新提交的版本,以便MySQL确定记录是否与UPDATE的WHERE条件相匹配。如果符合(必须更新

最低0.47元/天 解锁文章
3027





