通过日志来看Spring跨库更新操作的事务
场景介绍:
一个项目俩个数据源,连接俩个不同的库
数据源初始化
@Configuration
@MapperScan(basePackages = "com.qing.mapper.payment", sqlSessionTemplateRef = "paymentSqlSessionTemplate")
public class PaymentDataSourceConfig { @Bean(name = "paymentDataSource")
@ConfigurationProperties(prefix = "spring.datasource.payment")
@Primary
public DataSource paymentDataSource() {
return DruidDataSourceBuilder.create().build();
} @Bean(name = "paymentSqlSessionFactory")
@Primary
public SqlSessionFactory paymentSqlSessionFactory(@Qualifier("paymentDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
} @Bean(name = "paymentTransactionManager")
@Primary
public DataSourceTransactionManager paymentTransactionManager(@Qualifier("paymentDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "paymentSqlSessionTemplate")
@Primary
public SqlSessionTemplate paymentSqlSessionTemplate(@Qualifier("paymentSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
} }
@Configuration
@MapperScan(basePackages = "com.qing.mapper.read", sqlSessionTemplateRef = "readSqlSessionTemplate")
public class ReadDataSourceConfig { @Bean(name = "readDataSource")
@ConfigurationProperties(prefix = "spring.datasource.read")
public DataSource readDataSource() {
return DruidDataSourceBuilder.create().build();
} @Bean(name = "readSqlSessionFactory")
public SqlSessionFactory readSqlSessionFactory(@Qualifier("readDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
} @Bean(name = "readTransactionManager")
public DataSourceTransactionManager readTransactionManager(@Qualifier("readDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "readSqlSessionTemplate")
public SqlSessionTemplate readSqlSessionTemplate(@Qualifier("readSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
} }
测试代码
@Service
public class TestService
{ @Autowired
VipOrderReadingMapper mapper1; @Autowired
TenVipOrderReadingMapper mapper2; @Autowired
GlobalRefundOrderMapper mapper3; @Transactional
public void test()
{ mapper1.test();
mapper3.test();
mapper2.test();
throw new RuntimeException("test");
} }
执行日志
-- ::04.584 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709] for JDBC transaction
-- ::04.588 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709] to manual commit
-- ::04.637 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
-- ::04.650 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b]
-- ::04.657 [http-nio--exec-] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
-- ::04.658 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/deny-variant.txt)
-- ::04.658 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/deny-schema.txt)
-- ::04.659 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/deny-function.txt)
-- ::04.659 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/deny-table.txt)
-- ::04.660 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/deny-object.txt)
-- ::04.660 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/readonly-table.txt)
-- ::04.660 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/permit-function.txt)
-- ::04.661 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/permit-table.txt)
-- ::04.662 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/permit-schema.txt)
-- ::04.662 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/druid/wall/mysql/permit-variant.txt)
-- ::04.663 [http-nio--exec-] DEBUG org.apache.catalina.loader.WebappClassLoaderBase - findResources(META-INF/services/com.alibaba.druid.filter.Filter)
-- ::05.868 [http-nio--exec-] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-} inited
-- ::05.868 [http-nio--exec-] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Registering transaction synchronization for JDBC Connection
-- ::05.870 [http-nio--exec-] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@58c237f2] will be managed by Spring
-- ::05.874 [http-nio--exec-] DEBUG c.q.mapper.read.order.VipOrderReadingMapper.test - ==> Preparing: update vip_order_reading set order_status = where reading_vip_order_id =
-- ::06.049 [http-nio--exec-] DEBUG c.q.mapper.read.order.VipOrderReadingMapper.test - ==> Parameters:
-- ::06.191 [http-nio--exec-] DEBUG c.q.mapper.read.order.VipOrderReadingMapper.test - <== Updates:
-- ::06.192 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b]
-- ::06.192 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
-- ::06.192 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22fb4694]
-- ::06.194 [http-nio--exec-] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709] will be managed by Spring
-- ::06.194 [http-nio--exec-] DEBUG c.q.m.payment.order.GlobalRefundOrderMapper.test - ==> Preparing: select count(*) fromglobal_refund_order
-- ::06.198 [http-nio--exec-] DEBUG c.q.m.payment.order.GlobalRefundOrderMapper.test - ==> Parameters:
-- ::06.255 [http-nio--exec-] DEBUG c.q.m.payment.order.GlobalRefundOrderMapper.test - <== Total:
-- ::06.256 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22fb4694]
-- ::06.256 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b] from current transaction
-- ::06.256 [http-nio--exec-] DEBUG c.q.m.read.order.TenVipOrderReadingMapper.test - ==> Preparing: update ten_vip_order_reading set order_status = where reading_vip_order_id =
-- ::06.257 [http-nio--exec-] DEBUG c.q.m.read.order.TenVipOrderReadingMapper.test - ==> Parameters:
-- ::06.367 [http-nio--exec-] DEBUG c.q.m.read.order.TenVipOrderReadingMapper.test - <== Updates:
-- ::06.367 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b]
-- ::06.368 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b]
-- ::06.368 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18b9642b]
-- ::06.368 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22fb4694]
-- ::06.368 [http-nio--exec-] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22fb4694]
-- ::06.368 [http-nio--exec-] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
-- ::06.368 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback
-- ::06.368 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709]
-- ::06.477 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709] after transaction
-- ::06.477 [http-nio--exec-] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
-- ::06.479 [http-nio--exec-] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [java.lang.String com.qing.controller.TestController.test()]: java.lang.RuntimeException: test
-- ::06.480 [http-nio--exec-] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'qingControllerAdvice'
-- ::06.480 [http-nio--exec-] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Invoking @ExceptionHandler method: public com.qingread.utils.generate.RestGenerator<?> com.qing.controller.aop.QingControllerAdvice.errorHandler(java.lang.Exception)
-- ::06.483 [http-nio--exec-] ERROR com.qing.controller.aop.QingControllerAdvice - java.lang.RuntimeException: test
at com.qing.service.test.TestService.test(TestService.java:)
由日志可以知道用的JDBC Connection
-- ::04.588 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709] to manual commit
注意最后的回滚语句
-- ::06.368 [http-nio--exec-] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3a6cc709]
代码结果是什么,你懂的
通过日志来看Spring跨库更新操作的事务的更多相关文章
- Spring Data Jpa 更新操作
第一步,通过Repository对象把实体根据ID查询出来 第二部,往查出来的实体对象进行set各个字段 第三步,通过Repository接口的save方法进行保存 保存和更新方式(已知两种) 第一种 ...
- Hibernate-数据库更新操作
/* Session接口下操作存在以下问题: 数据更新操作: 1.更新的时候必须要有主键; 2.若只更新部分字段内容,则未设置的字段将被设置为Null(全表更新) 3.update()没有返回值,即不 ...
- 一条跨库更新数据的sql
UPDATE [db1].[dbo].[R_ResAndBook] SET SectionID=TT2.newsecidFROM [SmartCampus].[dbo].[R_ResAndBo ...
- Spring Boot学习——数据库操作及事务管理
本文讲解使用Spring-Data-Jpa操作数据库. JPA定义了一系列对象持久化的标准. 一.在项目中使用Spring-Data-Jpa 1. 配置文件application.properties ...
- sql server service broker中调用存储过程执行跨库操作,不管怎么设置都一直提示 服务器主体 "sa" 无法在当前安全上下文下访问数据库 "dbname"。
用sql server自带的消息队列service borker,调用存储过程中,执行了一个跨库的操作,先是用了一个用户,权限什么都给够了,但是一直提示 服务器主体 "user" ...
- mysql跨库复制: replicate_wild_do_table和replicate-wild-ignore-table
使用replicate_do_db和replicate_ignore_db时有一个隐患,跨库更新时会出错. 如设置 replicate_do_db=testuse mysql;update test. ...
- SQL Server 跨库查询
1. 开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2. 跨库查询操作 select * from ...
- 如何玩转跨库Join?跨数据库实例查询应用实践
背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...
- sql server 跨库操作
SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...
随机推荐
- Java字符串与数组
字符串查找 indexOf(String s)方法返回搜索的字符或字符串首次出现的位置 lastIndexOf(String s)方法返回搜索的字符或字符串最后一次出现的位置 获取索引位置的字符 ch ...
- bugku 密码学一些题的wp
---恢复内容开始--- 1.滴答滴 摩斯密码,http://tool.bugku.com/mosi/ 2.聪明的小羊 从提示猜是栅栏密码,http://tool.bugku.com/jiemi/ 3 ...
- Python练习五
1.用文件操作的方式,创建登录注册功能,允许用户输错三次. user = input("请输入你要注册的用户名:") password = input("请输入你要注册的 ...
- IPFS 探索
IPFS 探索 比特币当前是用于存金融交易数据,有leveldb 存关键小的交易数据.那么我们的文件,譬如一个网站里面的static file 怎么办? IPFS(InterPlanetary Fil ...
- 2D游戏与3D游戏的区别 原文:https://zhidao.baidu.com/question/588490865.html
2D和3D间有哪些不同点呢? 让我们来比较一下,共同找出它俩之间的不同点. 对玩家来说,2D技术和3D技术只是显示数据的方式而已,玩家都是通过二 维的平面显示器来观看它们.对制作者来说,二者的不同之处 ...
- Android Studio 调试快捷键
一直在用微软的东西,用 Android Studio 开发还是太坑了.网上很多人说调试快捷竟然都是错的,不知道是不是不同版本不一样. Android Studio 3.2 快捷键如下: F7:进入当前 ...
- VBA随机地牢生成
无聊啊--于是,我想做一个随机地图. 但是我很懒,不想做. 但是身体很诚实. 这次是直接在Excel中制作的地图,但是,VB的执行效率很慢,我代码的效率也很慢,导致,一旦地图长宽稍大,就会出现好几分钟 ...
- 15.1 打开文件时的提示(不是dos格式)去掉头文件
1.用ultraedit打开文件时,总提示不是DOS格式 2.把这个取消.dos格式只是用来在unix下读写内容的,此功能禁用即可.
- jq源码判断数据类型
4.Object.prototype.toString.call() 1 var a = Object.prototype.toString; 2 3 console.log(a.call(" ...
- 第七届蓝桥杯省赛javaB组 第七题剪邮票
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...