出于同样的原因,JTA 是单线程的。关于如何/何时安排线程运行没有任何硬性保证。此外,如果没有同步,则无法保证线程何时完成其工作。鉴于这些限制,很难在保持并行处理优势的同时创建事务保证。
例如,如果我生成一个事务,然后生成一个在该事务上发送消息的线程,但在主线程中任意提交事务,事务管理器应该做什么(忽略commit()
?失败send()
?)。如果我还有其他尚未完成的事务性工作(数据库提交),但我的消息发送线程已完成并已调用,该commit()
怎么办?2-Phase-Commit
如果在 TransactionManager 尝试确定所有事务参与者的状态时线程启动并开始更多工作怎么办?
事务 API 都基于定义明确的工作单元。当工作单元在单个线程中运行时,这些 API 非常清晰。否则事情会变得复杂,并被 Java EE 规范未解决的实现所涵盖。这些事务管理器允许嵌套事务和/或跨越多个线程的事务。这些实现使用非常精心设计的同步,具有有限的用例,并且很可能最终会序列化工作。
对于大多数用户来说,JMS 的主要好处类似于任何基于消息的参与者系统。许多离散的步骤可以拉取队列中的消息,处理它们,通过将结果放在另一个队列中前进到下一步。如果任何步骤成为瓶颈,您可以添加更多处理代理(MDB、spring bean 等)。每个代理在单个线程上进行处理,您可以通过创建更多代理扩展到多个核心。