当前位置:编程学习 > JAVA >>

一个service方法中两个并列的更新方法,如何保证数据同时回滚

代码:
public void applyServer(String serverName, String openDate, String email, long workflowId) throws Exception{

/*保存开服申请记录,并得到该记录的主键Id*/
Map<String,Object> openServerParamMap = new HashMap<String,Object>();
openServerParamMap.put("serverName", serverName);
openServerParamMap.put("openDate", openDate);
Map<?,?> saveServerApp =  unionAppDao.saveOpenServerApps(openServerParamMap);
long openserverId = (Long)saveServerApp.get("openserverId");

/*记录工作流*/
Map<String,Object> recordWorkflowParamMap = new HashMap<String,Object>();
recordWorkflowParamMap.put("workflowType", Constant.APPLYSERVERTYPE);
recordWorkflowParamMap.put("workflowId", workflowId);
int ret = unionAppDao.recordApplyUnionWorkflows(recordWorkflowParamMap);

if(ret == Constant.RET_S_SUCCESS){
  Vector v = new Vector<Object>();
  v.add(email);
  v.add(getRoleName(roleId));
 
  /**发送邮件*/
  SendEmail sendMail = new SendEmail();
  sendMail.sendApplyServerEmails(v);
 
}
}

配置文件:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:/TEST</value></property>
</bean>
    <bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
    </bean>
    <aop:config proxy-target-class="true">           
         <aop:advisor pointcut="execution(* com.test.service..*.*(..))" advice-ref="txAdvice" />         
    </aop:config>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>  
             <tx:method name="*" read-only="false" propagation="REQUIRED"/>  
         </tx:attributes>  
    </tx:advice> 

以上方法中如果第二个保存方法recordApplyUnionWorkflows发生异常或者发送邮件sendApplyServerEmails发生异常如何保证两个更新数据库的两个表的数据同时回滚,也就是事务的控制如何做,配置文件中应该如何配置,用上面的配置文件好像不能控制此事务同时回滚,有高手告诉该如何修改么,用的struts+spring+ibatis框架。跪求答案!!!! --------------------编程问答-------------------- 我记得貌似用Spring的事务标签,在方法前加上就可以,你参考下。 --------------------编程问答-------------------- 楼上说的是用注解,楼主没用注解,不过我也是建议楼主用注解试试,在两个方法前都加@transactional就可以达到两个方法同时回滚(如果异常) --------------------编程问答-------------------- 你方法前面加上@transactional注解看看 --------------------编程问答-------------------- 看你的事务处理配置到哪个层上,你的代码应该配置到了Service层了
还有就是你可以手动添加事务处理 --------------------编程问答--------------------
引用 2 楼  的回复:
楼上说的是用注解,楼主没用注解,不过我也是建议楼主用注解试试,在两个方法前都加@transactional就可以达到两个方法同时回滚(如果异常)

我在service类之前加了@transactional应该是对所有方法吧,但是还是没有用 --------------------编程问答-------------------- 我只是来围观一下!! --------------------编程问答-------------------- 两个方法的调取都写到一个方法里面去不行吗,只要那一个方法抛异常就都会回滚的! --------------------编程问答-------------------- spring的声明式事务主要有两种形式:基于注解的和AOP代理式
基于注解的事务不仅需要添加注解@Transactional,同时需要使用元素<tx:annotation-driven>打开事务管理。而AOP代理的事务是在xml配置文件中配置即可,就像LZ使用的那样,但是事务的默认回滚规则:抛的异常不能是checked异常。
当然可以指定特定的异常用于回滚,怀疑抛出的异常不是runtime异常
LZ在配置<tx:method name="*" read-only="false" propagation="REQUIRED"/> 中添加
rollback-for="Exception"试试
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,