社区
Java EE
帖子详情
乐观锁的问题
love19861018
2012-06-27 11:11:52
当数据库事务隔离模式是“读已提交时” 乐观锁(假设用时间戳实现)确实可以在一定程度上避免“丢失更新” 但是在高并发的场景下感觉还是可能会有点问题 例如A和B同时读取了一个表单进行修改,在多线程的情况下,会有这种情况,A通过了时间戳验证,但还没有真正提交事务,B此时如果进行时间戳校验也是可以通过验证的,也会存在B的更新把A的覆盖的现象,在一些文章中看到乐观锁假设事务会互补影响,这个假设成立吗?
欢迎拍砖!!!!
...全文
262
5
打赏
收藏
乐观锁的问题
当数据库事务隔离模式是“读已提交时” 乐观锁(假设用时间戳实现)确实可以在一定程度上避免“丢失更新” 但是在高并发的场景下感觉还是可能会有点问题 例如A和B同时读取了一个表单进行修改,在多线程的情况下,会有这种情况,A通过了时间戳验证,但还没有真正提交事务,B此时如果进行时间戳校验也是可以通过验证的,也会存在B的更新把A的覆盖的现象,在一些文章中看到乐观锁假设事务会互补影响,这个假设成立吗? 欢迎拍砖!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
love19861018
2012-07-04
打赏
举报
回复
[Quote=引用 3 楼 的回复:]
Select For Update 是行锁,如果能确定的只操作一行,就不会互相影响。
不过首选还是运算操作下推数据库,这种最安全可靠。
建议把场景描述下,再具体讨论。
[/Quote]
最后决定如下模式了:
1:实现一个主键锁
2:更新单据的时候采用如下逻辑:这样即兼顾了效率,又保证的业务数据的正确
if(申请主键锁){
if(校验时间戳){
更新数据
}
}
MiceRice
2012-06-28
打赏
举报
回复
Select For Update 是行锁,如果能确定的只操作一行,就不会互相影响。
不过首选还是运算操作下推数据库,这种最安全可靠。
建议把场景描述下,再具体讨论。
love19861018
2012-06-28
打赏
举报
回复
[Quote=引用楼主 的回复:]
当数据库事务隔离模式是“读已提交时” 乐观锁(假设用时间戳实现)确实可以在一定程度上避免“丢失更新” 但是在高并发的场景下感觉还是可能会有点问题 例如A和B同时读取了一个表单进行修改,在多线程的情况下,会有这种情况,A通过了时间戳验证,但还没有真正提交事务,B此时如果进行时间戳校验也是可以通过验证的,也会存在B的更新把A的覆盖的现象,在一些文章中看到乐观锁假设事务会互补影响,这个假设成立吗?
……
[/Quote]
2、Select 的时候,升级锁,常用招数是: For Update
这种模式是用数据库的悲观锁 高并发的场景会影响系统性能
现在我的实现思路大概是:读取数据的时候不会加悲观锁 因为这样会影响性能,点击保存的时候先用乐观锁 也就是时间戳通过验证之后 再用悲观锁住本单据的主键 如果获取锁成功 将数据提交到数据库进行更新 然后释放悲观锁
MiceRice
2012-06-28
打赏
举报
回复
你说的是“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
不知道我这么说你能理解不。。。
java中的CAS
乐观锁
概念以及CAS的
问题
;如何解决
乐观锁
ABA
问题
本文详细介绍了
乐观锁
与悲观锁的概念,以Java的synchronized和CAS(Compare and Swap)为例阐述了两者的区别。
乐观锁
在并发控制中通过版本号避免ABA
问题
,而AtomicStampedReference类提供了解决ABA
问题
的方案。文章通过实例展示了ABA
问题
可能导致的数据丢失风险,并演示了AtomicStampedReference如何防止这种情况发生。
乐观锁
和悲观锁,java中解决
乐观锁
经典ABA
问题
本文探讨了在高并发场景下,如何使用
乐观锁
解决线程安全
问题
,特别是在读多写少的情况下。通过对比悲观锁,介绍了
乐观锁
在数据库中的应用,并深入分析了ABA
问题
及其解决方案。使用AtomicStampedReference类避免ABA
问题
,提供了一个具体的Java代码示例。
Mysql如何利用
乐观锁
解决高并发
问题
本文介绍了如何利用Mysql的
乐观锁
机制解决高并发
问题
,通过案例解释并发导致的
问题
,并详细阐述了
乐观锁
的原理和实现,包括版本号的使用以及代码示例。在总结中指出,虽然版本号方法不适用于所有场景,但在特定条件下能有效防止并发冲突。
3.4
乐观锁
解决超卖
问题
博客围绕
乐观锁
解决超卖
问题
展开,介绍了两种修改代码方案。还阐述了
乐观锁
与CAS机制,包括CAS原理、在
乐观锁
中的应用、优缺点及在Java中的实现。指出CAS适用于低冲突场景,虽能提高并发性能,但存在ABA
问题
和高冲突性能瓶颈。
乐观锁
,CAS,ABA
问题
本文探讨了
乐观锁
与悲观锁的区别,强调了
乐观锁
在并发控制中的应用。详细介绍了CAS(Compare and Swap)操作的工作原理,并讨论了由于CAS可能导致的ABA
问题
及其解决方案。同时,文章还涉及了自旋锁、读写锁和可重入锁的概念,以及Java中的synchronized锁的多种状态,如无锁、偏向锁、轻量级锁和重量级锁。
Java EE
67,535
社区成员
225,844
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章