歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring @Transactional 如何開啟事務

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

上述第一點是未驗證的,現在我們來分析一下源代碼:

  1. Public UserService 
  2.    @Transactional 
  3.    public void addUser(User user) throwsException 
  4.    { 
  5.       Session session =sessionFactory.getCurrentSession(); 
  6.      
  7.       session.save(user); 
  8.    } 

 

  1. //當然,聲明式事務管理實質也是用AOP實現的,此時取得的一個Proxy..  
  2. UserService userService = (UserService) beanFactory.getBean("userService"); 
  3.                
  4. User user = new User(); 
  5. user.setName("Mark"); 
  6.                
  7. userService.addUser(user);  //在執行這一句時,應該是調用Proxy來開啟一個事務,並綁定到某個上下文中,我們跟進去看看 
Copyright © Linux教程網 All Rights Reserved