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 savepointresult 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