日期:2014-05-19  浏览次数:20656 次

hibernate 并发问题
public String quit(GameUser gameUser) {
String message = "";

ArmyGroup ag = gameUser.getArmyGroup();

session.lock(gameUser, LockMode.UPGRADE);
gameUser.setArmyGroup(null); // 更新个人
commonManager.update(gameUser);

return message;
}
请教一下如3个下问题:
1.这段代码中用到的悲观锁, 会不会产生脏数据呢?
因为传过来的 gameUser可以是很早以前就读取的, 到这里才 lock 可能就已经不是最新数据。
2. 如果再这里重新 session.load( , ,LockMode) 这样的话就多查询了一次,但是应该可以相对避免并发问题。
3. 如果一条数据 load出来, 再用 lock 锁住, 这样不是在数据库执行了两次, 性能是不是很不好呢。

如何解决这些问题呢?请大家帮帮忙解答一下, 不胜感激!

------解决方案--------------------
1、这段代码中用到的悲观锁, 会不会产生脏数据呢?
—— 有可能,如你所分析;

2、 如果再这里重新 session.load( , ,LockMode) 这样的话就多查询了一次,但是应该可以相对避免并发问题。
——可以,但其实仍存在问题,就是此时你重新读取的话,这个gameUser跟之前的不一样你该怎么办?

3. 如果一条数据 load出来, 再用 lock 锁住, 这样不是在数据库执行了两次, 性能是不是很不好呢。
——可以在第一次load的同时就lock住,只执行一次,类似于:
Select * From TABLE Where .... For Update