四种隔离级别
innodb有四种标准的隔离级别
READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
默认隔离级别是REPEATABLE READ
用户可以为一个session中或所有的connection设置事务隔离级别属性
innodb在不同的隔离级别下使用不同的锁策略,使用默认的RR级别对ACID要求合规的重要数据可以基本满足高度一致性。
如果对数据的一致性要求不高,可以使用较为松式的策略,例如:RC、RU
innodb-SERIALIZABLE隔离级别是一种最严格的规则,一般用于XA事务或解决并发死锁故障
RR级别
特性1.一致性读的方式是在第一次读时建立快照
特性2.在锁定读、update、delete时,加锁方式依赖于查询的方式,即是否是根据唯一索引查询, 如果是则锁定行,如果不是则可能会产生间隙锁
RC级别:
特性1.一致性读的方式是每次读取和更新都会刷新快照
特性2.在锁定读、update、delete时,加锁方式是只锁定索引记录,不锁间隙
特性3.在RC级别下binlog模式只支持row-based,即使配置了binlog_format=MIXED,实际也是采用row-based
特性4.在RC级别下,根据非索引字段更新,只会锁定where条件下对应的行,不会锁定全表行记录
在RC级别下,因为没有间隙锁的保护,这时会出现幽灵问题,也可以叫做幻读
RC级别作用和启用innodb_locks_unsafe_for_binlog配置类似,但两者也有区别:
1.innodb_locks_unsafe_for_binlog可以被设置成全局/所有session,但RC级别可以设置为所有session/单个session
2.innodb_locks_unsafe_for_binlog只能在mysql服务启动前设置,RC级别可以在服务运行时设置
RU级别:
特性.读取不具有一致性,存在脏读问题
SERIALIZABLE级别
特性.在atuocommit关闭的情况下,所有的select操作都会加共享锁