spring+hibernate 或 spring+mybatis结构
以前写简单的crud,还没有感觉到问题。最近写游戏,逻辑复杂多了,比如有个功能,要求,用户登陆后,检测用户持有的道具纪录,如果发现有纪录没有的(因为游戏更新,会加新道具),要插入。我这么干的
@service
public class UserInfoServiceImpl implements UserInfoService
{
private GoodsInfoService goodsInfoService;
public GoodsInfoService getGoodsInfoService() {
return goodsInfoService;
}
@Resource
public void setGoodsInfoService(GoodsInfoService goodsInfoService) {
this.goodsInfoService = goodsInfoService;
}
@Override
public boolean selectUserLogin(UserInfo userInfo)
{
List userGoodsInfos = goodsInfoService
.selectUserAllGoods(userId); // 获取玩家所有的道具
//伪代码,
//遍历检测是否有缺少的然后插入新的
userGoodsInfos = goodsInfoService
.selectUserAllGoods(userId); //再次获得新的玩家道具列表
。。。。。。。
}
}
坑爹的是,select用的事务传播级别为support,一般select不需要事务,但是hibernate和mybatis都存在session缓存,在selectUserLogin方法中selectUserAllGoods执行了两次,但是实际上只得到了同样的结果,第二次执行未查询数据库而是直接就从缓存中取得。而实际上结果集在数据库里已经编了,我对这个地方很纠结,不知道应该改造成什么样子,似乎service上面还需要再有一层来处理逻辑,但是service不处理逻辑,那就是纯粹的crud,把dao的工作抢去了。那像我这样检测旧纪录,插入新纪录,插入完后再次查询,并获得新结果集的service层到底该怎么写,如何设置事务传播级别?