REQUIRES_NEW、NESTED失效解决

REQUIRES_NEW

spring 的事务传播这边就不提了,各种可百度到。但在用REQUIRES_NEW的时候,发现没有起作用。

分析了一下,原因是A方法(有事务)调用B方法(要独立新事务),如果两个方法写在同一个类里,spring的事务会只处理能同一个。

原因:spring的事务管理通过切面实现,如果直接使用this.方法()或者方法(),不会触发切面中对事务的管理。应使用该方法所在的类的实例.方法()。

解决方案1:需要将两个方法分别写在不同的类里。

解决方案2:方法写在同一个类里,但调用B方法的时候,将service自己注入自己,用这个注入对象来调用B方法。(ApplicationContext getBean获取service自己)

解决方案3:方法只能为public修饰。

spring一些日志输出:

logging.level.com.ryan.practice.redislock.mapper=debug
logging.level.org.apache.ibatis=DEBUG
logging.level.org.mybatis=DEBUG
logging.level.java.sql.Connection=DEBUG
logging.level.java.sql.Statement=DEBUG
logging.level.org.springframework=DEBUG

原文连接:https://blog.csdn.net/arsenal04/article/details/41007545
 

NESTED

场景:父方法,调用多个子方法(声明式事务,propagation = Propagation.NESTED),父方法调用时需要catch子方法异常,否则NESTED不生效。

以下为日志记录,一个connection对应一次事务

2021-06-09 14:25:47.659 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [com.ryan.practice.redislock.service.tran.ServiceA.addWillDeleteUser]: PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED,-java.lang.Exception
2021-06-09 14:25:47.660 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Acquired Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] for JDBC transaction
2021-06-09 14:25:47.663 DEBUG 19264 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Changing isolation level of JDBC Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] to 2
2021-06-09 14:25:47.664 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Switching JDBC Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] to manual commit
2021-06-09 14:25:47.673 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Creating a new SqlSession
2021-06-09 14:25:47.678 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
2021-06-09 14:25:48.056 DEBUG 19264 --- [           main] o.m.s.t.SpringManagedTransaction         : JDBC Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] will be managed by Spring
2021-06-09 14:25:48.077 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
result add is : 1
2021-06-09 14:25:48.078 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Creating nested transaction with name [com.ryan.practice.redislock.service.tran.ServiceA.updateWillDeleteUser]
2021-06-09 14:25:48.083 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329] from current transaction
2021-06-09 14:25:48.108 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
2021-06-09 14:25:48.109 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Rolling back transaction to savepoint

result udpate is : false
2021-06-09 14:25:48.206 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
2021-06-09 14:25:48.207 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
2021-06-09 14:25:48.207 DEBUG 19264 --- [           main] org.mybatis.spring.SqlSessionUtils       : Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13866329]
2021-06-09 14:25:48.208 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Initiating transaction commit
2021-06-09 14:25:48.208 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Committing JDBC transaction on Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76]
2021-06-09 14:25:48.250 DEBUG 19264 --- [           main] o.s.jdbc.datasource.DataSourceUtils      : Resetting isolation level of JDBC Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] to 4
2021-06-09 14:25:48.251 DEBUG 19264 --- [           main] o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [HikariProxyConnection@1987428721 wrapping com.mysql.jdbc.JDBC4Connection@44e4cb76] after transaction

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值