Will.Jin 2022-03-25 11:07 采纳率: 0%
浏览 139
已结题

spring编程式事务在多线程下无法保证原子性,如何解决?

大家不要纠结我的例子 可能场景举例不好 主要看标题

问题遇到的现象和发生背景

场景:商品信息保存
方法:使用多线程将数据插入insert拆分成了线程池里一个个子线程进行(这些数据存在不同的表
问题:多线程下导致spring事务失效,子线程无事务管理。

我的解答思路和尝试过的方法

因为spring事务是由ThreadLocal来控制的,而开启子线程导致spring事务无法管理到子线程的操作。
查阅资料后,通过使用spring编程式事务 在主线程和子线程中分别开启事务,并通过同一个倒计时类对象CountDownLatch来分别阻塞主线程和子线程,最后通过回滚标识AtomicBoolean来判断是否需要统一提交事务或统一回滚事务。

但是又有一个新问题:这样操作可以保证事务的统一回滚或统一提交,然而提交/回滚还是通过各自线程进行操作,不能保证原子性,若发生宕机可能会导致部分线程提交/回滚失败的情况出现。

  • 写回答

4条回答 默认 最新

  • 於黾 2022-03-25 11:17
    关注

    如果你有100万条数据要写入数据库,要保证全部写入或全部回滚,那你老老实实放到一个事务里好了,别玩多线程。
    多线程里就应该放那些本身自成一个事务的逻辑
    多线程是为了解决单线程速度慢的问题,而你多线程之间还要互相等,那效率也没有提高啊,是在折腾啥呢

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月26日
  • 修改了问题 3月25日
  • 修改了问题 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物