Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Spring @Transactional 如何开启事务

Spring @Transactional 如何开启事务java.lang.Objectorg.springframework.transaction.support.TransactionSynchronizationManager--------------------------------------------------------------------------------public abstract class TransactionSynchronizationManagerextends ObjectCentral helper that manages resourcesand transaction synchronizations per thread.为每个线程管理资源和事务的中心helperhibernate.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的上下文中查找 当前的Session3:找到后返回当前的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来开启一个事务,并绑定到某个上下文中,我们跟进去看看