spring分布式事务学习笔记

最近项目中使用了分布式事务,本文及接下来两篇文章总结一下在项目中学到的知识。

分布式事务对性能有一定的影响,所以不是最佳的解决方案,能通过设计避免最好尽量避免。

分布式事务(Distributed transactions),也称作XA事务(XA是一个协议的名字),在spring中被称作global transaction,是指一个事务会涉及到不同的事务资源,比如不同的数据库,消息队列。事务资源都支持commit和rollback这样的事务控制命令。

按是否需要实现完整javaEE功能的应用服务器,可以将实现XA事务的方法分为两种:

1.一般情况下,XA事务是通过javaEE应用服务器实现的,即CMT(Container Managed Transaction)。应用服务器实现了JTA(Java Transaction API),应用通过JNDI获取应用服务器的JTA UserTransaction。JTA的api比较复杂,开发者需要研究较多JTA的细节,使用spring事务管理可以简化JTA的编程模型。但是这样还是需要依赖实现了对应javaEE功能的应用服务器。

2.不需要应用服务器(standalone),或者只需要轻量级的应用服务器,例如tomcat,tomcat没有实现所有的javaEE功能。在应用中加上支持jta的第三方包,例如atomikos,JOTM等。

分布式事务的结构如图所示:

图中,1表示APP与资源管理器RM之间的接口,是资源管理器的本地接口或者XA接口。如果使用事务管理器TM来管理分布式事务,
则不需要app直接调用rm,即1接口不会使用。
2表示app与TM的接口,即UserTransaction,这个接口和普通的事务管理接口类似,是一个有提交和回滚等操作的接口。使用该接口,就像事务只处理一个数据源一样。app通过该接口控制事务的提交或回滚。
3是TM与RM之间的接口,是一个两阶段提交(2 phase commit)的过程,两阶段提交简单的说就是一个数据源的事务要提交两次才算真正提交。该操作由TM控制,app不直接调用接口3。

之后两篇文章将分别介绍使用spring+hibernate+atomikos+tomcat实现分布式事务以及使用spring+mybatis+atomikos+tomcat实现分布式事务。

参考文献:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#transaction

http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

http://www.javaworld.com/article/2076126/java-se/transaction-management-under-j2ee-1-2.html

http://www.javaworld.com/article/2077714/java-web-development/xa-transactions-using-spring.html

原文地址:https://www.cnblogs.com/rain-in-sun/p/4309549.html