在hibernate设定了read-commited的隔离级别情况下,可能会出现不可重复读或者幻读(这个目前不考虑,只考虑更新的场景)的情况,但可能通过设定悲观锁和乐观锁避免这些情况。
两种方式解决不可重复读:
悲观锁
给要改的数据加把锁,其他的事务不能动;它主要依赖数据库,在hibernate中,一般LockMode只设置upgrade,代码如下:
// 这样写转成的sql语句会变成...for update
Group g1 = (Group) s.load(Group.class,1, LockMode.UPGRADE);
乐观锁
给某条记录设置一个version字段,有人改过,version+1
事务在更新的时候检查一下version字段和它取出数据时候的version字段是否相同即可
// 在entity中增加一个字段version
private int version;
@version
pulic getVersion(){
return this.version;
}