我读过关于TransactionAttributeType.REQUIRED
的内容
如果客户在事务中运行并调用企业bean的方法,则该方法在客户的事务中执行。如果客户端未与事务关联,则容器在运行该方法之前启动新事务。
客户端是部署在服务器A上的EJB应用程序,它调用事务中部署在另一个服务器B上的另一个bean的方法methodB
。如果methodB
具有TransactionAttributeType.REQUIRED
,则它将在与客户端应用程序启动的事务相同的事务下运行。对?
如果是,那么部署在不同服务器上的应用程序如何知道在另一台服务器上启动的事务?
如果否,那么methodB
如何使用同一事务?
我对EJB有点陌生,所以请对我轻松一点。
任何指向正确方向的指针都将受到高度赞赏。
最佳答案
如果服务器A上的客户端已开始事务,则事务上下文将传播到带有TransactionAttributeType.REQUIRED
注释的Bean中。这是调用的一部分。
因此,第一个问题的答案是肯定的:服务器B中的methodB
由服务器A上的EJB应用程序调用,并在同一事务中运行。最终的commit
或rollback
由服务器A上运行的客户端控制。
服务器A上的客户端也可以在同一事务中加入其他XA资源:例如,它写入XA数据源并使用XA JMS发送消息。然后,事务上的commit
保留由methodB
引起的更改,它将把该行写入数据库,并且消息在队列中。如果客户端执行rollback
,则将回滚所有工作单元(并且没有任何更改)。
相关:Two-phase commit protocol (Wikipedia)
关于java - 关于交易属性需要澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17978509/