Spring Boot 事务管理与myabtis的事务执行过程分析

流程

  • spring 使用aop来拦截事务,要保证spring 使用的Connection和myabtis的使用是的同一个连接
  • 如何保证使用同一个连接?ThreadLocal
    • org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin #获取链接,放入到ThreadLocal中
      • org.springframework.jdbc.datasource.DataSourceTransactionManager#obtainDataSource
    • org.mybatis.spring.transaction.SpringManagedTransaction#openConnection #从ThreadLocal中获取链接
      • org.springframework.jdbc.datasource.DataSourceUtils#getConnection
      • org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection # 使用的同一个数据源,从当前ThreadLocal中拿到Connection
      • org.springframework.transaction.support.TransactionSynchronizationManager#getResource
  • 事务提交
    • org.mybatis.spring.transaction.SpringManagedTransaction#commit # 本身不做事务提交,主要isConnectionTransactional这个属性决定的,获取链接时判断当前链接是否带有事务,如果是ture,当commit时则不做事务提交,由 spring 事务管理器提交事务。以下问执行流程
    • org.springframework.transaction.interceptor.TransactionAspectSupport#commitTransactionAfterReturning
    • org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit
      • org.springframework.transaction.support.AbstractPlatformTransactionManager#triggerBeforeCommit
        • org.mybatis.spring.SqlSessionUtils.SqlSessionSynchronization#beforeCommit
        • org.apache.ibatis.session.defaults.DefaultSqlSession#commit(boolean)
        • org.apache.ibatis.executor.BaseExecutor#commit
        • org.mybatis.spring.transaction.SpringManagedTransaction#commit
      • org.springframework.transaction.support.AbstractPlatformTransactionManager#triggerBeforeCompletion
        • org.springframework.transaction.support.AbstractPlatformTransactionManager#doCommit
        • java.sql.Connection#commit

总结

  • 多数据源下要保证SqlSessionFactory和DataSourceTransactionManager的数据源用的同一个。
  • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
相关推荐
止语Lab5 小时前
Go并发编程实战:Channel 还是 Mutex?一个场景驱动的选择框架
开发语言·后端·golang
小码哥_常6 小时前
Spring Boot一键限速:守护你的接口“高速路”
后端
HoneyMoose6 小时前
Jenkins Cloudflare 部署提示错误
java·servlet·jenkins
阿丰资源6 小时前
基于SpringBoot的物流信息管理系统设计与实现(附资料)
java·spring boot·后端
Predestination王瀞潞6 小时前
Java EE3-我独自整合(第四章:Spring bean标签的常见配置)
java·spring·java-ee
overmind6 小时前
oeasy Python 121[专业选修]列表_多维列表运算_列表相加_列表相乘
java·windows·python
资深数据库专家6 小时前
总账EBS 应用服务器1 的监控分析
java·网络·数据库
房开民6 小时前
可变参数模板
java·开发语言·算法
t***5446 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
_深海凉_6 小时前
LeetCode热题100-最小栈
java·数据结构·leetcode