首页 > 代码库 > HIbernate乐观锁与悲观锁
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乐观锁与悲观锁