1. 数据库事务
commit
rollback
2. @Transactional注解底层工作原理源码解析
1)有Transactional注解,生成要给代理bean类 代理逻辑
2)执行方法前,datasource 获取一个数据库连接,spring建立的数据库连接,connection.setAutoCommit(false)
3)执行脚本
4)connection.commit(); 代理逻辑
3. 传播机制源码解析
默认是require
业务逻辑A Propagation.REQUIRED
业务逻辑B Propagation.REQUIRED
1)spring建立数据库连接conn1
2)ThreadLocal(conn1)
3)conn1.setAutoCommit(false)
4)业务逻辑a Propagation.REQUIRED
5)业务逻辑b
6)conn1.commit()
业务逻辑A Propagation.REQUIRED
业务逻辑B Propagation.REQUIRES_NEW
1)spring建立数据库连接conn1
2)ThreadLocal(conn1)
3)conn1.setAutoCommit(false
4) 执行业务A
5) conn1 挂起 (从ThteadLocal中移出,放到另外的对象中)
6)spring建立数据库连接2 conn2
7)ThreadLocal(conn2)
8)conn2.setAutoCommit(false)
9)执行业务B
10)conn2.commit()
11)conn1 恢复 conn1 --> ThreadLocal
12)conn1.commit()
业务逻辑A Propagation.REQUIRED
业务逻辑B Propagation.NESTED
1)spring建立数据库连接conn1
2)ThreadLocal(conn1)
3)conn1.setAutoCommit(false
4) 执行业务A
5) savepoint xxx
6)执行业务B
7)抛出异常, 首先 rollback xxx
8)如果 业务逻辑Acatch了异常后,不抛出,conn1还是可以提交的。如果业务逻辑A继续抛出异常,conn1也会回滚
业务逻辑A Propagation.REQUIRED
业务逻辑B ,private 方法, Propagation.NEVER
代理对象.test()
1 建立数据库连接
2 业务逻辑A -----> 原始对象的.test()
2.1 因为 业务逻辑B 是private方法,不会生效,所以直接当作没有事务注解执行(事务只对public的方法生效),即执行的是代理对象的方法,代理对象的属性是不会进行自动依赖注入的。
4. TransactionSynchronizationManager源码解析
org.springframework.transaction.support.TransactionSynchronization
AutoProxyRegistrar --->
ProxyTransactionManagermentConfiguration
Transaction
TransactionInterceptor : @Transactionoal的信息,超时时间,隔离级别等 事务的代理逻辑是在这里实现的