JTA事务:如果发生异常但事务上没有调用回滚,会发生什么?
我们有一些第三方代码,其中他们执行以下
列表项
创建用户事务例如
txn = (UserTransaction)ctx.lookup( "UserTransaction" ); txn.begin();
将一些工作持久化到数据库(通过JPA)到MySQL数据库
txn.commit()
它们有异常块,但没有一个调用 txn.rollback
。 良好的编码实践表明,如果发生异常,他们需要调用回滚,但我的问题是 如果 txn 未提交,并且发生异常,那么不调用回滚会产生什么负面影响?
We have some third party code wherein they do the following
List item
Create a User Transaction e.g.
txn = (UserTransaction)ctx.lookup( "UserTransaction" ); txn.begin( );
Do some work persisting to the database (via JPA) to a MySQL database
txn.commit()
They have Exception blocks but NONE of them call txn.rollback
.
Good coding practice says they NEED to call rollback if an exception occurs but my question is
If the txn is not committed, and an exception occurs what is the negative effect of them NOT calling rollback?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
事务将保持活动状态,直到您
commit()
或rollback()
为止。它将继续持有锁,您可能最终会阻塞您的应用程序(实际上是数据库)。The transaction stays active, until you either
commit()
orrollback()
it. It will continue to hold locks and you may end up blocking your application (database, actually).IMO JTA 事务最终应该超时(基于设置或默认的 transactionTimeout)并且应该自动回滚。
IMO the JTA transaction should eventually timeout (based on the set or default transactionTimeout) and should automatically rollback.