昨天遇到一个有关事物方面的问题,请大家帮忙看看,问题出在了什么地方,谢谢!
具体问题描述:根据B表同步A表的数据,结果service方法返回后B表的数据已处理标志没有更新,程序在第二次同步数据时B表的数据才能更新。具体情况见下面代码的注释。
事物配置文件:
tx:attributes
rollback-for="java.lang.Exception" /> propagation="REQUIRED" rollback-for="java.lang.Exception" />
rollback-for="java.lang.Exception" /> propagation="REQUIRED" rollback-for="java.lang.Exception" />
rollback-for="java.lang.Exception" /> propagation="REQUIRED" rollback-for="java.lang.Exception" />
/tx:attributes /tx:advice
<aop:config>
<aop:pointcut expression="execution(* com.mdc.jiangsu114weixinServer.service..*.*(..))" id="transactionPointCut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointCut" />
</aop:config>
service中的方法:
public List getPageData(Page page){
List list =this.merchantSynMapper.merchantsynInfoListPage(page);
return list;
}
public void synchronizeMerchant(MerchantSyn merchantSyn) {
//判断A表是否有数据,如果有则更新,没有则插入数据
int count = merchantSynMapper.getMerchantCount(merchantSyn);
if(count>0){
merchantSynMapper.updateMerchantData(merchantSyn);
}else{
merchantSynMapper.insertMerchantData(merchantSyn);
}
//更新B表的数据
//该方法第一次执行完时,下面的语句没有把表中的数据SynFlag更新,
//但,第二次该方法执行完时,下面的语句把数据库中的字段SynFlag更新了
merchantSyn.setSynFlag("1");
merchantSynMapper.updateMerchantSynDealFlag(merchantSyn);
}
controller中调用service中的方法:
Page page = new Page();
page.setCurrentPage(1);
page.setPageSize(20);
page.setEntityOrField(true);
//只有一条测试数据
List<MerchantSyn> list = this.merchantSynService.getPageData(page);
if(list!=null && list.size()>0){
while(list.size()>0){
for(int i=0;i<list.size();i++){
this.merchantSynService.synchronizeMerchant(list.get(i));
}
//由于第一次SynFlag没有更新,所以下面的语句还会查询到数据,即会进行第二次调用方法synchronizeMerchant(..);
list = this.merchantSynService.getPageData(page);
if(list==null || list.size()<=0){
break;
}
}
}