说到mysql
的事物就会想到事物的特性ACID:
- 原子性
- 一致性
- 隔离新
- 持久性
我这里针对mysql
的innodb
存储引擎来说
mysql的隔离性实际上是通过
lock
来实现的,其他三条是通过redo
,undo
机制来实现
mysql中lock的类型
- 共享锁(允许事物读取一行数据)
- 排他锁(允许事物读取或更新一行数据)
- 意向锁 (表级别的锁定)
RC和RR的区别
在默认情况下mysql存储引擎默认使用的是一致性非锁定读操作
如果读取的行正在执行DELETE、UPDATE操作,这时读取操作不会因此等待行上锁的释放,而是会读取当前行的快照版本。但是读取快照的方式在不同隔离级别下方式是不一样的。***RC下读取的是行最新快照版本,RR模式下读取的是事物开始时候的行数据版本。***因此在RC模式下会产生不可重复读和幻读。因此RR支持MVVC(多版本并发控制)而RC不支持MVVC。
锁算法的实现
- Recort Lock (单个行记录上的锁)
- Gap Lock (间隙所,锁定一个范围,单不包含记录本身)
- Netx-Key Lock (锁定一个范围,并锁定记录本身)
InnoDB对于行的查询都是采用这种Netx-Key Lock算法。对于不同的SQL查询,可能设置为分为共享Netx-Key Lock和排他Netx-Key Lock。
参考
- MySQL技术内幕