• 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的数据源用的同一个。
    • 如果在原来的事务下再开线程做业务操作,则事务和主线程事务是不同的(连接不同)
  • 相关阅读:
    C++ Qt开发:QFileSystemModel文件管理组件
    网络流量监测与调度技术研究
    分布式技术之dubbo
    C++中输入输出速度的优化
    FFmpeg源代码简单分析-其他-libswscale的sws_scale()
    显卡、显卡驱动版本、cuda版本和Pytorch相互之间的依赖关系
    AI全栈大模型工程师(十九)Semantic Kernel
    vivo霍金实验平台设计与实践-平台产品系列02
    【脑机接口】POINT疗法或将为卒中后失语患者带来新希望!
    【机器学习】scikitLearn正则化l1,l2,提前停止
  • 原文地址:https://blog.csdn.net/u014087707/article/details/132846290