当使用多个资源合作解决一个问题的时候,必须使这些资源在一个事务中进行合作。为了实现这一目的,将事务分为两个阶段进行:
第一阶段开始时,向此事务涉及到的全部资源发送提交前信息。此时,事务涉及到的资源还有最后一次机会来回滚事务。如果任意一个资源决定回滚事务,那么整个事务将被取消。否则,事务会被提交。
第二阶段只是在第一阶段没有回滚时才会发生。在这个阶段,所有的能被定位和单独控制的资源都将真正的更新。
事务被分割成两个阶段来完成,这被称为两阶段提交协议。如果程序在同一个操作中需要访问多种资源,您就要使用两阶段提交事务。例如,如果从 JMS 队列中删除一个消息,并且随后更新数据库中基于这条消息的纪录,这时,要保证这两个操作的原子性。不应该出现一条消息已经从队列中被删除,而系统没有更新与此消息相关的数据库中的纪录的情况。可以通过应用程序的代码在数据库更新失败的时候 "撤销"对队列的操作。但是这样做并不还,因为当程序在执行“撤销”操作的过程中服务器突然崩溃的话就会导致数据出现不一致。作为替代的方式,应该使用两阶段提交事务。