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")
上述第一點是未驗證的,現在我們來分析一下源代碼: