Java -多线程事务无法完美实现吗

2023-12-14 16:42:24 +08:00
 RichardX2023

      如果遇到高耗时操作肯定首先想到的就是通过多线程来实现,但是如果再加上一层事务控制就比较难办。之前根据二阶段提交的思路实现了多线程事务的控制,感觉好像没问题了。

      但是最近遇到一个问题,看起来很无解。如果任务量少,需要使用的线程数量也少,这种场景通过二阶段提交实现多线程事务控制是没有问题的。

      但是如果任务量很多的情况下:线程池的池子内部线程数量是有限的,所以任务量再大,同时在运行的也只能是线程池容量大小的任务数。在这个前提下,二阶段提交是需要等所有线程一阶段执行结束后,进入二阶段,统一回滚或者提交,回滚或者提交都是需要在各自线程内部进行

      比如任务量是 20 个,线程池容量是 10 ,一次性只能有 10 个任务在执行,这个限制下,仅仅能实现 10 个任务的统一提交或者回滚。描述大概就这样,需要代码的话再贴

      看有没有别的思路,我卡住了。

3207 次点击
所在节点    Java
37 条回复
BuffDog
2023-12-14 16:49:23 +08:00
资源限制,1.要么排队处理,要么直接抛弃 2.扩大资源限制
菜鸟想法
janwarlen
2023-12-14 16:50:19 +08:00
通过 sql 手动开启事务和提交就可以了
RichardX2023
2023-12-14 16:51:15 +08:00
@janwarlen 确实是手动提交的,但是问题还是存在的
RichardX2023
2023-12-14 16:54:18 +08:00
@BuffDog 1 、排队,20 个任务,线程池只能处理 10 个处理结束后就得考虑提交或者回滚了,然后 10 个任务结束,继续下面 10 个任务。假如前 10 个任务提交,后 10 个需要回滚,前面 10 个任务的提交与后面的无法做到事务的一致性
RichardX2023
2023-12-14 17:05:03 +08:00
贴点代码看看
https://imgur.com/ElOAPtp
MakHoCheung
2023-12-14 17:13:17 +08:00
你是一个任务内部开启一个事务,为啥不是一个事务内执行这 20 个任务呢?
另外,看代码,线程池处理完 10 个任务后 CountDownLatch 不会放行啊
BuffDog
2023-12-14 17:26:46 +08:00
@RichardX2023 那你这堆有关联的任务,是不是得走在一个事务里
ppto
2023-12-14 17:41:36 +08:00
按我的理解,多线程事务 等同于 分布式事务 最后就是最终一致性。
BQsummer
2023-12-14 17:49:18 +08:00
@MakHoCheung spring 的事务信息是在 threadlocal 里的, 前 10 个任务不放行, 后 10 个任务就没线程取执行了; 释放了, 事务就没法提交或回滚了
RichardX2023
2023-12-14 18:19:18 +08:00
@BQsummer 是滴,目前我的观点看,二阶段提交无解
RichardX2023
2023-12-14 18:21:09 +08:00
@MakHoCheung 问题不是因为耗时吗,需要节省时间就需要多线程。多线程就得多事务
RichardX2023
2023-12-14 18:22:19 +08:00
@BuffDog 多个事务,只是需要协同控制一起提交和回滚
RichardX2023
2023-12-14 18:24:23 +08:00
@ppto 对的,我这个实现的思路就是来自 seata ,阿里的那个分布式事务服务。
BQsummer
2023-12-14 18:27:08 +08:00
不要用声明式事务, 自己管理, 比如 https://developer.aliyun.com/article/1203834
RichardX2023
2023-12-14 18:34:24 +08:00
找到个办法,完整代码
RichardX2023
2023-12-14 18:42:16 +08:00
好,我研究下,忘记还有这种方式了
RichardX2023
2023-12-14 18:42:52 +08:00
@BQsummer 好的,忘记还有这种方式了
MakHoCheung
2023-12-14 20:10:56 +08:00
@RichardX2023 哦,懂了,那就是相当于分布式事务
ZZ74
2023-12-14 20:19:54 +08:00
这和线程多少有什么关系?也不需要分布式事务。这一批任务无论多少,开多少线程,从头到尾只是用一个数据库连接。 开始时关闭自动提交,所有任务跑完 commit 一下就好了
jli100
2023-12-15 08:51:56 +08:00
@RichardX2023 问一下,你贴的这个完整代码,不是跟你上面贴的有问题的代码差不多嘛。具体差别是 ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1000408

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX