以下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
缺点是: 实现复杂, 写写并行是乐观锁,如果写很多的情况下效率会低