Spring @Transactional 如何开启事务
java.lang.Object
org.springframework.transaction.support.TransactionSynchronizationManager
public abstract class TransactionSynchronizationManager
extends
Object
Central helper that manages resourcesand transaction synchronizations per thread.
为每个线程管理资源和事务的中心helper
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext时,
@Transactional,Spring的事务管理器HibernateTransactionManager.doBegin()方法开启的Session和事务 就是绑定到TransactionSynchronizationManager的上下文中的..
SpringSessionContext.currentSesssion()方法就是在TransactionSynchronizationManager的上下文中查找的..
上文回顾:
现在对于hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext时的getCurrentSession()就很清楚了:
1:@Transactional声明的方法执行时,Spring的TransactionManager会自动Open Sesion,自动开启事务,并且将此Sesion绑定到SpringSessionContext(实际上是TransactionSynchronizationManager的ThreadLocal的Map)中..
2:SessionFactory.getCurrentSession()方法执行时,调用SpringSessionContext.currentSession()从TransactionSynchronizationManager的上下文中查找 当前的Session
3:找到后返回当前的Session,找不到,则返回HibernateException("NoSessionfound for current thread")
上述第一点是未验证的,现在我们来分析一下源代码:
先进入到JdkDynamicAopProxyimplements.invoke()方法
然后到ReflectiveMethodInvocation. proceed(),这里调用TransactionInterceptor.invoke(this)方法:
典型的拦截器模式:
1:按需开启事务
2:递归执行下一个拦截器 或 执行代理目标方法
3:提交事务
进入createTransactionIfNecessary(tm,txAttr, joinpointIdentification), 其中的tm.getTransaction(txAttr); //这一句应该是取得事务的,跟进去
……………………………………….
AbstractPlatformTransactionManager.getTransaction()方法:
如果当前有事务,取出并根据事务传播行为的配置去处理,如果当前没有事务,调用doBegin开启一个新事务
HibernateTransactionManager.doGetTransaction()方法:
尝试获取当前已绑定到TransactionSynchronizationManager的上下文的事务,主要为事务传播行为而设
HibernateTransactionManager.doBegin()方法:
开启一个新的事务,并放进TransactionSynchronizationManager的上下文中,绑定到当前线程)
Spring @Transactional 如何开启事务 总结:
@Transactional声明的方法执行时会调用AbstractPlatformTransactionManager.getTransaction()取得当前事务
而getTransaction()的执行流程如下:
1:尝试获取当前已绑定到TransactionSynchronizationManager的上下文的事务
(调用HibernateTransactionManager.doGetTransaction()方法)
2:如果取得已存在的事务,则根据事务传播属性的设置来处理
(调用AbstractPlatformTransactionManager.handleExistingTransaction()方法)
3:如果没有事务,则打开新的Session,开启新的事务,并将该Session和事务绑定到TransactionSynchronizationManager的上下文中
(调用HibernateTransactionManager.doBegin()方法)
-------------------------------------------------
核心还是理解TransactionSynchronizationManager,要懂得Spring的TransactionManager开启事务后是以键值对<SessionFactory,SessionHolder>形式
存放到TransactionSynchronizationManager的ThreadLocal的Map的上下文中(以ThreadLocal的方法与当前线程绑定).
分享到:
相关推荐
主要介绍了Spring @Transactional工作原理详解,具有一定借鉴价值,需要的朋友可以参考下。
我們使用Spring Framework裡,在Service 的 Method 給予@Transactional 系統就會去管理transaction,我們是在哪裡做了甚麼設定嗎? 為什麼下的這個Annotation成功會commit失敗會rollback呢? Transaction 管理做了...
Spring中@Transactional事务回滚(含实例详细讲解,附源码)Java开发Java经验技巧共8页.pdf.zip
本代码使用H2内存数据库演示spring事务使用,包括编程式事务,声明式事务@Transactional使用,自定义事务事务注解实现自定义事务管理器
Spring3事务管理——使用@Transactional 注解.rar
spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可
主要介绍了spring @Transactional 无效的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在本篇文章里小编给大家整理了关于Spring声明式事务@Transactional详解内容,需要的朋友们可以参考下。
@Transactional实现原理.txt
本篇文章主要介绍了浅谈Spring中@Transactional事务回滚及示例(附源码),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
今天小编就为大家分享一篇关于springboot中事务管理@Transactional的注意事项与使用场景,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了Spring @Transactional注解失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题,需要的朋友可以参考下
Spring中的@Transactional事物回滚实例源码
什么情况会导致@Transactional事务失效?
今天我们来探讨一个有意思的spring源码问题,也是一个学生告诉了我现象我从源码里面找到了这个有意思的问题。 首先我们看service层的代码案例,如下: @Service("transationServiceImpl") public class ...
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,
主要介绍了Java注解@Transactional事务类内调用不生效问题及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring源码学习十二:@Transactional是如何工作的1