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的数据源用的同一个。
  • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
相关推荐
y = xⁿ4 分钟前
【从零开始学习Redis|第四篇】从底层理解缓存问题:雪崩、击穿、穿透与一致性设计
java·redis·学习·缓存
江湖有缘7 分钟前
本地化JSON 处理新方案:基于 Docker的JSON Hero部署全记录
java·docker·json
XPoet10 分钟前
AI 编程工程化:Rule——给你的 AI 员工立规矩
前端·后端·ai编程
御坂10101号21 分钟前
「2>&1」是什么意思?半个世纪的 Unix 谜题
java·数据库·bash·unix
韩立学长28 分钟前
基于Springboot校园志愿者服务平台77pz7812(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Java基基44 分钟前
Spring让Java慢了30倍,JIT、AOT等让Java比Python快13倍,比C慢17%
java·开发语言·后端·spring
future02101 小时前
Spring AOP核心机制:代理与拦截揭秘
java·开发语言·spring·面试·aop
qq_12498707531 小时前
基于SpringBoot微信小程序的智能在线预约挂号系统(源码+论文+部署+安装)
spring boot·后端·微信小程序·毕业设计·计算机毕设·毕业设计源码
代码探秘者1 小时前
【Redis】分布式锁深度解析:实现、可重入、主从一致性与强一致方案
java·数据库·redis·分布式·缓存·面试
小马爱打代码1 小时前
SpringBoot + 异地多活 + 消息回放:金融级数据一致性容灾架构设计与演练
spring boot·金融