千云物流- 多数据源事务管理

这篇具有很好参考价值的文章主要介绍了千云物流- 多数据源事务管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

事务管理器

Spring只是个容器,因此它并不做任何事务的具体实现。他只是提供了事务管理的接口PlatformTransactionManager,具体内容由就由各个事务管理器来实现。

Spring提供了许多内置事务管理器实现:

  • DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;

  • HibernateTransactionManager:位于org.springframework.orm.hibernate3包中,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate3.2+版本;

  • JpaTransactionManager:位于org.springframework.orm.jpa包中,提供对单个javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的事务管理;

  • JtaTransactionManager:位于org.springframework.transaction.jta包中,提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器事务管理器;这个就是我们需要的。

  • JdoTransactionManager:位于org.springframework.orm.jdo包中,提供对单个javax.jdo.PersistenceManagerFactory事务管理,用于集成JDO框架时的事务管理;

  • OC4JjtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的对OC4J10.1.3+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;

  • WebSphereUowTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的对WebSphere 6.0+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;

  • WebLogicJtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的对WebLogic8.1+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持。

分布式事务样例

在千云物流这边使用在单体应用中,也就是线下软件使用 driud + Atomikos + jpa + jdbcTemplate

  • 数据库准备 atomikos_1,atomikos_2
//为两个库创建操作的表
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
  • 代码样例
/**
 * @author Janle on 2023/5/5
 */
public class AtomikosExample {
    private static AtomikosDataSourceBean createAtomikosDataSourceBean(String dbName) {
        final DruidXADataSource dataSource = new DruidXADataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:/ip:port/" + dbName);
        dataSource.setUsername("usr");
        dataSource.setPassword("pwd");
        dataSource.setName(dbName);

        AtomikosDataSourceBean sourceBean = new AtomikosDataSourceBean();
        sourceBean.setTestQuery("select 1");
        sourceBean.setXaDataSource(dataSource);
        sourceBean.setUniqueResourceName(dbName);
        sourceBean.setBeanName(dbName);
        return sourceBean;
    }

    public static void main(String[] args) throws SystemException {

        AtomikosDataSourceBean ds1 = createAtomikosDataSourceBean("atomikos_1");
        AtomikosDataSourceBean ds2 = createAtomikosDataSourceBean("atomikos_2");

        JtaTransactionManager transactionManager = transactionManager();
        UserTransaction userTransaction = transactionManager.getUserTransaction();
        try {
            // 开启事务
            userTransaction.begin();
            final JdbcTemplate jdbcTemplate = new JdbcTemplate();
            jdbcTemplate.setDataSource(ds1);

            jdbcTemplate.execute("INSERT into user(name) VALUES ('nihao1')");

			//如果是抛异常就回滚就好了
            //int a=1/0;
            final JdbcTemplate jdbcTemplate2 = new JdbcTemplate();
            jdbcTemplate2.setDataSource(ds2);
            jdbcTemplate2.execute("INSERT into user(name) VALUES ('niyehao')");
            // 两阶段提交
            userTransaction.commit();
        } catch (Exception e) {
            try {
                e.printStackTrace();
                userTransaction.rollback();
            } catch (SystemException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                ds1.close();
                ds2.close();
            } catch (Exception ignore) {
            }
        }
    }

    private static JtaTransactionManager jtaTransactionManager;

    /**
     * 事务管理器
     *
     * @return
     * @throws SystemException
     */
    public static JtaTransactionManager transactionManager() throws SystemException {
        if (null != jtaTransactionManager) {
            return jtaTransactionManager;
        }
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        UserTransaction userTransaction = new UserTransactionImp();
        userTransactionManager.setTransactionTimeout(3000);
        userTransactionManager.setForceShutdown(true);
        jtaTransactionManager = new JtaTransactionManager(userTransaction, userTransactionManager);
        return jtaTransactionManager;
    }
}

常见问题

XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency

解决:如果是mysql执行连接账户对应的命令

GRANT XA_RECOVER_ADMIN ON *.* TO 账户@'%' ;

启动出现javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Failed to create the XA control connection. Error: "Could not find stored procedure ‘master…xp_sqljdbc_xa_init_ex’ 具体查看

https://www.ibm.com/docs/zh/integration-designer/8.5.5?topic=SSTLXK_8.5.5/com.ibm.wbpm.imuc.ebpm.doc/topics/db_xa_nd_win_man.html文章来源地址https://www.toymoban.com/news/detail-434740.html

