为了账号安全,请及时绑定邮箱和手机立即绑定

java怎么控制多线程的事务??

java怎么控制多线程的事务??

DIEA 2019-02-18 02:04:20
就是几个线程的结果如果都成功了,就一起提交。如果有一个失败就全部回滚,并给出相关提示信息?网上没找到比较好的方案
查看完整描述

8 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

多个线程好解决,楼主想问的是不同进程怎么同步事务吧,比如多个dubbo服务。
确实有这个问题,首先有这样的技术,可以强一致,但效率牺牲太多,很少有公司这么干;大多数做法都是:服务A提交后,在某个东西(比如zookeeper)上记录节点;服务B提交后,记录另一个节点(这些节点都在表示本次事务的树枝节点下)……后续有个监听器类的东西,检查树枝节点下的节点数、状态等,如果有问题分别回滚或重试或人工干预等等……

查看完整回答
反对 回复 2019-03-01
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

数据库事务多线程比较麻烦,因为:

  1. 这会占用大量数据库连接;
  2. 不能用线程池,因为线程运行到最后必须等待协调,要么回滚要么提交。
查看完整回答
反对 回复 2019-03-01
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

在主方法new 一个InheritableThreadLocal 并设值为true,线程中如果出错则把值改为false。线程全部执行完之后,判断InheritableThreadLocal 的值,如果为false,你就手动抛出异常声明式回滚,或者自己写手动回滚。这样应该可以达到你的要求吧

查看完整回答
反对 回复 2019-03-01
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

CycleBarrier可能用得上。

查看完整回答
反对 回复 2019-03-01
?
aluckdog

TA贡献1847条经验 获得超7个赞

通过一个线程安全的标志状态来同步吧

查看完整回答
反对 回复 2019-03-01
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

CountDownLatch
加上一个封装 transaction 和 state 的 queue 每个线程执行时,去队列中拿一个事务,执行完finally 扔回去并 count() , 并设置state = true;
最后在主线程判断所有transaction 的state 都是true ,然后就全部提交

查看完整回答
反对 回复 2019-03-01
  • 8 回答
  • 0 关注
  • 1601 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号