现在基本设置都很好,我开始尝试事务。Struts + Spring + Hibernate注释事务管理器。这是Action中的示例代码,将调用服务类:
userService.addUser();
这是addUser()服务类中的方法:
addUser()
@Transactional(value="deu" ) public void addUser() { userDao.addUser(); this.addUser2(); }
首先,我调用addUser了userDao,它将插入一个用户。其次,我addUser2在该服务类中调用了另一个方法。
addUser
addUser2
@Transactional(value="deu" , propagation=Propagation.REQUIRES_NEW ) public void addUser2() { //should be a new transaction and will not affect the previous one. //this one will fail but should not affect the previous one. userDao.addUserFail(); }
由于PK为空,因此此操作将失败。我想第二个呼叫(addUser2)将失败,但不会影响前一个。但是,未插入用户。
如果我仅致电:
@Transactional(value="deu" ) public void addUser() { userDao.addUser(); //this.addUser2(); }
它正在工作,这意味着数据库等基本设置没有错。
任何的想法?
Spring的声明式事务处理使用AOP代理进行工作。当您获得事务性bean时,实际上您会获得一个代理,该代理包装您的bean实例,拦截方法调用,必要时启动事务,然后调用实际bean的方法,然后在必要时提交或回滚事务。
但是您是从同一个bean内的另一个方法调用bean的方法,因此代理被绕过,并且无法应用任何事务行为。
将方法放在另一个bean中,或使用AspectJ,后者检测字节码并可以拦截bean内部方法调用。
有关更详细的说明,请参见Spring文档。