到了这里,关于千云物流- 多数据源事务管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 多数据源及事务解决方案

    一个主库和N个应用库的数据源,并且会同时操作主库和应用库的数据,需要解决以下两个问题: 如何动态管理多个数据源以及切换? 如何保证多数据源场景下的数据一致性(事务)? 本文主要探讨这两个问题的解决方案,希望能对读者有一定的启发。 通过扩展Spring提供的抽象

    2024年02月10日
    浏览(27)
  • Spring Boot多数据源事务@DSTransactional的使用

    Spring Boot 集成com.baomidou,引入dynamic-datasource依赖,实现多数据源,这里说下事务问题: 1、一个方法中使用同一个数据源; 2、一个方法中使用了多个数据源; 这里把dao、service列出来 1、dao层   2、service层  spring boot实现多数据源:Spring Boot集成Druid实现多数据源的两种方式_涛

    2024年02月11日
    浏览(33)
  • 解决多数据源的事务问题 - 基于springboot--mybatis

    在Spring Boot和MyBatis中,我们有时需要在方法中同时使用两个不同的数据库,但使用 @Transactional 注解会变得复杂。这时我们可以用一种更灵活的方法来处理。 想象一下这样的场景:我们有两个数据库,我们希望在一个方法中同时操作它们,但是普通的 @Transactional 注解变得不太

    2024年02月01日
    浏览(34)
  • CompletableFuture异步编程事务及多数据源配置详解(含gitee源码)

    仓库地址: buxingzhe: 一个多数据源和多线程事务练习项目 小伙伴们在日常编码中经常为了提高程序运行效率采用多线程编程,在不涉及事务的情况下,使用dou.lea大神提供的CompletableFuture异步编程利器,它提供了许多优雅的api,我们可以很方便的进行异步多线程编程,速度杠杠

    2024年01月22日
    浏览(34)
  • CompletableFuture异步编程事务及多数据源配置问题(含gitee源码)

    仓库地址: buxingzhe: 一个多数据源和多线程事务练习项目 小伙伴们在日常编码中经常为了提高程序运行效率采用多线程编程,在不涉及事务的情况下,使用dou.lea大神提供的CompletableFuture异步编程利器,它提供了许多优雅的api,我们可以很方便的进行异步多线程编程,速度杠杠

    2024年02月05日
    浏览(33)
  • 【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

    前言:在最近的实际开发的过程中,遇到了在多数据源的情况下要保证原子性的问题,这个问题当时遇到了也是思考了一段时间,后来通过搜集大量资料与学习,最后是采用了分布式事务来解决这个问题,在讲解之前,在我往期的博客提前搭好了一个SpringBoot整合MyBatis搭建M

    2024年02月14日
    浏览(28)
  • 数据仓库与事务管理

    随着大数据时代的到来,数据仓库已成为企业决策和支持业务发展的重要工具。然而,关于数据仓库是否面向事务处理,一直存在争议。本文将围绕这一话题展开讨论,重点阐述数据仓库的特点、优缺点以及面向事务处理的技术和应用。 数据仓库是用于存储、管理和分析大量

    2024年02月11日
    浏览(33)
  • Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

    背景 处理多数据源事务一直是一个复杂而棘手的问题,通常我们有两种主流的解决方法。 第一种是通过Atomikos手动创建多数据源事务,这种方法更适合数据源数量较少,参数配置不复杂,对性能要求不高的项目。然而,这种方法的最大困难在于需要手动配置大量设置,这可能

    2024年02月11日
    浏览(29)
  • 数据库底层运行原理之——事务管理器

    一般所有关系型数据库内部都有自己的事务机制,进程是如何保证每个查询在自己的事务内执行的,通过这篇文章来简单介绍一下。 我们可以理解为数据库是由多种相互交互的组件构成的,数据库一般可以用如下图形来理解: 事务管理器就是今天要介绍的其中一个组件:

    2023年04月22日
    浏览(35)
  • Spring事务管理 | 数据库连接池流程原理分析

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 事务(Transaction),一般是指要做的或所做的事情。在计算机 术语 中是指访问并可能更新数据库中各种 数据项 的一个程序 执行单元 。事务通常由 高级数据库 操纵语言或编程语言(如SQL,C++或Java)书写的 用户程序

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包