hibernate悲观所和乐观锁
来源:互联网 发布:erp订单数据 编辑:程序博客网 时间:2024/06/18 07:47
hibernate支持两种锁:悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)
悲观锁:指的是对数据库数据被外界的修改持保守态度(无论是本系统的事务处理,或者是外部系统的事务处理),在整个数据处理的过程数据都处于锁定的状态。hibernate中的悲观锁,是依靠数据库中的锁机制(因为只有数据库层才能控制本系统和外部系统对数据库的数据操作)。
例如”select * from user where userName=’Johnson’ for update“这条sql锁定了user表中所有userName=’Johnson’的记录,本次事务提交之前,外界无法修改这些记录。
hibernate中的悲观锁,也是基于数据库的锁机制实现的。
- 1
- 2
- 3
- 4
上面的代码中setLockMode第一个参数指定了别名为user的返回的记录进行上锁。
生成的sql为:
- 1
- 2
- 3
可见hibernate通过数据库中的for update子句实现悲观锁机制。
hibernate的加锁模式:
LockMode.NONE : 无锁机制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取。
LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE :利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock
相对于悲观锁,乐观锁的锁机制就显得比较宽松。悲观锁大部分情况依靠数据库的锁机制实现,来保证最大程度的独占性。但另一方面数据库的开销非常大,尤其对于长事务来说。
乐观锁大部分是基于数据版本(version)记录机制实现。即在数据表中增加一个版本标识,读取出数据时,连带这个版本标识一起读出,更新数据的时候,把版本标识加1。将提交版本数据跟数据库中当前版本信息对比,如果提交的数据中版本号大于数据表当前的版本号,则允许更新,否则认为是过期数据。
hibernate的乐观锁主要有两种方式:version和时间戳
举个配置的例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
乐观锁带来的负面问题:如果两个不同的事务同时读取一条数据并进行更新时,程序会报异常:org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)。这时候就要捕获异常,然后处理并提醒用户再次提交。
同样,乐观锁也有局限性。就是只控制了本系统的事务并发操作,而外部系统对数据表的操作却无法控制,此时有个解决办法就是:在存储过程里实现乐观锁机制,这样无论是本系统或是外部系统的事务操作,数据库都可以控制。所以,在设计阶段,尽量考虑到各种情况,究竟是在程序端实现好,还是数据库端实现比较好。
- hibernate悲观所和乐观锁
- hibernate中的悲观锁和乐观锁
- hibernate中的悲观锁和乐观锁
- Hibernate 中悲观锁和乐观锁
- hibernate悲观锁和乐观锁
- Hibernate乐观锁和悲观锁
- Hibernate的悲观锁和乐观锁
- hibernate的 悲观锁和乐观锁
- Hibernate 悲观锁和乐观锁
- Hibernate中悲观锁和乐观锁
- Hibernate乐观锁和悲观锁
- Hibernate中悲观锁和乐观锁
- Hibernate中悲观锁和乐观锁
- Hibernate中悲观锁和乐观锁
- hibernate---->悲观锁和乐观锁
- Hibernate悲观锁和乐观锁详解
- Hibernate:悲观锁和乐观锁
- hibernate lockMode(乐观锁和悲观锁)
- axios Post无法传递数据的解决方案
- AngularJS 的作用
- 笔记2017.12.20
- cocos2d的ResolutionPolicy 屏幕适配问题
- Wireshark手机等移动设备抓包
- hibernate悲观所和乐观锁
- 自定义view,移动view的时候抖动很厉害的解决方案
- 排序
- 安装Node.js和npm
- 树莓派3B+ Git服务
- Linux+树莓派3+Python开发总结——python3+pyqt5+matplotlib环境搭建
- CentOS7下PHP7.2安装redis扩展
- java杂记
- Centos7+Mysql5.7实现主从复制