在项目中遇到了奇怪的问题,如下
原因:酒肆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)里面,但是没有考虑到这个函数在升级奖励时也调用了,这样升级的时候就会把时间更新到后面去了。