如何感知当前是否存在事务

Spring 事务传播需要方法感知到当前是否存在事务,这是如何实现的呢?

阅读 3.3k
1 个回答

Spring事务管理器(spring-tx)里有个关键的资源容器:TransactionSynchronizationManager,通过ThreadLocal 存储事务相关资源,比如:

A Method -> B Method:

A Method:

  1. begin tx
  2. 绑定事务资源(比如connection) TransactionSynchronizationManager

B Method:

  1. 从TransactionSynchronizationManager查找,是否有绑定的资源
  2. 有就是存在事务,没有就不存在

当然上面介绍的只是基本原理,为了实现嵌套的事务传播(比如独立事务),还需要有挂起(suspend)/恢复(resume)等操作,不过原理也很简单

A Method -> B Method(New TX):

A Method

  1. begin tx
  2. 绑定事务资源(比如connection) TransactionSynchronizationManager

执行 B Method 之前,由于 B 定义为一个新事物,所以此时将 A 事务挂起,方法还没结束,挂起的这个 A 事务数据直接就局部变量就好

B Method

  1. begin tx
  2. ......
  3. commit

B 结束之后回到刚才挂起的位置,对 A 事务进行恢复,然后commit 就完成了

就……这么简单,更多的介绍可以参考我之前写的一篇文章《Spring 的事务管理》

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题