四种隔离级别的进化

以下4个隔离级别 并发一个比一个高

隔离:
事务4性acid的i , 隔离性Isolation
用适当破坏一致性Consistency 的方式提高并发

完全的一致性, 就是所有的事务排队,实在太慢了

排队,就一个队

太慢了怎么办?
a转b, c转d 2个事务完全可以并行!怎么做呢? 加排他锁!

SERIALIZABLE 可串行化

排他锁
相关事务无并发,一个个排队

但是可以更快
事务一共就4种关系, 读写2*2=4

happen-before:

读读 读写 写读 写写
读读是不会改变数据的, 即使读的是一个数据, 可以并行
所以可以单独弄个读锁 , 把排他锁拆成读写锁

读多写少, 大大提升了并行度!

REPEATABLE READ 可重复读

读读可并行,
但是读写不可并行.
一个事务A,先读,没释放读锁, 其他写的事务还在后面排队就不能来改这个数据,A在读这个数据和第一次读是一样的结果,就是可重复读了

同个事务 读同样的记录 结果一致


读锁没释放,不可写

现在是 读读 并行 其他几种happen-before关系都不能并行, 改进一下 让读写也并行:

READ COMMITED 已提交读

读的时候完全不加锁,没有读锁, 让读写也能并行, 前一个事务A在读, 没结束时候,B也可以改同一个资源

读的时候可以写
只有写写 写读不能并行


但是这样是不可重复读, 读完马上释放读锁, 2次读之间 可能有其他线程写了, 导致同一个线程读2次同个资源 竟然会结果不一样!

此时,可以并行的是
读读 读写
写读 写写 仍然要排队

下面让 写读 也行并行:

READ UNCOMMITED 未提交读

写的时候可以读
没提交就被看到了,脏读

只有写的串行的,但是可能读到没提交的数据

可串行化 可重复读 已提交读 未提交读 new快照读MVCC
完全的一致性 幻读 不可重复读 脏读 完全的一致性
排他锁 读写锁 写锁 写锁 没锁, 用事物ID
都排队 读读不排队 读读,读写不排队 只有写写要排队 都不用排队,发现有更新的事务在期间改了,本事务就回滚

实际用的MVCC(快照读)

show variabTes 1ike '%iso%';当前mysql数据库事务隔离级别

只有写写要排队,并行达到读未提交,甚至更高

但是实际上是MVCC
本质是: copy on write
缺点是: 实现复杂, 写写并行是乐观锁,如果写很多的情况下效率会低

1

效果能达到可序列化, 并行却高到读未提交

3

你可能感兴趣的:(四种隔离级别的进化)