1、基本原理
spring事务其实就是根据事务注解生成代理类,然后在前置增强方法里获取connection,设置connection到threadlocal,开启事务。再执行原始方法,最后在后置增强方法中判断有无异常来进行事务回滚或提交,再释放连接。
@Transactional
和线程绑定,当前线程的操作在事务内
事务传播
PROPAGATION_REQUIRED
有事务,使用已有的;没有开启新的
PROPAGATION_REQUIRES_NEW
建立新连接作为新的事务,和先前的完全分开
PROPAGATION_NESTED
JDBC savepoint,内部回滚不影响外部事务,由外部事务提交
AbstractPlatformTransactionManager类定义了事务的工作流,事务的不同入口(声明式和编程式)、实现都使用这个流程
DataSourceTransactionManager是JDBC数据源的事务管理器实现,下文基于此
2、事务管理器
事务管理器从ThreadLocal中获取当前线程的事务的ConnectionHolder,
如果没有则创建新的Connection,保存到ThreadLocal
如果Connection是自动提交,保存自动提交的配置后改成false,在事务结束后恢复
在事务结束后,释放Connection回连接池
3、MyBatis
使用SqlSessionTemplate适配Spring事务,SqlSessionHolder同上文Connection一样保存在ThreadLocal
SqlSession使用的连接是由SpringManagedTransaction管理的Connection,保存在ThreadLocal中,所以事务中MyBatis和其他的数据库操作是在相同的Connection下的事务