日期:2014-05-19  浏览次数:20612 次

乐观锁的问题
当数据库事务隔离模式是“读已提交时” 乐观锁(假设用时间戳实现)确实可以在一定程度上避免“丢失更新” 但是在高并发的场景下感觉还是可能会有点问题 例如A和B同时读取了一个表单进行修改,在多线程的情况下,会有这种情况,A通过了时间戳验证,但还没有真正提交事务,B此时如果进行时间戳校验也是可以通过验证的,也会存在B的更新把A的覆盖的现象,在一些文章中看到乐观锁假设事务会互补影响,这个假设成立吗?


欢迎拍砖!!!!

------解决方案--------------------
你说的是“READ COMMITTED”吧?

这个是指A读取数据时对记录添加共享锁,但读取结束立即释放。另一个B对这个记录的试图修改会一直等待直到A中的读取过程结束,而不需要整个A的结束。所以,在A的不同阶段对同一记录的读取结果可能是不同的。
 
也就意味着可能发生:不可重复读。也就是你说的“感觉还是可能会有点问题”


这个问题说白了很简单,就是如果两个线程同时执行类似于:
Select num --> i
i = i + 1;
Update num = i;
这种过程的时候,则可能发生数据覆盖。也就是你说的“也会存在B的更新把A的覆盖的现象”

避免的方法两种:
1、计算下推数据库,也就是直接把+1的运算让数据库来负责,三步操作合并为: Update num = num + 1
2、Select 的时候,升级锁,常用招数是: For Update


不知道我这么说你能理解不。。。