【EAS后台事务】后台事务失败问题--Can't commit, because No Transaction原创
金蝶云社区-汪伟康
汪伟康
13人赞赏了该文章 103次浏览 未经作者许可,禁止转载编辑于2024年10月14日 10:52:04

问题表现:后台事务执行大概1小时变为失败状态,报错堆栈关键信息为:

Caused by: java.lang.IllegalStateException: Can't commit, because No Transaction
at com.apusic.transaction.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:215)
at com.apusic.ejb.container.Container.postInvokeTx(Container.java:2064)
... 16 more
Caused by: org.omg.CosTransactions.NoTransaction: IDL:omg.org/CosTransactions/NoTransaction:1.0
at com.apusic.transaction.ots.TransactionCurrent.commit(TransactionCurrent.java:210)
at com.apusic.transaction.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:209)
... 17 more


案例截图

image.png


原因分析:上述报错是由于当前事务超过了框架限制默认事务超时时间1小时导致。



解决建议

思路:需要对应开发从代码层面去分析事务超时原因,优化代码/sql减小单个事务的持续时间。


举例:如后台事务中时调用的facade方法。

1、将当前facade1的事务属性定义为ReuiredNew

2、新增一个facade2,事务属性定义为NOSUPPORTS

3、然后facade2的方法中分批循环调用facade1的方法,那么还需要把原来facade1中的代码做修改为单批处理。

4、后台事务中配置修改为facade2。


这样保证每次循环调用facade2方法都是在一个新的事务中,只要facade2中事务不超时即可



-------------------------------------

实在没办法再来考虑修改框架的事务容器超时时间限制:

image.png

图标赞 13
13人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!