Spring事务核心原理、源码和MyBatis适配

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下的事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值