可以举个例子: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程序是统计程序,对数据进行静态分析,比如收支平衡