`

Hibenate之悲观锁(Pessimistic Locking)

阅读更多

什么是“锁”?

业务逻辑的实现过程中,往往需要保证数据的排他性,此时,我们需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”;即我们给选定的目标上锁,使其无法被其他程序修改;

 

hibernate中支持两种锁机制:即常说的“悲观锁”(Pessimistic Locking)和“乐观锁”(Optimistic Locking);

 

悲观锁(Pessimistic Locking):

    指的是,对数据被外界(本系统当前的其他事务,以及来自外部系统的的事务处理)修改保持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态;

 

 

悲观锁的实现

    往往靠数据可提供的锁机制(也只有数据库层提供的锁机制才能保证数据访问的排他性,否则,在本系统中实现了加锁机制,也无法保证外部系统不会修改数据);

 

数据库中这样表示:

select * from user where name ='keith' for update

 使用for update子句,这条SQL锁定了user 表中name='keith'的所有记录,在本次事务提交之前,外界无法修改这些符合条件的记录!

 

Hibernate中的悲观所也是基于“数据库锁的机制”实现的:

		final String hql = "from TUser where name='keith'";
		Query query  = session.createQuery(hql);
		query.setLockMode("TUser", LockMode.UPGRADE);//加锁
		List<TUser> users = query.list();//执行查询

 HIbernate通过数据库的for update子句实现了悲观锁机制;

 

Hibernate的加锁模式有

  • LockMode.NONE:无锁机制;
  • LockMode.WRITE:hibernate在Insert和Update记录的时候会自动获取;
  • LockMode.READ:hibernate在读取的时候会自动获取;

以上3种锁机制一般由Hibernate内部使用,如hibernate保证update过程中对象不会被修改,会在save方法实现中自动为目标对象加上WRITE锁,这些都是Hibernate内部对数据进行的加锁,与数据库无关;

以上2种锁机制是我们在应用层中较为常见,依赖数据库的悲观锁机制;

 

Hibernate中通常会这样写:

Criteria.setLockMode
Query.setLockMode
Session.lock

 只有在查询开始之前设定加锁,这样的话,会在SQL中加上锁机制,如果SQL都已经发出了,再加也没用了!

分享到:
评论

相关推荐

    Hibernate乐观锁和悲观锁分析

    主要分为两种类型:乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)。 **悲观锁(Pessimistic Locking)** 悲观锁假设数据在任何时候都可能发生并发冲突,因此在数据读取时就对其进行锁定,确保在...

    Hibernate的乐观锁与悲观锁

    #### 二、悲观锁(Pessimistic Locking) ##### 2.1 定义 悲观锁是一种较为传统的锁机制,它假定并发冲突的可能性很高,因此在整个数据处理过程中都会锁定数据。这种机制能够有效防止数据被其他事务修改,但同时也...

    Hibernate锁机制_悲观锁和乐观锁

    一、悲观锁(Pessimistic Locking) 悲观锁是一种预防并发访问的机制,Hibernate 通过对数据库的锁定来实现。悲观锁假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,因此对数据采取了数据库层次...

    hibernate的乐观锁和悲观锁

    #### 二、悲观锁(Pessimistic Locking) 悲观锁是一种假设数据会被外部(或同一系统中的其他事务)修改的观点,因此在整个数据处理过程中,数据始终处于锁定状态。悲观锁的实现主要依赖于数据库级别的锁机制,这是...

    hibernate乐观锁和悲观锁学习

    首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它会保持数据锁定状态。这样可以防止其他事务在同一时间内对数据进行修改...

    Java 中的悲观锁和乐观锁的实现

    #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将数据锁定,以确保数据的一致性和完整性...

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    2. **悲观锁(Pessimistic Locking)**:假设数据冲突很常见,因此在数据读取时即锁定数据,直至事务完成。Hibernate 支持行级悲观锁,通过 SQL 的 `SELECT FOR UPDATE` 实现。 #### 四、Session与事务 **Hibernate ...

    hibernate5.0中文文档

    此外,还会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的实现方法。 除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序...

    Hibernate4.1.11中文手册

    同时,也会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的使用场景和实现方法。 查询是Hibernate的重要功能,手册会详细讲解HQL和Criteria API的用法。HQL类似于SQL,但更为面向对象,可以...

    Hibernate4.1

    14. **版本控制(Optimistic Locking/Pessimistic Locking)**:Hibernate提供乐观锁和悲观锁来防止并发访问时的数据冲突。 15. **事件监听器**:可以通过实现特定接口或使用注解来监听持久化过程中的各种事件,如...

    孙卫琴hibernate sourcecode6

    讲解了乐观锁与悲观锁的概念,以及Hibernate如何通过Version字段和Timestamps实现并发控制。此外,还涉及了Hibernate的并发策略,如Pessimistic Write Locking、Pessimistic Read Locking和Optimistic Locking,以及...

    hibernate3.5.4

    Hibernate 3.5.4引入了乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)机制,用于解决并发访问时的数据一致性问题。 10. **其他特性**: - 支持复杂查询,包括子查询、联接查询、集合查询等。 - ...

    Hibernate_DEV_GUIDE

    - **悲观锁(Pessimistic Locking)**:默认情况下Hibernate使用悲观锁机制,它假设数据会被修改,因此在事务开始时就锁定数据。 - **乐观锁(Optimistic Locking)**:与悲观锁相反,它假设数据不会被修改,因此在提交...

    hibernate 2

    与悲观锁(Pessimistic Locking)相比,乐观锁假设多个事务在处理数据时不会发生冲突,只有在事务提交时,才通过版本号检查数据是否被其他事务修改过。如果在事务提交时发现数据已经过期,则该事务会被回滚。 在...

    hibernate.jar包

    13. **版本控制**:Hibernate通过乐观锁(Optimistic Locking)或悲观锁(Pessimistic Locking)实现并发控制。 14. **延迟加载**(Lazy Loading):Hibernate的延迟加载机制允许对象的关联属性在需要时才加载,以...

    hibernate错误汇总

    解决方案:使用乐观锁(optimistic locking)或悲观锁(pessimistic locking)机制来处理并发问题。乐观锁可以通过在实体中添加一个版本字段并将其映射到数据库中的相应列来实现。悲观锁则可以通过在数据库层面设置...

    Hibernate开发指南

    - **悲观锁(Pessimistic Locking)**:介绍了悲观锁的概念及其在Hibernate中的实现。 - **乐观锁(Optimistic Locking)**:解释了乐观锁的工作原理及其优势。 #### 七、Hibernate分页 - **分页查询**:介绍了...

Global site tag (gtag.js) - Google Analytics