代码:
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框架。跪求答案!!!!

解决方案 »

  1.   

    我记得貌似用Spring的事务标签,在方法前加上就可以,你参考下。
      

  2.   

    楼上说的是用注解,楼主没用注解,不过我也是建议楼主用注解试试,在两个方法前都加@transactional就可以达到两个方法同时回滚(如果异常)
      

  3.   

    你方法前面加上@transactional注解看看
      

  4.   

    看你的事务处理配置到哪个层上,你的代码应该配置到了Service层了
    还有就是你可以手动添加事务处理
      

  5.   

    我在service类之前加了@transactional应该是对所有方法吧,但是还是没有用
      

  6.   

    spring的声明式事务主要有两种形式:基于注解的和AOP代理式
    基于注解的事务不仅需要添加注解@Transactional,同时需要使用元素<tx:annotation-driven>打开事务管理。而AOP代理的事务是在xml配置文件中配置即可,就像LZ使用的那样,但是事务的默认回滚规则:抛的异常不能是checked异常。
    当然可以指定特定的异常用于回滚,怀疑抛出的异常不是runtime异常
    LZ在配置<tx:method name="*" read-only="false" propagation="REQUIRED"/> 中添加
    rollback-for="Exception"试试