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的数据源用的同一个。
  • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
相关推荐
山甫aa12 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
程序员爱钓鱼12 小时前
Rust Associated Type关联类型详解:为Trait定义内部类型
前端·后端·rust
程序员爱钓鱼12 小时前
Go 编程实战:匿名函数 Anonymous Function——没有名字的函数与灵活回调
后端·面试·go
鱼鳞_12 小时前
热门八股-JVM
java·jvm
ly768912 小时前
XML 从入门到实践:语法、命名空间、XPath、XSD 与 Java 安全解析
xml·java·python
长谷深风11112 小时前
好的 Tool Schema,不是字段越全越好
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计
IT 行者12 小时前
用 HiddenHttpMethodFilter 解决浏览器不支持 PUT/DELETE/PATCH 的问题
java·spring
晚安code12 小时前
Redis 内存淘汰策略实战:什么时候淘汰、怎么选、怎么防缓存击穿
java·redis·缓存
goyeer12 小时前
Liunx日志管理与journalctl
java·linux·运维·服务器·运维开发·信息化·信息化企业管理
卷无止境12 小时前
FastAPI 后台任务的边界,以及 Celery、Redis 与自建调度系统的选择
后端·python