时间:2021-05-19
前言
Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到atomikos。笔者这里整合了一个spring和atomikos的demo,并且通过案例演示说明atomikos的作用。
准备工作
开发工具:idea
数据库:mysql , oracle
正文
源码地址: https://github.com/qw870602/atomikos
演示原理:通过在两个库的写操作之间人为制造异常来观察数据库是否回滚
演示步骤:1.正常写操作,观察数据库值的变化情况
2.在写操作语句之间制造异常,观察数据库值的变化情况
项目结构
从web.xml中可以知道,容器只加载了appliactionContext.xml,剩下的配置文件除了database.properties外都是无用文件,所以大家如果要在项目中配置的话,仅需要把appliactionContext.xml中关于atomikos的部分新增到自己项目中就OK了
appliactionContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://.xy.daodev.TransactionTestService;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;@ContextConfiguration(locations = {"classpath:applicationContext.xml"})public class TransactionTestMain extends AbstractJUnit4SpringContextTests { @Autowired private TransactionTestService transactionTestService; /** * 在同一事务有多个数据源 */ @Test public void multipleDataSource2() { transactionTestService.updateMultipleDataSource("1","1", 100L,"1.6"); }}业务实现,当前没有异常操作
@Servicepublic class TransactionTestServiceImpl implements TransactionTestService { @Autowired @Qualifier("mysqlTransactionTestDao") private MysqlTransactionTestDao mysqlTransactionTestDao; @Autowired @Qualifier("transactionTestDao") private TransactionTestDao transactionTestDao; /** * 在同一事务有多个数据源 */ @Override @Transactional public void updateMultipleDataSource(String deUserId, String inUserid, long money,String str) { // 账户1转出操作 mysqlTransactionTestDao.decreaseMoney(deUserId, money); //Integer.parseInt(str); // 账户2转入操作 transactionTestDao.increaseMoney(inUserid, money); } }mysql模拟金额转出,oracle模拟金额转入
<update id="decreaseMoney" parameterType="java.util.Map"> UPDATE fx1 SET amount=amount - #{1,jdbcType=BIGINT} WHERE id=#{0,jdbcType=VARCHAR}</update><update id="increaseMoney"> UPDATE fx1 SET amount=amount + #{1,jdbcType=BIGINT} WHERE id=#{0,jdbcType=VARCHAR}</update>mysql初始金额
oracle初始金额
执行正常操作
mysql当前金额
oracle当前金额
将被屏蔽的制造异常的代码打开
public void updateMultipleDataSource(String deUserId, String inUserid, long money,String str) { // 账户1转出操作 mysqlTransactionTestDao.decreaseMoney(deUserId, money); Integer.parseInt("skg"); // 账户2转入操作 transactionTestDao.increaseMoney(inUserid, money);}发现mysql和oracle的当前金额都没有变化,说明事务回滚成功,查看日志
发现控制台打印出了异常信息,并且atomikos调用了rollback()方法,从日志也证实了回滚成功。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、事务理论学习利用数据库事务实现应用事务控制1.要求:同一个事务需要同一个库的同一个连接。2.3.分布式事务JTA二、spring事务处理建模1.2.三、sp
1.分布式数据库是多个数据库,而rac只是一个库多个实例;2.rac事务上没有协调的问题,而分布式数据库由于是多个库需要事务上的协调;3.分布式数据库数据是分散
seata-1.4.0安装及使用1、简介Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TC
大家可以自行百度下阿里分布式事务,在这里我就不啰嗦了。下面是阿里分布式事务开源框架的一些资料,本文是springboot+dubbo+fescar的集成。快速开
前面讲完了Redis的分布式锁的实现,接下来讲Redisson的分布式锁的实现,一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Re