悲观锁:在应用程序中显式为数据资源加锁。悲观锁假定当前事务操纵数据资源时,肯定还会有其他事务访问该资源,为了避免当前事务的操作受干扰,先锁定资源,它能防止丢失更新和不可重复读等并发问题,但会影响并发性能。
乐观锁:假定当前事务操纵数据资源时,不会有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。
悲观锁有两种实现方式
方式一:在应用程序中显式指定采用数据库系统的独占锁来锁定数据源。
方式二:在数据库表中添加记录状态的LOCK字段,取值"Y","N",分别表示被锁定与空闲状态。
select ... for update 显式指定采用独占锁查询记录。执行事务持有锁,直到事务结束释放锁。在Hibernate中,当通过Session的get()和Load()加载一个对象时,采用
session.get(Account.class,new Long(1),LockMode.UPGRADE); 声明使用悲观锁
锁定模式LockMode
LockMode.NONE 默认值 如果缓存中存在对象,直接返回引用,否则通过select到数据库中加载对象。
LockMode.READ 不管是否存在对象,总是通过select到数据库中加载对象。
LockMode.UPGRADE 不管是否存在对象,总是通过select到数据库中加载对象。如果数据库系统支持悲观锁(如ORACLE与MYSQL),就执行select ... for update。如果不支持,就执行普通的select语句。
LockMode.UPGRADE_NOWAIT 同LockMode.UPGRADE相同,此外,对ORACLE数据库,执行select ... for update nowait,表示如果不能立刻获得悲观锁,不等待其他事务释放锁,而是抛出锁定异常。
乐观锁的实现
方式一:使用<version>元素,在POJO中添加一个代表版本信息的属性version,在数据库表中添加相应字段,在mapping文件中,紧跟<id>元素,添加<version name="version" column="version">在程序中捕获StaleObjectStateException。以后的数据操作中,每次都会自动更新version字段(自动加1)。
方式二:使用<timestamp>元素,基本与<version>同,POJO中添加属性(这是一个DATE属性),当持久化对象时,Hibernate会用当前的系统时间来为它赋值。
理论上,<version>比<timestamp>更安全,因为后者只能精确到秒。
分享到:
相关推荐
很好的描述Hibernate的悲观锁和乐观锁,
Hibernate高级特性,悲观锁与乐观锁的应用和区别,及两者之间的区别。
NULL 博文链接:https://12345678.iteye.com/blog/721836
Hibernate乐观锁和悲观锁分析,针对在使用HIBERNATE时怎么配置乐观锁进行了详细的范例讲解
Hibernate的乐观锁与悲观锁的文档,帮助学习Hibernate的乐观锁与悲观锁,让你们学得更轻松。
NULL 博文链接:https://cdxs2.iteye.com/blog/1938245
其中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式...
Hibernate锁机制_悲观锁和乐观锁
hibernate的乐观锁和悲观锁,两种锁搞定一切
主要介绍了Hibernate实现悲观锁和乐观锁的有关内容,涉及hibernate的隔离机制,以及实现悲观锁和乐观锁的代码实现,需要的朋友可以了解下。
主要介绍了Hibernate悲观锁和乐观锁实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...
NULL 博文链接:https://jordanyangwei.iteye.com/blog/313756
hibernate利用锁的相关功能详解,分为乐观锁和悲观锁。希望各位喜欢。
001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate ...025 hibernate 悲观锁、乐观锁 026 hibernate 操作树形结构 027 hibernate 查询语言(HQL) 028 hibernate 缓存(性能优化策略) 029 hibernate 抓取策略
乐观锁version 对于在Hibernate中的乐观锁和悲观锁的学习
HibernateTestHibernate乐观锁和悲观锁的学习和实践
性能------------缓存 延迟加载 事务 悲观 乐观锁
该资源主要是分析:乐观锁解决事务并发.乐观锁校验测试, 基于hiber管理的悲观锁实现