有业务类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框架集成。
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框架集成。
解决方案 »
- hibernate search lucene搜索的用法
- 要从读取exel数据生成图表,再写入到pdf中,用什么开发包好
- 怎样解析XML速度更快
- 请教各位前辈,SQLSERVER+ejb2.0的JBOSS项目用什么环境做比较好
- eclipse莫名其妙的报错
- 连接Oracle数据库报错"Invalild oracle URL"
- 在jsp中用jdbc-odbc连接sql srver的问题!
- 做一个密码随机生成类遇到的问题 各位帮忙
- XML:什么时候利用sax,什么时候利用dom?
- Jbuilder8试用光盘是不是有问题?
- 想做个网站,大家能给点建议么
- jsp+servlet+javabean+tomcat+mysql/sql server+jdbc
改为<tx:method name="update*" propagation="REQUIRES_NEW"/>即可。