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

347 天前
 RichardX2023

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX