首页 > 编程知识 正文

分布式事务代码实现,java事务管理的几种方式

时间:2023-05-05 12:43:00 阅读:37441 作者:2422

分布式事务(distributedtransactionprocessing,DTP )面向分布在不同位置的多个数据库,但必须提交或回退对数据库的所有操作如果其中一个数据库操作失败,则必须回滚参与事务的所有数据库。

例如,可以在tomcat上部署a服务,执行insert a,调用b和c接口,在weblogic上部署b服务,在Nginx上部署insert b,在Nginx上部署c服务,以及insert 如果当前正在运行a,并且在运行到insert c时更新失败,则分布式事务的要求是insert a和insert b回滚事务。

要在JAVA中处理分布式事务,必须使用JTA。 JTA需要web服务器来支持。 (加分: web服务器为什么有些开源是收费的,有些是好的,有些是坏的。 其中最重要的是事务的处理能力。 开源J2EE服务器在这一点上无法与商业APP应用服务器(如weblogic或webSphere )相比。 )

Open组织定义的分布式事务模型X/Open DTP模型(1994 )可以是APP应用程序(AP )、事务管理器(TM )、资源管理器(RM ) (即数据库)、通信资源管理器XA是在X/Open DTP中定义的事务管理器和数据库之间的接口规范或接口函数,事务管理器使用它来启动、退出、提交和执行数据库事务

XA接口规范使用两级提交协议“2-PC协议”完成一个全局事务,以确保同一事务中的所有数据库同时成功或回滚。

两阶段提交协议假设每个数据库点都有一个写头日志,并且每个写请求都在实际执行写操作之前记录日志。

两个阶段的提交需要中间协调人。 在Java中,只有JTA可以支持两级提交,但该中间协调员是J2EE APP应用程序服务器。

两个阶段:

1、准备阶段。 在每个数据库运行INSERT后,J2EE APP应用服务器将收到提交指示,并通知每个数据库在此时准备事务提交。 数据库收到响应后,进行准备工作,基本上是提前提交工作,如果可以提交,则响应J2EE APP应用服务器即可正常提交,如果不能提交,则响应J2EE APP应用服务器也无法提交。

2、J2EE APP应用服务器在收集所有响应后进行判断,如果第一阶段收到的信息都可以提交,则通知所有数据库进行提交; 如果在第一个阶段收到的信息之一无法提交,请通知所有数据库进行回滚操作。

以下版本的说明是从wdwbw's blog转发的。

第一阶段是提出要求的阶段(Commit-request phase ) :

1 .事务管理器向所有数据库发送查询到提交消息请求,并开始等待响应

2 .如果数据库可以提交属于它的事务分支,它将固定记录自己在该事务分支中执行的操作(在还原日志和重做日志中逐个记录)。

3 .数据库均响应是否同意提交的响应。

第二阶段是提交阶段(Commit phase ) :

如果事务管理器收到的所有响应都是协议

1 .事务管理器记录日志并将commit消息请求发送到所有数据库

2 .每个数据库执行操作并释放与该事务相关的所有锁定和资源

3 .每个数据库回复事务管理器

4 .收到所有回复后,事务管理器将终止当前事务

如果事务管理器收到的任何响应都是abort,则为、

1 .事务管理器记录日志并将回滚消息请求发送到所有数据库

2 .每个数据库执行还原操作,并释放与该事务相关的所有锁定和资源

3 .每个数据库回复事务管理器

4 .收到所有回复后,事务管理器将终止当前事务

其他(处理未决事务)上述第一阶段完成后,参与者服务器停机,无法再收到提交第二阶段或回退事务的请求。 此时,参与者的本地事务处于未解决状态(in-doubt )。 分布式事务重新启动后,参与者向所有本地未决事务高级发送查询请求,获取每个事务的最终结果(提交还是中止),得到明确的答复并提交或回退本地事务

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。