为啥hibernate乐观锁有时候成功有时失败?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥hibernate乐观锁有时候成功有时失败?相关的知识,希望对你有一定的参考价值。

就是同时操作并发乐观锁成功,不同时操作但页面都同时点开但是不同时提交乐观锁不成功

参考技术A 针对你上面的问题,举个例子你就可以明白了...例如若有两个客户端,A客户先读取了帐户馀额1000元,之後B客户也读取了帐户馀额1000元的资料,A客户提取了500元,对资料库作了变更,此时资料库中的馀额为500元,B客户也要提取300元,根据其所取得的资料,1000-300将为700馀额,若此时再对资料库进行变更,最後的馀额就会不正确。 参考技术B 每次操作直接将事物提交即可,我上次也发生了并发死锁的现象,就是这样解决的,给个事例String hqldelete="delete PactRecord where id="+id;
Session session=getSession();
Query q=session.createQuery(hqldelete);
q.executeUpdate();
Transaction tx =session.beginTransaction();
tx.commit();知道了道理,就好解决了啊,就像楼下说的A客户取了500,提取是时候我将事物提交了,数据就只剩下500了,B客户再取,你想数据还会有错吗?呵呵

HIbernate乐观锁与悲观锁

悲观锁

从加载对象就开始锁定。修改过程中一直是锁。直到commit()提交后再解锁。只需要在加载对象时加上(LockOptions.UPGRADE)即可,如下所示

Info info=session.load(Info.class,"p003",LockOptions.UPGRADE);

这样带来的问题就是,当访问量大的时候就会造成排队等待的后果。

乐观锁

      相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个"version"字段来实现。
  乐观锁的工作原理:读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

配置如下:

1.在表中加一个字段version
2.在实体类中加一个属性version
3.在映谢文件中配置<version name="version"> 位置 放在<id></id>下面

代码不做改变。

 

当没有在数据库中设置version字段时,该如何利用乐观锁原理进行机制实现呢? 如下所示:


update info set name=?,sex=?,nation=?,birthday=? where code=? and name=? and sex=? and nation=? and birthday=?

executeUpdate() int-更新的行数0----并发重突了





以上是关于为啥hibernate乐观锁有时候成功有时失败?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate基础24:乐观锁和悲观锁

hibernate基础24:乐观锁和悲观锁

HIbernate乐观锁与悲观锁

悲观锁乐观锁

Jmeter进行登录接口测试时,为啥有时登录成功,有时登录失败?求大神指点~

什么是乐观锁?