MySQL事务隔离
- 介绍
mysql默认是使用innodb引擎,大多数时候也是用innodb。 innodb引擎是基于事务的引擎。所有操作都是基于事务,除了用户主动开启的显式事务,未主动开启事务的操作,innodb也会隐式开启事务进行操作。 mysql有四种事务隔离级别: - 读未提交 - 读已提交 - 可重复读 - 串行化
- 前置概念
MVCC: 多版本管理机制,用于读时生成快照。快照只保证同一行版本不变。 脏读:指读到其他事务未提交的数据,可能是无效的数据。 不可重复读:指事务内两次或多次行读取结果不同。 幻读:指事务内两次或多次范围查询数据行数不一致。 间隙锁:指锁住行之间间隙的锁。锁住期间,这些行内不能插入新行。 - 读未提交
基本介绍:可以读到其他事务尚未提交的数据,不使用MVCC,写时会加行锁。 优点: -并发读取比较快 缺点: - 可能脏读 - 可能不可重复读 - 可能幻读
- 读已提交
基本介绍:只能读到已提交的数据,使用MVCC,并且每次读都会生成快照,写时会加行锁。 优点: - 不会产生脏读 缺点: - 可能不可重复读 - 可能幻读
- 可重复读
基本介绍:只能读到已提交的数据,使用MVCC,并且事务内读只会生成一次快照。写时会加行锁。通过索引范围查询时,会加间隙锁,不通过索引范围查询时,会加表锁。 优点: - 不会产生脏读 - 事务内多次读取结果一致 - 不容易发生幻读 缺点: - 有间隙锁更容易产生死锁。 - 不通过索引范围查询会触发表锁,性能骤降。
- 串行化
基本介绍:读加共享锁,写加排他锁,范围查询加间隙锁或表锁,不使用MVCC。所有事务看起来是串行执行的。 优点: - 不会产生脏读,幻读,不可重复读的问题,并发下安全性高。 缺点: - 并发性能最弱
- 补充
mysql默认采用可重复读的事务隔离级别,可以通过改变连接参数指定会话中操作的事务隔离级别。
浙公网安备 33010602011771号