有业务类A其中有方法a,数据访问类B其中有方法b1,b2,我要在a中调用b1和b2,要求b1,b2要么同时成功,要么同时失败,声明式事务应该怎么写呢?如下例用户发布一篇文章增加10积分,当用户积分达到1000分时,自动升为高级会员;package com.prod.bizimpl;
public class UserBizImpl implements UserBiz {

private UserDao userDao=null; public void updateAdvanceUser(Users user) {

                 userDao.addUserPoint(user);
                 userDao.updateUserType(user);
}
}
package com.prod.daoimpl;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao { public boolean addUserPoint(Users user) {                 //此处应用super.getHibernateTemplate()实现给用户增加10积分
         }         public boolean addUserPoint(Users user) {                 //此处应用super.getHibernateTemplate()实现将该用户的类型改为高级会员
         }
}
事务配置如下:<bean id="myTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <tx:advice id="txAdvice"
transaction-manager="myTransactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="productMethods"
expression="execution(* com.prod.bizimpl.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="productMethods" />
</aop:config>
经测试若 userDao.updateUserType(user)方法执行失败,userDao.addUserPoint(user)方法内操作不会回滚,这就造成用户积分增加了(恰好积分到1000时),可用户类型却修改失败了,声明式事务不是把事务聪DAO层提高到BIZ层吗,public void updateAdvanceUser(Users user)内的代码不是运行在一个事务里吗,如果出现异常,这个方法内的代码不是都要回滚的吗,为什么不行呢,不知道是我对声明式事务的理解有错误,还是配置有问题。个人猜测可能是DAO类中应用super.getHibernateTemplate()实现数据库操作时,DAO类的方法中已经有事务了,所以才造成不能再回滚,如果是这样的话有什么方法解决吗,难道应用声明式事务后,DAO类中就不能再用super.getHibernateTemplate()去做操作了吗?请高手指点迷津!!!本例应用SSH框架集成。