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来开启一个事务,并绑定到某个上下文中,我们跟进去看看 

相关推荐