事务的一阶段提交协议和二阶段提交协议

    由于事务须要实现ACID,即原子性、一致性、隔离性、持久性,所以须要採用一定的机制来保证,通常採用的是分阶段提交的方式。

 

    XA:XA协议。规定事务管理器和资源管理器接口。採用二阶段提交协议。

一阶段提交协议

    一阶段提交协议相对简单。例如以下图:

    

    当然,前提是开启了事务,然后在应用程序发出提交/回滚请求后,数据库运行操作,而后将成功/失败返回给应用程序。程序继续运行。

    一阶段提交协议相对简单。简单带来的长处就是,它不用再与其它的对象交互。节省了推断步骤和时间,所以在性能上是在阶段提交协议中对好的。

二阶段提交协议

    一阶段提交协议有其长处,但缺点也非常明显:

 

  • 数据库确认运行事务的时间较长。出问题的可能性就随之增大。
  • 假设有多个数据源,一阶段提交协议无法协调他们之间的关系。

     

 

   所以在一阶段协议的基础上。有了二阶段协议,二阶段协议的优点是加入了一个管理者角色,例如以下:

    

    非常明显。二阶段协议通过将两层变为三层。添加了中间的管理者角色,从而协调多个数据源之间的关系,二阶段提交协议分为两个阶段。

    第一阶段

    

    应用程序调用了事务管理器的提交方法。此后第一阶段分为两个步骤:

 

  • 事务管理器通知參与该事务的各个资源管理器。通知他们開始准备事务。
  • 资源管理器接收到消息后開始准备阶段,写好事务日志并运行事务,但不提交,然后将是否就绪的消息返回给事务管理器(此时已经将事务的大部分事情做完,以后的内容耗时极小)。

     

 

    第二阶段

    

    第二阶段也分为两个步骤:    

 

  • 事务管理器在接受各个消息后,開始分析,假设有随意其一失败。则发送回滚命令,否则发送提交命令。
  • 各个资源管理器接收到命令后,运行(耗时非常少)。并将提交消息返回给事务管理器。

     

    事务管理器接受消息后。事务结束。应用程序继续运行。
    为什么要分两步运行?一是由于分两步。就有了事务管理器统一管理的机会;二尽可能晚地提交事务,让事务在提交前尽可能地完毕全部能完毕的工作,这样。最后的提交阶段将是耗时极短。耗时极短意味着操作失败的可能性也就减少。
    同一时候。二阶段提交协议为了保证事务的一致性,无论是事务管理器还是各个资源管理器。每运行一步操作。都会记录日志,为出现问题后的恢复准备根据。
    二阶段提交协议的存在的弊端是堵塞,由于事务管理器要收集各个资源管理器的响应消息,假设当中一个或多个一直不返回消息,则事务管理器一直等待,应用程序也被堵塞,甚至可能永久堵塞。

事务与协议

    那么本地事务和分布式事务,分别採用的是哪些协议?我在RedBooks的一个文档中看到的是:
Global transactions
    Although the XAResource interface is intended to support two phase commit, the specification does not force an adapter to support two phase commit. However, if the resource adapter does implement XAResource it must also implement support for one phase commit. This allows the transaction manager to do one phase commit optimization (explained later) by setting the onePhase flag to true when doing acommit.……
Local transactions
    A local transaction is managed by the resource manager without the need for an 
external transaction manager, and can be utilized when only one resource is 
involved. Local transactions only support one phase commit, because they only 
reference one EIS.……
    大意是:尽管实现XA接口的目的是为了支持二阶段提交协议,可是它也支持一阶段提交协议。 本地事务仅仅支持一阶段提交。分布式事务默认採用的是二阶段提交。假设在分布式事务中非得使用一阶段提交协议。那么仅仅要数据源多余一个就会抛出异常。假设仅仅有一个数据源则正确运行。

总结

    一阶段提交协议和二阶段提交协议仅仅是比較经常使用的两个,此外还有其它协议,可自行研究。
 
转自:http://www.cnblogs.com/blfshiye/p/5207901.html

猜你喜欢

转载自shuzheng5201314.iteye.com/blog/2345093