4
回答
事务太大有什么问题吗?声明式事务可以手动commit吗?
开发十年,就只剩下这套Java开发体系了   

后台有个批次作业,最多可能几百行的数据要处理吧,每行数据增删改7、8条sql语句的样子。现在就只用了@Transactional一个注解在service上。

会不会有什么隐患啊?万一来几千几万行数据,都在一个事务里,会出什么问题吗?

另外我想在service里,手动commit会不会好一点,但是没找到spring如何两种事务方式一起使用

举报
共有4个答案 最后回答: 4年前
PHP+mysql的路过,这个以我mysql的认识可能会然重做日志太大。
其实真有必要在一个事务吗--也就是同时完成吗?
有些场景可以分多步做的,例如一个转账功能,我扣a的钱,延迟一段时间再把钱转入b账户,是可以得。
把一个事情分成几步来做,通过任务队列来保证所有的事都会被做,对于一些不在意原子性的场景可以考虑下。
--- 共有 2 条评论 ---
聽雨人回复 @一只小桃子喵__ : 我刚才没看清楚,原来是批次作业,我们这边的话批次作业也是一个一个调用业务接口的,事务什么的是业务接口的事不是批次作业的事。 4年前 回复
一只小桃子额就我一个人,还搞任务队列,肯定不现实。所以我想,循环一条就commit一下,这样可好? 4年前 回复
每次查一定数量的数据来处理不行么?为何所有的都在一个事务里
--- 共有 4 条评论 ---
首席撸出血@大菲狼吃桃子 每一条一个事务,弄个线程池做吧,快一点,单线程太慢 4年前 回复
一只小桃子回复 @首席撸不射 : 就是每条一个事务嘛,这样还不好就没办法了 4年前 回复
首席撸出血@一只小桃子喵__ 一旦数据有错,得回退咋办?不应该每步把,而是每条数据的操作用新的事务,但是这些还是不怎好 4年前 回复
一只小桃子因为图简单,就写了几个方法啊,就在service头上加了个@Transactional啊。我现在把方法拆开,在每步独立的方法上启用新事务应该没问题吧 4年前 回复

你的想法有点不靠谱,

事务中是不宜操纵太多数据的,

这样会严重影响数据库的性能, 因为会锁住表或者记录太长时间.

--- 共有 6 条评论 ---
首席撸出血@甘薯 好吧,我意思不明确,我意思是用范围的话,确保数据安全的情况下,还不如一条一个事务 4年前 回复
甘薯回复 @首席撸不射 : 这不是很容易理解吗?事务涉及到的任何数据不管是哪一个出错整个事务都必须回滚, 所以说事务的范围很重要. 4年前 回复
首席撸出血回复 @甘薯 : 一旦某条数据出现问题,那么那个事务里的所有数据不都回滚了么,这样的结果还有意义? 4年前 回复
甘薯回复 @大菲狼吃桃子 : 使用事务是为了保证业务的完整性, 首先确定你的事务涉及到的必要的数据范围, 就在这个数据范围内你启动事务操作就行, 别管多少条 4年前 回复
一只小桃子反正是半夜跑,或者晚上跑 4年前 回复
我也有这样的场景,在半夜通过定时器跑,反正我是没出过什么问题,我觉得不用spring的事务管理也可以,更新一条,commit一次
--- 共有 1 条评论 ---
一只小桃子我现在把一组操作放到一个方法里,注解成@Transactional(propagation = Propagation.REQUIRES_NEW),spring会把当前的事务挂起来,再拿一个connection去做这组操作,应该是问题不大了 4年前 回复
顶部