悲观锁
在应用程序中显示地为数据资源加锁.悲观锁假定当前事务操纵数据资源时,肯定还会有其它事务同时访问该数据资源,为了避免当前事务的操作受到干扰,先锁定资源.尽管悲观锁能防止丢失更新和不可重复读这类并发问题,但会影响并发性能.
乐观锁
假定当前事务操纵数据资源时,不会有其它事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作.应用程序采用版本控制手段来避免可能出现的并发问题.
LockMode类表示的几种锁定模式
锁定模式
|
描述
|
LockMode.NONE
|
如果缓存中存在对象,直接返回该对象的引用,否则通过select语句到数据库中加载该对象,默认值.
|
LockMode.READ
|
不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象版本一致
|
LockMode.UPGRADE
|
不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象的版本一致,如果数据库系统支持悲观锁(如Oracle/MySQL),就执行select...for update语句,如果不支持(如Sybase),执行普通select语句
|
LockMode.UPGRADE_NOWAIT
|
和LockMode.UPGRADE具有同样功能,此外,对于Oracle等支持update nowait的数据库,执行select...for update nowait语句,nowait表明如果执行该select语句的事务不能立即获得悲观锁,那么不会等待其它事务释放锁,而是立刻抛出锁定异常
|
LockMode.WRITE
|
保存对象时会自动使用这种锁定模式,仅供Hibernate内部使用,应用程序中不应该使用它
|
LockMode.FORCE
|
强制更新数据库中对象的版本属性,从而表明当前事务已经更新了这个对象
|
多个事务并发运行时的并发问题
第一类丢失更新:撤销一个事务时,把其它事务已提交的更新数据覆盖.
第二类丢失更新:不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据.
脏读:一个事务读到另一事务未提交的更新数据.
幻读:一个事务读到另一事务已提交的新插入的数据.
不可重复读:一个事务读到另一个事物已提交的更新数据.
锁的类型和兼容性
共享锁
l 加锁条件:当一个事务执行select语句时,数据库系统会为这个事务分配一把共享锁,锁定被查询的数据.
l 解锁条件:数据被读取后,数据库系统立即解除共享锁.
l 与其它锁的兼容性:如果数据资源上放置了共享锁,还能再放置共享锁和更新锁.
l 并发性能:良好的并发性能.当多个事务读相同数据时,每个事务都会获得一把共享锁,可以同时读锁定的数据.
独占锁
l 加锁条件:当一个事务执行insert,update,delete时,数据库系统会自动对SQL语句操纵的数据资源使用独占锁.如果该数据资源已经有其它锁存在时,无法对其再放置独占锁.
l 解锁条件:独占锁一直到事务结束后才能被解除.
l 与其它锁的兼容性:独占锁不能和其他锁兼容,如果数据资源已经加上了独占锁, 就不能再放置其它锁,同样,如果已经有了其它锁,就不能放置独占锁.
l 并发性能:并发性能较差,只允许有一个事务访问锁定的数据,如果其他事务也需要访问该数据,就必须等待,直到前一个事务结束,解除了独占锁,其它事务才能访问该数据.
更新锁
l 加锁条件:当一个事务进行update操作时,数据库系统会先为事务分配一把更新锁.
l 解锁条件:当读取数据完毕,执行更新操作时,会把更新锁升级为独占锁.
l 与其它锁的兼容性:更新锁与共享锁兼容,即一个资源可以同时放置更新锁和共享锁,但是最多只能放置一把更新锁,这样,当多个事务更新相同的数据时,只有一个事务能获得更新锁,然后再把更新锁升级为独占锁,其它事务必须等到前一个事务结束后,才能获得更新锁,避免了死锁.
l 并发性能:允许多个事务同时读锁定资源,但不允许其它事务修改它.
各种隔离级别所能避免的并发问题
隔离级别
|
是否出现第一类丢失更新
|
是否出现第二类丢失更新
|
是否出现脏读
|
是否出现幻读
|
是否出现不可重复读
|
Serializable串行化
|
否
|
否
|
否
|
否
|
否
|
RepeatableRead可重复读
|
否
|
否
|
是
|
否
|
否
|
ReadCommited读已提交数据
|
否
|
否
|
是
|
是
|
是
|
ReadUncommited读未提交数据
|
否
|
是
|
是
|
是
|
是
|
分享到:
相关推荐
Hibernate 3.2 是一个流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。这个版本的Hibernate引入了许多改进和新特性,旨在提高性能和开发效率。CGlib...
Hibernate提供了LockMode类型的锁,如LockMode.READ、LockMode.WRITE和LockMode.UPGRADE,分别对应不同的锁定级别。 此外,Hibernate还支持读写分离和第二级缓存来优化并发性能。读写分离将读操作和写操作分散到...
在Hibernate中,悲观锁可以通过`LockMode`进行设置,如`LockMode.WRITE`、`LockMode.UPGRADE`等。例如,使用`session.get()`或`session.createQuery().setLockMode()`方法可以在查询时加锁。`LockMode.UPGRADE`会...
- `LockMode.WRITE`:Hibernate在插入或更新记录时自动获取。 - `LockMode.READ`:Hibernate在读取记录时自动获取。 - `LockMode.UPGRADE`:利用数据库的`FOR UPDATE`子句加锁。 - `LockMode.UPGRADE_NOWAIT`:...
2. **LockMode**: Hibernate提供了LockMode类,可以通过Session的`lock()`或`update()`方法,指定LockMode.PESSIMISTIC_WRITE或LockMode.PESSIMISTIC_READ来获取悲观锁。 **乐观锁**(Optimistic Lock)则相对乐观...
在悲观锁中,Hibernate提供了多种锁模式,如`LockMode.NONE`、`LockMode.WRITE`、`LockMode.READ`等,这些主要由内部使用。而`LockMode.UPGRADE`和`LockMode.UPGRADE_NOWAIT`(Oracle特有的)则是我们在应用程序中...
Hibernate支持的悲观锁模式有`LockMode.UPGRADE`(对应SQL的`for update`)和`LockMode.UPGRADE_NOWAIT`(Oracle特有的,用于立即返回等待超时的结果)。 **乐观锁(Optimistic Locking)** 乐观锁则相对乐观,它...
8. 锁章节,讨论了Hibernate提供的乐观锁和悲观锁的实现,包括使用版本号、时间戳、LockMode类等方法来控制并发访问。 9. Fetching(抓取)章节,说明了如何配置和应用不同的抓取策略来优化数据库访问和提升性能。...
Hibernate还支持LockMode,包括READ、WRITE、UPGRADE和OPTIMISTIC等,以适应不同级别的并发控制需求。 三、缓存管理 缓存技术可以显著提升应用性能,减少数据库访问。Hibernate的缓存分为一级缓存和二级缓存。一级...
- `load(Class<T> theClass, Serializable id, LockMode lockMode)`:根据类类型、主键和锁定模式加载对象。 - `load(Object object, Serializable id)`:根据对象和主键加载对象。 - **`createQuery` 方法**:...
### Hibernate 开发者指南知识点详解 #### 一、前言 Hibernate是一款开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了对关系型数据库的高效持久化支持。Hibernate的主要特点...
锁章节讲解了乐观锁和悲观锁的使用和管理,包括乐观锁的版本号和时间戳机制,悲观锁的使用以及LockMode类的介绍。 9. Fetching(抓取): 抓取章节介绍了抓取策略,包括不抓取、通过查询动态抓取以及通过配置文件...
在 Hibernate 中,悲观锁的实现方式有多种,例如使用 `LockMode.UPGRADE` 加锁方式,或者使用 `for update` 语句来锁定数据。在查询开始之前加锁,才会真正通过数据库的锁机制加锁处理。 二、乐观锁(Optimistic ...
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
为了保证多线程环境下的数据一致性,Hibernate提供了缓存同步机制,如LockMode和Locking Strategy。通过这些机制,可以在并发环境下控制对缓存的访问,防止脏读、不可重复读和幻读等问题。 **七、最佳实践** 1. **...
在Hibernate框架中,悲观锁通过`LockMode.PESSIMISTIC_READ`和`LockMode.PESSIMISTIC_WRITE`来实现。`PESSIMISTIC_READ`通常用于读取数据时避免其他事务更新,而`PESSIMISTIC_WRITE`则更严格,不仅阻止更新,也阻止...
对于 Criteria 还可以设置 FlushModel(冲刷 Session 的方式)和 LockMode(数据库锁模式)。 Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。Criterion 接口的...
Account a = (Account) session.load(Account.class, 1, LockMode.UPGRADE); int balance = a.getBalance(); // do some calculation balance = balance - 10; a.setBalance(balance); session.getTransaction...
Criteria 还提供了其他一些有用的用法,如设置 FetchMode(联合查询抓取的模式)、设置排序方式、设置 FlushModel(冲刷 Session 的方式)和 LockMode(数据库锁模式)。通过这些设置,可以满足复杂的查询需求。 ...