从锁的角度深刻理解 事务的隔离级别和并发带来的问题
事务的隔离级别:
读取未提交
读取已提交
可重复读
可串行化
并发带来的问题:
脏读 脏写 不可复读 幻读
脏写
脏写,一个事务去update并提交了另外一个事务update还没提交的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了。
脏读
前提:假设一个前提,事务B更新之后,如果还没提交,那么事务A是可以读到的。
一个事务查询select了另外一个事务update或delete还没提交的事务的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了,或者你之前查询到的数据就没了。
不可复读
同一个事务进行多次读select 发现读到的数据是不一样的,不一样的原因是在多次读的期间有其他事务进行了修改(update delete) 并且进行了提交。
读取过程:事务1读锁A 事务2写锁 事务1读锁B
幻读
同一个事务进行多次读select发现读到的数据是不一样的,不一样的原因是在多次读的期间 有其他事务进行了增加数据(insert) 并且进行了提交。
读取未提交的锁机理:
写锁(行级共享锁,一次事务多次写,事务提交之前释放锁,每执行一次写就释放一次写锁,下一行语句执行前再加一个写锁)
读锁(行级共享锁,一次事务多次读,事务提交之前释放锁,每执行一次读就释放一次读锁,下一行语句执行前再加一个读锁)
读取已提交的锁机理:
写锁(行级排他锁,一次事务多次写,事务提交之后才释放写锁)(所以未提交读不到)
读锁(行级共享锁,一次事务多次读,事务提交之前释放锁,每执行一次读就释放一次读锁,下一行语句执行前再加一个读锁)
过滤掉脏读 脏写
可重复读的锁机理:
写锁(行级共享锁,一次事务多次写,每执行一次写就释放一次写锁,下一行语句执行前再加一个写锁)
读锁(行级排他锁,一次事务多次读,事务提交之后才释放要读数据的读锁)
(但锁住的是已有数据,幻读是新增数据,不是同一数据,此时的读锁和写锁不互斥)
过滤掉脏读 脏写 不可复读
可串行化的锁机理:
写锁(表级排它锁,一次事务多次写,事务提交之后才释放写锁)
读锁(表级共享锁,一次事务多次写,事务提交之后才释放读锁)
此时已不让事务并发了
过滤掉脏读 脏写 不可复读 幻读