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
publicvoidaddUser(User user) throwsException
{
Session session =sessionFactory.getCurrentSession();
session.save(user);
}
}
//当然,声明式事务管理实质也是用AOP实现的,此时取得的一个Proxy..
UserService userService = (UserService) beanFactory.getBean("userService");
User user =newUser();
user.setName("Mark");
userService.addUser(user);//在执行这一句时,应该是调用Proxy来开启一个事务,并绑定到某个上下文中,我们跟进去看看
1
2
3
下一页