论坛首页 入门技术论坛

spring事务管理的控制问题

浏览 10853 次
该帖已经被评为新手帖
作者 正文
   发表时间: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?我找了很久都找不到.请教一下大家, 谢谢.
   发表时间:2007-03-06  
有没有service层?
Service层有没有设置transaction?
个人认为,应该在service层做这种事务控制。

0 请登录后投票
   发表时间:2007-03-06  
引用
这样的话,由于正式表与备份表要保持数据一致性,所以,两个update其中一个失败, 另一个都要rollback , 但是这两个Dao, 分别由两个独立事务来自动管理的, commit或rollback都不能干预, 请问怎样可以用代码来控制其rollback?我找了很久都找不到.请教一下大家, 谢谢.


既然使用了声明式事务,还需要手工干预吗?
0 请登录后投票
   发表时间:2007-03-06  
Godlikeme 写道
有没有service层?
Service层有没有设置transaction?
个人认为,应该在service层做这种事务控制。



有逻辑事务层, 我上面的public void update()方法,就是在相当于你说的service层做的,但问题是, 我再开一个transaction,怎样能控制当其中一个DaoProxy.update(bean)失败了,另一个update的操作rollback?

0 请登录后投票
   发表时间:2007-03-06  
我最主要的问题是,

public void update()   
{       
  formalDaoProxy.update(bean);  //update1 
  backupDaoProxy.update(bean);   //update2
}


最主要的问题是, update1一执行成功,马上被自动commit了,如果接下来update2失败了,那主数据库和备份数据库中的数据就不一致了. 所以我想把两个update,归为一个事务当中,两个update都成功,才两个一起commit. 但是又不想把所有相关代码都重写,所以问一下有没有解决的办法.


0 请登录后投票
   发表时间:2007-03-06  
事务应该配置在service上,而不是dao
0 请登录后投票
   发表时间:2007-03-06  
事务应该配置在service上,而不是dao
0 请登录后投票
   发表时间:2007-03-06  
引用
备份数据库的备份表也插入一条同样的记录

备份数据库? 有两个数据库?
如果主表何备份表在一个schema里,只要把最外面的update方法的事务传播途径设置称required就可以了
0 请登录后投票
   发表时间:2007-03-06  
OK,如果我将事务管理放在service层,但是又要用spring和hibernate结合的方式对数据进行存取,各位如何建议我解决这个问题呢?

0 请登录后投票
   发表时间:2007-03-06  
terry_yip 写道
OK,如果我将事务管理放在service层,但是又要用spring和hibernate结合的方式对数据进行存取,各位如何建议我解决这个问题呢?


这里面根本就没有什么问题,你只要给service加上事务代理就ok了,不会有什么问题
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics