spring中@transactional的疑惑

来源:互联网 发布:海岛奇兵所有升级数据 编辑:程序博客网 时间:2024/05/01 09:22

在项目中遇到了奇怪的问题,如下

 

 原因:酒肆service里有两个函数

ClassPlayerRestaurantService{

//刷新酒肆

@transctional

public void  refreshPlayerRestaurant(int id){

        PlayerRestaurant playerRestaurant = playerRestaurantDao.read(id);

        //增加酒肆次数

        addPlayerRestaurant(id,count,type);

        //更新酒肆时间

        setPlayerRestaurantTime;

}

@transctional

addPlayerRestaurant(intid,int count,int type){

}

 

}

refreshPlayerRestaurant在其他类中调用时,酒肆次数增加,时间刷新,表现正常。

在类内调用时只刷新了时间,而次数未增加。


原因分析

这两个函数是被spring托管的

上个版本是在PlayerRestaurantService之外调用的refreshPlayerRestaurant,所以refreshPlayerRestaurant addPlayerRestaurant两个嵌套事务被当成一个大的事务一起提交到数据库。因此是正确的。

这个版本加了酒肆次数提示,将refreshPlayerRestaurant挪到了PlayerRestaurantService里面另外一个函数里。@transctional

spring托管的类内部失效了,这样的话在调用refreshPlayerRestaurant时就只会更新时间,不会增加次数。

第一次bug修改的话是把更新酒肆时间部分挪到了addPlayerRestaurant(intid,int count,int type)里面,但是没有考虑到这个函数在升级奖励时也调用了,这样升级的时候就会把时间更新到后面去了。