事务是如何运作的

 常见问题 > 使用 Apache ActiveMQ Classic > 事务是如何运作的

ActiveMQ Classic 中有两个级别的交易支持

  • JMS 事务 - Session 上的 commit()/rollback() 方法(类似于对 JDBC 连接执行 commit()/rollback()
  • XA 事务 - 其中 XASession 充当 XAResource,通过与消息代理进行通信,就像 JDBC 连接在 XA 事务中通过与数据库进行通信一样。

它们都以类似的方式实现。当在事务性(或 XA 事务性)会话上执行操作时,会将事务命令发送到代理,其中包含一个唯一的交易 ID,然后是所有通常的命令(发送消息、确认消息等)。当在 Session 上调用 commit()rollback() 时,此命令将发送到代理,以便它提交或回滚事务。

现在,在事务内部对事务性会话执行的操作,例如发送消息或确认消息,在提交发生之前不会真正执行真正的发送或确认。因此,代理会明确地分别处理这些情况 - 本质上是缓冲命令,直到提交发生时真正发送或确认消息。

ActiveMQ Classic 使用 TransactionStore(由所有持久性适配器实现)来处理事务。TransactionStore 将缓存所有消息和 ACK,直到提交或回滚发生。除了存储消息之外,代理还会阻止发送任何消息,直到会话提交。如果你想查看代码,可以查看 MemoryTransactionStore,它为内存和 JDBC 持久性适配器代理事务。唯一与 XA 事务的真正区别在于,在 PREPARE 阶段,我们必须将收到的每个命令(发送消息或确认消息命令)写入持久性存储,以便我们可以正确地恢复。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。