四种隔离级别
SQL标准中定义了四种隔离级别,按由松到紧的顺序:
<1>未提交读
A事务内的修改还未提交时,其他事务就可以读取A事务内未提交的数据,这部
分数据是脏数据,因此会导致脏读的问题。
<2>提交读(不可重复读)
A事务提交后,其他事务才可以读取该事务提交后的数据,解决了脏读的问题。
但是如果被A事务修改了,那么其他事务读物该条数据时,在A事务提交前和提交后读取的数据是不⼀样的,因此也叫不可
重复读。
<3>可重复读(MySQL的默认事务隔离级别)
不仅解决了脏读的问题,也解决了不可重复读的问题
在A事务提交前后,其他事务读取A事务修改的数据时是完全⼀致的,因此叫可重复读。
幻读问题
如果A事务修改的不是某⼀条数据,⽽是⼀整段范围数据
在A事务修改的⼀段范围数据中插⼊了新的数据,那么A事务读取这段范围数据前后会产⽣不⼀致既幻⾏问题。
问题解决方案:
InnoDB和XtraDB引擎通过MVCC(多版本并发控制)解决了幻读的问题。
InnoDB通过间隙锁,不仅锁定⾏数据,还对⾏数据间的间隙进⾏锁定,防⽌幻
影⾏的插⼊。
<4>可串⾏化
最⾼的隔离级别,通过强制事务串⾏执⾏的⽅式,把读取的每⼀⾏数据都上锁,
避免了幻⾏的问题。但是要求事务必须依次执⾏,不⽀持事务并发执⾏。
MVCC多版本并发控制机制:
基于提⾼不同事物同时执⾏的并发性能考虑,MVCC是⾏级锁的变种,在很多情况下避免了加锁的操作,因此开销更低。
InnoDB的MVCC运⾏机制:
每⼀⾏数据后⾯有2个隐藏的列,⼀个保存了该⾏创建时的系统版本号,另⼀列
保存了改⾏删除时的系统版本号,每⼀个事务开始前,系统版本号都会⾃增,事
务开始时刻的系统版本号就是该事务的版本号。
select操作:只查找⾏创建版本号⼩于或等于该事务系统版本号的数据,⼩于的
是本事务之前就存在的数据,等于的是本事务插⼊的数据。
insert操作:新插⼊的⾏数据的创建版本号就是本事务的系统版本号
delete操作:删除的⾏数据的删除版本号就是本事务的系统版本号
update操作:先增后删,先插⼊⼀条新数据,⾏创建版本号是本次事物的系统版
本号,再把原来的数据删除,也就是在原来数据的⾏后的删除标识列加上本次事
物的系统版本号
网友评论