锁定老帖子 主题:spring事务管理的控制问题
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-06
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <bean id="userDao" class="hibernate.dao.Dao"> <property name="sessionFactory"><ref local="sessionFactory"/></property> </bean> <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="target"><ref local="userDao"/></property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="query">PROPAGATION_REQUIRED,readOnly</prop> <prop key="update">PROPAGATION_REQUIRED</prop> <prop key="execute">PROPAGATION_REQUIRED</prop> </props> </property> </bean> 用spring跟hibernate结合的方式,如果我在插入一条数据时,想往备份数据库的备份表也插入一条同样的记录 例如 public void update() { //从上面的配置文件,得到两个userDaoProxy对象, formalDaoProxy.update(bean); backupDaoProxy.update(bean); } 这样的话,由于正式表与备份表要保持数据一致性,所以,两个update其中一个失败, 另一个都要rollback , 但是这两个Dao, 分别由两个独立事务来自动管理的, commit或rollback都不能干预, 请问怎样可以用代码来控制其rollback?我找了很久都找不到.请教一下大家, 谢谢. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-03-06
有没有service层?
Service层有没有设置transaction? 个人认为,应该在service层做这种事务控制。 |
|
返回顶楼 | |
发表时间:2007-03-06
引用 这样的话,由于正式表与备份表要保持数据一致性,所以,两个update其中一个失败, 另一个都要rollback , 但是这两个Dao, 分别由两个独立事务来自动管理的, commit或rollback都不能干预, 请问怎样可以用代码来控制其rollback?我找了很久都找不到.请教一下大家, 谢谢.
既然使用了声明式事务,还需要手工干预吗? |
|
返回顶楼 | |
发表时间:2007-03-06
Godlikeme 写道 有没有service层?
Service层有没有设置transaction? 个人认为,应该在service层做这种事务控制。 有逻辑事务层, 我上面的public void update()方法,就是在相当于你说的service层做的,但问题是, 我再开一个transaction,怎样能控制当其中一个DaoProxy.update(bean)失败了,另一个update的操作rollback? |
|
返回顶楼 | |
发表时间:2007-03-06
我最主要的问题是,
public void update() { formalDaoProxy.update(bean); //update1 backupDaoProxy.update(bean); //update2 } 最主要的问题是, update1一执行成功,马上被自动commit了,如果接下来update2失败了,那主数据库和备份数据库中的数据就不一致了. 所以我想把两个update,归为一个事务当中,两个update都成功,才两个一起commit. 但是又不想把所有相关代码都重写,所以问一下有没有解决的办法. |
|
返回顶楼 | |
发表时间:2007-03-06
事务应该配置在service上,而不是dao
|
|
返回顶楼 | |
发表时间:2007-03-06
事务应该配置在service上,而不是dao
|
|
返回顶楼 | |
发表时间:2007-03-06
引用 备份数据库的备份表也插入一条同样的记录
备份数据库? 有两个数据库? 如果主表何备份表在一个schema里,只要把最外面的update方法的事务传播途径设置称required就可以了 |
|
返回顶楼 | |
发表时间:2007-03-06
OK,如果我将事务管理放在service层,但是又要用spring和hibernate结合的方式对数据进行存取,各位如何建议我解决这个问题呢?
|
|
返回顶楼 | |
发表时间:2007-03-06
terry_yip 写道 OK,如果我将事务管理放在service层,但是又要用spring和hibernate结合的方式对数据进行存取,各位如何建议我解决这个问题呢?
这里面根本就没有什么问题,你只要给service加上事务代理就ok了,不会有什么问题 |
|
返回顶楼 | |