隔离级别
读未提交(Read uncommitted)
写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务
实现:事务写加行级共享锁,事务读不加锁
问题:脏读,写事务没有阻止读事务,写事务执行还未提交期间,可能 被其他读事务读取到中间态不正确的数据。读以提交(Read committed)
写事务阻止其他读/写事务。读事务不阻止其他事务
实现:事务写加行级排他锁直到事务结束,事务读(读取瞬间)加行级共享锁(读完马上释放,不需要等待事务结束)
问题:不可重复读(虚读),一个事务中读两次结果不同,在两次读期间可能有update操作导致两次读不一致可重复读(Repeatable read)
写事务阻止其他读/写事务。读事务阻止其写事务
实现:务写加行级排他锁直到事务结束,事务读(读取瞬间)加行级共享锁直到事务结束
问题:幻读,一个事务读期间,由于insert操作(由于insert前这行数据不存在,所以不存在被锁住的情况)导致两次读取数据条数有差异可串行化(Serializable)
写事务阻止其他读/写事务。读事务阻止其写事务
实现:事务写加表级排他锁,事物读加表级共享锁
解决读问题
脏读:事务写加行级排它锁
不可重复读:事务读时加行级共享锁直到事务结束,或使用MVCC
幻读:事务读加表级共享锁,事务读加表级排它锁,或使用间隙锁
当然解决隔离级别高的解决办法也可以解决隔离级别低的问题
MVCC:并发版本控制,通过添加版本号
(系统版本号:递增。事务版本号:为加事务时的版本号)来解决并发读写问题。
InooDB:应用在每个记录后面隐藏两列
(创建版本号:创建一行时的系统版本号快照。删除版本号:删除一行时的系统版本号快照)
如果删除版本号 > 系统当前版本号 这个认为快照有效
间隙锁:在RR级别有索引的情况下,间隙锁对一段区间进行加锁(A,B)
防止在数据行A-B中的间隙插入数据,或更新数据