代码:
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框架。跪求答案!!!!
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框架。跪求答案!!!!
还有就是你可以手动添加事务处理
基于注解的事务不仅需要添加注解@Transactional,同时需要使用元素<tx:annotation-driven>打开事务管理。而AOP代理的事务是在xml配置文件中配置即可,就像LZ使用的那样,但是事务的默认回滚规则:抛的异常不能是checked异常。
当然可以指定特定的异常用于回滚,怀疑抛出的异常不是runtime异常
LZ在配置<tx:method name="*" read-only="false" propagation="REQUIRED"/> 中添加
rollback-for="Exception"试试