秦之流浪者 2014-08-22 03:24 采纳率: 0%
浏览 1807

spring+mybatis事物配置的问题

昨天遇到一个有关事物方面的问题,请大家帮忙看看,问题出在了什么地方,谢谢!

具体问题描述:根据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;
    }
 }

}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 12:24
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你的事务配置似乎存在问题,因为Spring Boot 5.0版本提供了@Transactional注解来自动管理事物,并且不需要单独配置@TransactionAttribute。你提到的tx:attributestx:advice标签是旧版本事务配置的示例。

    解决此问题的方法如下:

    1. tx:attributes标签移除:
    <tx:attributes rolename="default">
        <!-- 其他属性 -->
    </tx:attributes>
    
    1. 更新tx:advice标签以使用@Transactional注解:
    <tx:advice transaction-manager="transactionManager">
        <tx:method name="updateMerchantData" rollbackFor="java.lang.Exception"/>
        <tx:method name="updateMerchantSynDealFlag" rollbackFor="java.lang.Exception"/>
    </tx:advice>
    
    1. 在你的服务类中添加@Transactional注解:
    @Service
    @Transactional
    public class MerchantSynService {
        //...
    }
    

    现在,Spring Boot将自动管理事务并确保所有操作都是在一个事务中完成的。 请注意,如果你仍然需要使用@TransactionAttribute,你可以考虑使用Spring Data JPA或其他持久层框架提供的事务支持。

    评论

报告相同问题?