歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring @Transactional 如何開啟事務

Spring @Transactional 如何開啟事務

日期:2017/3/1 10:07:54   编辑:Linux編程

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. {
  3. @Transactional
  4. public void addUser(User user) throwsException
  5. {
  6. Session session =sessionFactory.getCurrentSession();
  7. session.save(user);
  8. }
  9. }

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