前段时间发现对分布式事务了解的不够清晰,最近又重新看了一下分布式事务,简单做个记录,以后方便查看
Java规范对分布式事务定义了标准的规范Java事务API和Java事务服务,分别是JTA和JTS
一个分布式事务必须包括一个事务管理器和多个资源管理器,
资源管理器是任意类型的持久化数据存储,而事务管理器则是承担着所有事务参与单元者的相互通讯的责任
JTA的规范制定了分布式事务的实现的整套流程框架,定义了各个接口且只有接口,而实现分别交给事务管理器的实现方和资源管理器的实现方
对于资源管理器而言,主要包括数据库连接,JMS等,还有很多了解的不清楚
对于事务管理器而言,从网上了解主要是应用服务器,包括JBOSS,WEBLOGIC等应用服务器,也就是说事务管理器的实现方是应用服务器,用来管理事务的通讯和协调
对于大多数谈的数据库了解,事务管理器需要从数据库获得XAConnection , XAResource等对象,而这些对象是数据库驱动程序需要提供的
所以如果要实现分布式事务还必须有支持分布式事务的数据库服务器以及数据库驱动程序
对Mysql而言,在mysql5.0以上的版本已经支持了分布式事务,另外常用的mysql-connector-java-5.1.25-bin.jar也是支持分布式事务的
可以在jar包的com.mysql.jdbc.jdbc2.optional中找到XA对象的实现
上面介绍了事务管理器和资源管理器的实现方式,在学习研究过程中发现对于事务管理器,特别强调了tomcat等服务器是不支持的,这句话的意思应该是在tomcat容器内
并没有分布式事务管理器的实现对象。而在JBOSS或者WEBLOGIC等商业服务器应该内置了分布式事务管理器的实现对象,应用程序可以通过JNDI方式获取UserTransaction
和TransactionManager等分布式事务环境中所需要用到的对象
事务管理器作为管理和协调分布式事务的关键处理中心非常重要,所以应用服务器可以单独只用过事务管理器。
上图具体文章链接为http://blog.youkuaiyun.com/xiaol_zhong/article/details/7983863
上面主要是一些基本的概念,在学习研究中总结出来的,可能不太全面,下面主要介绍一下在使用Spring使用分布式事务中的心得,这种做法也是将事务管理器嵌入应用中。
开始准备Spring的时候,网上介绍了Jotm以及Atomikos等工具,实际上这些工具都是取代应用服务器对事务管理器的支持,负责实现事务管理器对象
Jotm需要使用特定数据库连接池enhydra,而且网上说因为维护时间久远,问题不少,所以直接使用Atomikos进行测试
在Maven上下载了Atomikos的3.9.0版本的相关需要jar包。主要包括
atomikos-util-3.9.0.jar transactions-3.9.0.jar transactions-api-3.9.0.jar transactions-jdbc-3.9.0.jar transactions-jta-3.9.0.jar jta-1.1.jar
下面看一下主要的配置文件的配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="