vlambda博客
学习文章列表

从锁的角度深刻理解 事务的隔离级别和并发带来的问题

事务的隔离级别

读取未提交

读取已提交

可重复读

可串行化


并发带来的问题:

脏读 脏写 不可复读 幻读


脏写

脏写,一个事务去update并提交了另外一个事务update还没提交的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了。

 

脏读

前提:假设一个前提,事务B更新之后,如果还没提交,那么事务A是可以读到的。

一个事务查询select了另外一个事务update或delete还没提交的事务的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了,或者你之前查询到的数据就没了。


不可复读

同一个事务进行多次读select 发现读到的数据是不一样的,不一样的原因是在多次读的期间有其他事务进行了修改(update delete) 并且进行了提交。

读取过程:事务1读锁A 事务2写锁 事务1读锁B


幻读

同一个事务进行多次读select发现读到的数据是不一样的,不一样的原因是在多次读的期间 有其他事务进行了增加数据(insert) 并且进行了提交。


读取未提交的锁机理:

写锁(行级共享锁,一次事务多次写,事务提交之前释放锁,每执行一次写就释放一次写锁,下一行语句执行前再加一个写锁)

读锁(行级共享锁,一次事务多次读,事务提交之前释放锁,每执行一次读就释放一次读锁,下一行语句执行前再加一个读锁)


读取已提交的锁机理:

写锁(行级排他锁,一次事务多次写,事务提交之后才释放写锁)(所以未提交读不到)

读锁(行级共享锁,一次事务多次读,事务提交之前释放锁,每执行一次读就释放一次读锁,下一行语句执行前再加一个读锁)

过滤掉脏读 脏写


可重复读的锁机理:

写锁(行级共享锁,一次事务多次写,每执行一次写就释放一次写锁,下一行语句执行前再加一个写锁)

读锁(行级排他锁,一次事务多次读,事务提交之后才释放要读数据的读锁)

(但锁住的是已有数据,幻读是新增数据,不是同一数据,此时的读锁和写锁不互斥)

过滤掉脏读 脏写 不可复读


可串行化的锁机理:

写锁(表级排它锁,一次事务多次写,事务提交之后才释放写锁)

读锁(表级共享锁,一次事务多次写,事务提交之后才释放读锁)

此时已不让事务并发了

过滤掉脏读 脏写 不可复读 幻读