一个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层了
还有就是你可以手动添加事务处理 --------------------编程问答--------------------
我在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