主备库的事务管理器如何设置

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

Spring如何为多数据源配置多个事务管理器?

1.配置多个数据源

配置多个数据源的信息,可以使用xml、json、配置中心、zookeeper、数据库加载等多种方式,例如在application.properties中配置多个数据源:

# 数据源1
spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.db1.username=root
spring.datasource.db1.password=root
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

# 数据源2
spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.db2.username=root
spring.datasource.db2.password=root
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
2.创建数据源配置类

分别创建两个数据源配置类,并分别指定数据源配置前缀:

@Configuration
public class DataSourceConfig {

    @Bean(name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource db1DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create().build();
    }
}
3.创建多个事务管理器

创建两个事务管理器,并分别指定对应的数据源:

@Configuration
public class TransactionManagerConfig {

    @Autowired
    @Qualifier("db1DataSource")
    private DataSource db1DataSource;

    @Autowired
    @Qualifier("db2DataSource")
    private DataSource db2DataSource;

    @Bean(name = "db1TransactionManager")
    public DataSourceTransactionManager db1TransactionManager() {
        return new DataSourceTransactionManager(db1DataSource);
    }

    @Bean(name = "db2TransactionManager")
    public DataSourceTransactionManager db2TransactionManager() {
        return new DataSourceTransactionManager(db2DataSource);
    }
}

4.创建多个JdbcTemplate

创建两个JdbcTemplate,并分别指定对应的数据源:

@Configuration
public class JdbcTemplateConfig {

    @Autowired
    @Qualifier("db1DataSource")
    private DataSource db1DataSource;

    @Autowired
    @Qualifier("db2DataSource")
    private DataSource db2DataSource;

    @Bean(name = "db1JdbcTemplate")
    public JdbcTemplate db1JdbcTemplate() {
        return new JdbcTemplate(db1DataSource);
    }

    @Bean(name = "db2JdbcTemplate")
    public JdbcTemplate db2JdbcTemplate() {
        return new JdbcTemplate(db2DataSource);
    }
}

如果使用MyBatis,可以顺带配置一下SqlSessionFactory:

    @Bean(name = "db1SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Value("${mybatis.db1.mapper-locations}") String mapperLocations) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(db1DataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));

        // 设置MyBatis配置文件位置
        sessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));

        return sessionFactoryBean.getObject();
    }

   @Bean(name = "db2SqlSessionFactory")
    public SqlSessionFactory db2SqlSessionFactory(@Value("${mybatis.db2.mapper-locations}") String mapperLocations) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(db2DataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));

        // 设置MyBatis配置文件位置
        sessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));

        return sessionFactoryBean.getObject();
    }

 使用事务:

    @Transactional(transactionManager = "db1TransactionManager", rollbackFor = Exception.class)
    public void insertDb1(String name) {
        db1JdbcTemplate.update("INSERT INTO test (name) VALUES (?)", name);
    }

    @Transactional(transactionManager = "db2TransactionManager", rollbackFor = Exception.class)
    public void insertDb2(String name) {
        db2JdbcTemplate.update("INSERT INTO test (name) VALUES (?)", name);
    }

到目前为止,一切都很顺利,问题来了:

如果架构上数据库采用主从模式,那么如何配置事务管理器?

一般主库负责写,从库负责读,事务管理器主要作用是能在异常时回滚业务代码,读数据没有回滚业务代码的必要,所以主从模式下不需要为主从数据源都配置事务管理器,只需要为主库配置事务管理即可。文章来源地址https://www.toymoban.com/news/detail-497923.html

到了这里,关于主备库的事务管理器如何设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【MySQL系列】MySQL的事务管理的学习(一)_ 事务概念 | 事务操作方式 | 事务隔离级别

    「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 事务的概念 MySQL事务是指一系列的数据库操作(一组 DML 语句),这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性 事务就是要

    2024年02月09日
    浏览(35)
  • 【掌握Spring事务管理】深入理解事务传播机制的秘密

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 1.Spring 中事务的实现方式 1.1 Spring 编程式事务 (了解) 1.2 Spring 声明式事务 ( @Transactional ) 【异常情况一】(自动回滚成功) 【异常情况二】(自动回滚失效

    2024年02月10日
    浏览(47)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(31)
  • Spring的事务管理

    1、事务的回顾 【1】事务的定义 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合 【2】事务的ACID原则 事务具有4个基本特性:原子性、一致性

    2023年04月16日
    浏览(76)
  • 【MySQL】事务管理

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 假如现在有一个业务需求,就是张三要给李四微信转账 50 块钱,那么如何解决这个业务需求呢?我想,

    2024年02月15日
    浏览(38)
  • Spring 事务管理

    目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象(Transaction Abstraction) 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1. 高级同步方式 1.3.2. 低级同步方式 1.3.3.TransactionAwareDataSo

    2024年02月13日
    浏览(46)
  • MySQL-----事务管理

    CURD不加控制的时候,会有什么问题呢? 上层看起来比较简单的需求,可能对应后端要做很多的工作,组合起来才是一个完整的需求解决方案. 一个整体,要么不做,要么做完(绝对成功,绝对失败),不要出现中间操作这样的概念 ---- 原子性!!! 上面就称为一个 事务 !!! 即 就是一个或者多个

    2024年02月05日
    浏览(38)
  • MySQL事务管理

    什么是事务? 事务就是一组 DML 语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。 事务就是要做的或所做的事情,主要用于

    2024年01月24日
    浏览(34)
  • 【MySQL事务管理】

    剑指offer:一年又11天 买票的过程要是原子的 – 要么买了要么没买 买票互相不受影响 买票的结果要是确定的 – 买了就有票,没买就没票 买票的结果要是持久的 – 买了票这张票就一直是你的 事务就是一组DML语句,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功

    2024年02月03日
    浏览(38)
  • Web 事务管理

    Web在执行的过程中需要保证一致性,从而需要引入事务来对SQL事件进行事务的管理。具体而言可以参考这篇博客MySQL事务(transaction)。 具体而言,我们获得一个这样的需求,删除一个部门,在删除部门的过程中需要删除部门下的所有员工 正常而言这段代码是可以正常执行的,

    2024年02月11日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包