悲观锁和乐观锁
来源:互联网 发布:住范儿 价格 知乎 编辑:程序博客网 时间:2024/06/03 22:53
一、悲观锁
Hibernate本身不提供悲观锁的实现,需要依赖数据库的本身实现。
当数据库里对应的数据被悲观锁锁定时,其他人就不能读取和修改被锁定的数据,该数据的资源一直被一个人霸占着,直到该用户结束操作。
Hibernate悲观锁的使用:
调用session的get()或load()方法
调用session的lock()方法
调用Query的setLockMode()方法
通过以上三种方式将锁模式指定LockOptions.UPGRADE
上代码:
Employee emp1=(Employee)session.load(Employee.class, 1001,LockOptions.UPGRADE) ;//开始上锁,后面的都查不到数据
Employee emp2=(Employee)session.get(Employee.class, 1001,LockOptions.UPGRADE);
Query query=session.createQuery("from Employee where eno=1001");
query.setLockOptions(LockOptions.UPGRADE);
Criteria c=session.createCriteria(Employee.class);
c.setLockMode(LockMode.UPGRADE);
注:由此可见资源一直被霸占,所以悲观锁适合短事务
二、乐观锁
乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问该数据资源,因此不作数据库层次上的锁定。为了维护正确的数据,乐观锁使用应用程序上的版本控制(由程序逻辑来实现的)来避免可能出现的并发问题。
Hibernate的乐观锁可以通过两种方式实现:
*版本控制
*时间戳
具体可以这样操作:在实体类t中添加version成员变量
在*.hbm.xml中添加<version>元素映射版本属性
注:
当Hibernate初始插入一条新Account记录时,会自动将其版本字段version进行初始化。
当更新某一个Account对象时,Hibernate会根据该对象的id和version属性匹配更新的数据库数据
如果存在匹配的记录,就更新该记录,并且把version列的值+1
如果不存在匹配的记录,那么Hibernate抛出过期对象状态异常-StaleObjectStateException。。
- 悲观和乐观锁
- 乐观锁和悲观锁
- 悲观锁和乐观锁
- 乐观锁和悲观锁
- 乐观锁和悲观锁
- 悲观锁和乐观锁
- 乐观锁和悲观锁
- 悲观锁和乐观锁
- 悲观锁和乐观锁
- 悲观锁和乐观锁
- 悲观锁和乐观锁
- 乐观锁和悲观锁
- 乐观锁 和 悲观锁
- 悲观锁和乐观锁
- 乐观锁和悲观锁
- 乐观锁和悲观锁
- 乐观锁和悲观锁
- 乐观锁和悲观锁
- HDU 1394 Minimum Inversion Number
- Android属性动画简单总结
- Java的基本数据类型
- 秋招总结--那些挂掉的面试
- sshpass的简单使用和缺陷
- 悲观锁和乐观锁
- CodeIgniter 完美解决URL含有中文字符串
- spark dataframe dataset reducebykey用法
- 游标
- Unity小知识整理==》持续更新
- 二维码的生成与扫描-Android
- location.href的用户总结
- 20170927_快排应用_将数组中的大小写字母分开
- 一个完整的react router 4.0嵌套路由的例子如下