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的数据源用的同一个。
  • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
相关推荐
艾莉丝努力练剑4 小时前
【Linux进程(四)】深入理解 Linux O(1) 调度器:双队列轮转与进程优先级机制——如何避免进程饥饿,实现公平且高效的进程调度
java·大数据·linux·运维·服务器·人工智能·安全
JaguarJack4 小时前
PHP 之高级面向对象编程 深入理解设计模式、原则与性能优化
后端·php
郑州光合科技余经理5 小时前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
章豪Mrrey nical11 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
超级大只老咪12 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶12 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长12 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子12 小时前
JDK 安装配置
java·开发语言
星哥说事12 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink12 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端