SpringBoot中使用Atomikos统一处理分布式事务(入门Demo)

环境:JDK1.8、MAVEN 3.6.1、eclipse

什么是Atomikos?

个人理解:atomikos是一个可以在一个事务中调用多个数据库并实现不同的数据库之间的操作,对数据库的操作进行统一的事务处理,如果出现异常可以统一回滚,是一个高效的分布式事务处理工具!

1.添加Atomikos依赖

当前的`pom文件:

   <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.22.RELEASE</version>
		<relativePath />
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jta-atomikos</artifactId>
		</dependency>
		<!-- 添加mysql的驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- junit配置 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

2.编写Atomikos配置类

当前的AtomikosConfig类内容如下:

   /**
	 * @description 创建数据源,通过setUniqueResourceName设置当前数据源的唯一名称
	 * 可以配置多个数据源
	 */
	@Bean
	public AtomikosDataSourceBean getAtomikosDataSourceBean() {
		AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
		ds.setUniqueResourceName("mysql");// 设置当前数据源的唯一名称
		// 设置XADataSource,当前填写的类必须是实现了XADataSource接口的类
		ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
		// 设置配置
		Properties p = new Properties();
		p.setProperty("user", "root");
		p.setProperty("password", "root");
		p.setProperty("url", "jdbc:mysql://localhost:3306/test");
		ds.setXaProperties(p);
		ds.setPoolSize(5);
		return ds;
	}

	/**
	 * @description 创建事务管理
	 */
	@Bean
	public UserTransactionManager getTransactionManager() {
		UserTransactionManager userTxManager = new UserTransactionManager();
		return userTxManager;
	}

3.编写入口类

当前的Application类的内容:

/**
 * @description 使用SpringBoot操作atomikos
 * @author hy
 * @date 2019-08-14
 */
@RestController
@SpringBootApplication
public class Application {
	@Autowired
	AtomikosDataSourceBean mysqlDataSourceBean;

	@Autowired
	UserTransactionManager txManager;

	/**
	 * @description 测试连接是否正常
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/testConnection")
	public String testConnection() throws SQLException {
		Connection connection = mysqlDataSourceBean.getConnection();
		System.out.println("connection:" + connection);
		System.out.println("开启连接。。。。。");
		connection.close();
		System.out.println("关闭数据连接。。。。");
		return "【測試成功!】";// UserTransactionManager
	}

	/**
	 * @description 测试事务管理
	 * @return 
	 * @throws Exception 异常,开启事务的错误和其他错误,。。。
	 */
	@RequestMapping("/testTxManager")
	public String testTxManager() throws Exception{
		txManager.begin();//开启事务管理
		//开启连接。。。。
		Connection mysqlConn = mysqlDataSourceBean.getConnection();		
		//执行数据库操作
		System.out.println("执行数据库的操作成功!");
		//关闭数据库操作
		mysqlConn.close();		
		txManager.commit();//提交事务
		//可以将一次事务执行多次操作,实现多个个不同的数据库之间的操作
		return "【测试事务成功!】";
	}

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

4.测试

4.1 访问testConnection方法的结果:

connection:com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf
开启连接。。。。。
2019-08-14 15:55:32.492 WARN 12588 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection >proxyforcom.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf: WARNING: >transaction manager not running?
2019-08-14 15:55:32.493 INFO 12588 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection >proxyforcom.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf: close()…
关闭数据连接。。。。

发现没有开启的事务的时候会出现警告!

4.2 访问testTxManager方法的结果:

2019-08-14 16:22:32.604 INFO 9668 — [nio-9090-exec-1] >c.a.icatch.imp.BaseTransactionManager : createCompositeTransaction ( 10000 ): created new >ROOT transaction with id 192.168.133.1.tm0000100001
2019-08-14 16:22:32.606 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AbstractDataSourceBean : AtomikosDataSoureBean ‘mysql’: getConnection ( >null )…
2019-08-14 16:22:32.607 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AbstractDataSourceBean : AtomikosDataSoureBean ‘mysql’: init…
执行数据库的操作成功!
2019-08-14 16:22:32.607 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection proxy for >com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4cd96da2: close()…
2019-08-14 16:22:32.609 INFO 9668 — [nio-9090-exec-1] >c.a.icatch.imp.CompositeTransactionImp : commit() done (by application) of transaction >192.168.133.1.tm0000100001

发现之开启了一个事务进行管理!

总结

1.使用Atomikos进行统一的事务管理的时候可以使用UserTransactionManager这个类

2.使用Atomikos的时候,如果需要创建数据源必须使用实现了XADataSource的数据源

3.使用Atomikos的事务的时候需要先开启事务,然后创建连接,最后关闭连接,在最后执行事务的关闭

4.当前案例只实现了简单的操作,但是可以看出Atomikos对事务的优化,和操作与原来的事务管理不同,后续可能会更新!

以上纯属个人见解,如有问题请联系本人!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值