Spring @Transactional 如何开启事务

2014-11-24 09:45:08 · 作者: · 浏览: 1

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的上下文(ThreadLocal的Map)中的..


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")


上述第一点是未验证的,现在我们来分析一下源代码: