在 Spring,MyBatis 下两个数据源,通过 @Transactional 注解 配置简单的事务管理

spring-mybatis.xml

<!--******************************** data one start ***************************************************************-->
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
   <property name="driverClassName" value="${jdbc.driver}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
   <property name="initialSize" value="10" />
   <property name="minIdle" value="50" />
   <property name="maxActive" value="100" />
   <property name="maxWait" value="60000" />
   <property name="useUnfairLock" value="true" />
   <property name="timeBetweenEvictionRunsMillis" value="300000" />
   <property name="minEvictableIdleTimeMillis" value="600000" />
   <property name="validationQuery" value="select 1" />
   <property name="testWhileIdle" value="true" />
   <property name="testOnBorrow" value="true" />
   <property name="poolPreparedStatements" value="true" />
   <property name="maxOpenPreparedStatements" value="200" />
   <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
</bean>

<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <!-- 数据库连接池 -->
   <property name="dataSource" ref="dataSource" />
   <!-- 加载mybatis的全局配置文件 -->
   <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
   <!-- 自动扫描mapping.xml文件 -->
       <property name="mapperLocations" value="classpath:mybatis/mapping/*.xml" />
</bean>

<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="com.***.***.dao" />
   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

<!-- 设定transactionManager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource" />
</bean>
<!-- 支持 @Transactional 标记 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<!--******************************** data one end ***************************************************************-->

<!--******************************** data two start ***************************************************************-->
<!-- 数据库连接池 -->
<bean id="dataSourceTwo" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
   <!--略写-->
</bean>

<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactoryTwo" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSourceTwo" />
   <!--略写-->
</bean>

<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <!--略写-->
   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryTwo" />
</bean>

<!-- 设定transactionManager -->
<bean id="transactionManagerTwo" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSourceTwo" />
</bean>
<!-- 支持 @Transactional 标记 -->
<tx:annotation-driven transaction-manager="transactionManagerTwo" proxy-target-class="true" />
<!--******************************** data two end 略写 ***************************************************************-->

上面配置了两个数据源(dataSource,dataSourceTwo),两个事务管理器(transactionManager,transactionManagerTwo)

@Transactional 事务注解

1)第一个数据源,使用第一个事务管理器

@Override
@Transactional(value = "transactionManager",readOnly = false)
public void insert {}

2)第二个数据源,使用第二个事务管理器

@Override
@Transactional(value = "transactionManagerTwo",readOnly = false)
public void insert {}

3)不使用 value 或者 @Transactional 标记,会使用 哪个数据源 及起哪个事务?

@Override
@Transactional
public void insert {}
@Override
public void insert {}

像这种不标明的情况,会使用默认 事务管理器(transactionManager),所以只有一个事务管理器的时候,我们一般不写 value

引出:一条SQL语句是否需要事务

事务的存在意义:当我们在执行数据库操作时,例如:insert,update,delete  ,当发生错误导致执行失败时,我们需要对整个操作进行回滚。

当我们只有一个操作如 insert,我们是不需要搞个事务跟踪的, 因为一条语句就是一个事务,它自己本身就已经有事务了!!!

就算这条 insert 语句执行失败,它自然不会插入成功,同时也不会对其它操作造成影响。

按我理解,事务应该用在执行多条语句,并且语句之间会相互影响的时候才需要,事务是用在多个语句保证同时成功的时候用,单个语句不建议用

需要注意的是,多个数据库的这种配置是不支持分布式事务的,也就是同一个事务中,不能操作多个数据库。

如果要实现分布式事务可参考:

Spring分布式事务实现

spring多数据源配置

Spring, MyBatis 多数据源的配置和管理

关注公众号,分享干货,讨论技术

Spring 多数据源 @Transactional 注解事务管理相关推荐

  1. spring@Transactional注解事务不回滚不起作用无效的问题处理

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...

  2. Spring ORM示例 - 带有AOP事务管理

    Spring ORM示例 - 带有AOP事务管理 这是一个非常简单的Spring ORM示例,向您展示如何使用Spring配置应用程序 依赖注入(@Autowired annotation), JPA ...

  3. @Transactional注解事务不回滚不起作用无效

    @Transactional注解事务不回滚不起作用无效 以下内容均来自http://blog.csdn.net/u011410529/article/details/54287307 转载 这几天在项 ...

  4. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  5. Spring Boot中的多事务管理

    ** 一.多数据源问题 ** 最后一个可以插入一条数据,原因是Transactoinal的事务只针对userMapper有效,因为之前的事务只给test1配置了,而test2并没有配置事务. ** 二 ...

  6. java多数据源事务管理_SpringBoot2 多数据源、多事务管理配置

    SpringBoot2 多数据源.多事务管理配置 1. 首先启动事务管理:@EnableTransactionManagement 2. 添加基础配置: server.port=8080 #maste ...

  7. 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题

    解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 参考文章: (1)解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 (2)https://www.cn ...

  8. Spring JDBC-混合框架的事务管理

    概述 问题 解决方案 示例Hibernate Spring JDBC 概述 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特色,各有千秋. Hibernate 是非常优秀的 ORM ...

  9. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

最新文章

  1. 强制修改mysql 中root的密码
  2. SAP CRM WebClient UI 某些icon图标不能正常显示X
  3. 读取带空格字符串小结
  4. python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离
  5. CMU | 深度学习模型中集成优化、约束和控制
  6. swift语言 编写 ios开发 第一个程序hello world!
  7. 【转】关于Eclipse创建Android项目时,会多出一个appcompat_v7的问题
  8. OPNET网络仿真分析-1.1.2、OPNET简介
  9. W3School-CSS 字体(font)实例
  10. idea常用快捷键以及自定义快捷键
  11. Keil 中 Error L6002U
  12. 二分专项训练(二分搜索+二分答案的十贰道例题及解析
  13. 【2018】【论文笔记】最后一米太赫——
  14. codeforces 282 D. Yet Another Number Game
  15. CSDN的文章如何快速转移到微信公众号上
  16. SystemSoftware
  17. 关于PS新建(PS如何新建)
  18. 测试难题:测试数据准备之如何准备测试数据
  19. IO流案例以及特殊操作流/对象对象序列化流/Properties集合
  20. win10激活的方法

热门文章

  1. CIO40: IT人之三观”不正、三十“南”立
  2. m语言控制rtw仿真
  3. python学习笔记霍兰德人格分析与错误解决
  4. 难忘的面试周——百度校招面经
  5. Excel学习(一)--批量修改文件名
  6. xtu oj 1319
  7. Outlook2010设置msn邮箱
  8. 罪恶装备Xrd卡通渲染
  9. KMP算法字符串匹配
  10. 旺旺老师JavaWeb视频(03) Tomcat