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的数据源用的同一个。
  • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
相关推荐
青春不朽5122 小时前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
java·python·list
ModStart3 小时前
通知:两个致命紧急PHP漏洞需要修改
后端
小羊没烦恼!3 小时前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
哇嘎呀3 小时前
RHCSA题目
java·服务器·前端
高频因子挖掘机3 小时前
A股量化第一步:如何利用 QuantDash 实现日K数据清洗、前复权校验与缺失值处理
后端·github·api
SL_staff3 小时前
企业知识平台细粒度权限设计实践:从成员组、文档库到操作级的三层防线
java·开源·全栈
周厉3 小时前
ERP系统全景解析:核心模块与业务逻辑框架
java·服务器·前端
张彦峰ZYF4 小时前
借与还之间:连接池设计的技术难点与实现推演
后端·架构·连接池·服务端与协议·无锁借还与尾延迟·失效模式与探活时机·状态污染与泄漏检测
LEE4 小时前
为什么你的 Claude Code 还在转圈等,别人的已经干完三件事了?
前端·后端·ai编程
喵个咪4 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
后端