悲观锁,乐观锁,快照隔离
悲观锁和乐观锁
可以举个例子:A进程和B进程同时在更新一个balance

A进程要对balance扣减20,B进程要对balance扣减15
如何保证balance更新准确?
加悲观锁
悲观锁悲观的认为很有可能会有冲突,所以我们要先加锁比较好
所有的进程/线程在更新前先加锁,加锁成功后再进行更新/提交
select balance from balance_table where user=A for update;
update balance_table set balance=balance-xxx;
commit;
加乐观锁
乐观锁乐观的认为,未必有冲突,即使冲突了,那我们提交失败重试一次嘛
但是乐观锁如何知道有冲突发生?这个就要靠version机制,在事物开始会获取version,在提交事务的时候会再次校验version
先更新,如果 更新,提交 后,发现与之前version不一致,那么说明有其他进程进行了操作,执行回滚
select version from balance_table where user=A ; --获取version但是不加锁
--得到version :2
update balance_table set balance=balance-xxx,version=version+1 where user=A and version=2; --更新的时候带version,如果version已经被修改,就不会更新成功
悲观锁和乐观锁的利弊
懒得写了,直接把别人的东西贴过来

快照隔离
快照隔离是怎么回事?
其实快照隔离跟乐观锁有点关联,快照隔离实际就是因为保存了多个更新版本,是的程序能够在并发操作的情况下获得自己想要的version
比如:
A程序是应用程序,对数据库数据不断的增删改查,B程序是统计程序,对数据进行静态分析,比如收支平衡
那么B程序肯定不希望读到一直变化的数据,但是现实情况是A程序就是在不断增删改查
如何保证B程序统计不受数据变动的影响呢? 我们可以增加version机制,更新数据库时保存多个version,统计程序在开始统计事务后,可以查询到固定的version,那么它获取的就是一个静态数据了。

浙公网安备 33010602011771号