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")
上述第一点是未验证的,现在我们来分析一下源代码:
- Public UserService
- {
- @Transactional
- public void addUser(User user) throwsException
- {
- Session session =sessionFactory.getCurrentSession();
- session.save(user);
- }
- }
- //当然,声明式事务管理实质也是用AOP实现的,此时取得的一个Proxy..
- UserService userService = (UserService) beanFactory.getBean("userService");
- User user = new User();
- user.setName("Mark");
- userService.addUser(user); //在执行这一句时,应该是调用Proxy来开启一个事务,并绑定到某个上下文中,我们跟进去看看