我有一个带有 JMS 和 JPA 的 Java SE(!) 场景,我可能需要分布式事务以及“常规”JDBC 事务。我必须收听发送服务请求的队列,在接收时保留日志,处理请求并在处理请求后更新日志。仅当请求已成功处理时,消息才会被确认。
第一个想法是只使用 JTA(由 Bitronix 提供)。但是我面临两个问题:
- 如果无法处理请求,则不会保留任何日志
- 如果无法更新日志(不太可能但有可能),则不会处理请求
因此,另一个想法是使用常规 JDBC 事务创建和更新日志。只有请求事务的实体管理器会加入用户事务,而创建和更新日志的实体管理器会直接提交。
是否可以在单个持久性单元上“混合”JTA 和 JPA?或者我们是否已经有了用于这些类型的 JMS 和 JDBC 事务的模式?
最佳答案
我实际上用稍微不同的方法解决了我的问题。我没有“混合”JTA 和 JDBC 事务,而是使用suspend 和resume 来处理不同的用户事务。
任务仍然相同:我启动一个 (JTA) 用户事务,其中包含一些 JMS 和 JDBC 事务(接收消息、执行一些数据库操作)。在该工作流程的中间,我想写一个消息日志,但当“外部”事务失败时,该日志记录不应回滚。
所以解决方案是,在伪代码中:
transactionManager.begin()
doSomeJdbcStuff();
Transaction main = transactionManager.suspend();
// do the logging
transactionManager.begin() // <- now a new transaction is created and active!
doSomeLogging();
transactionManager.commit()
// continue
transactionManager.resume(main);
doSomeMoreJdbcStuff();
transactionManager.commit();
关于java - 混合 JTA 和 JDBC 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056872/