事务是如何运作的
常见问题 > 使用 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 阶段,我们必须将收到的每个命令(发送消息或确认消息命令)写入持久性存储,以便我们可以正确地恢复。