Hibernate中如何实现乐观锁和悲观锁?代码举例讲解

在Hibernate中, locking主要用于并发控制,可以分为悲观锁和乐观锁两种实现方式。

  1. 悲观锁:
  • 假定会发生并发冲突,在获取数据时会对其加锁,其他事务无法访问被锁定的数据,直到锁定被释放。
  • 实现方式:通过hibernate.cfg.xml配置lock-strategy,采用悲观锁的数据库锁机制 (如行锁)。

例如:

<class name="Customer" ...>  
    <property name="lock_strategy">PESSIMISTIC_WRITE</property>
</class>

这将采用数据库的写锁(如MySQL的行锁),获取数据时会被锁定,其他事务无法更新直到提交。

  1. 乐观锁:
  • 假定不会发生并发冲突,不加锁地获取数据进行操作,在更新数据时验证它是否被其他事务修改过,如果被修改则更新失败。
  • 实现方式:通过@Version注解和version字段进行版本控制,每更新一次version会加1。

例如:

@Entity(optimisticLock=true)  
public class Customer {
    @Id
    private int id;
    private String name;
    @Version 
    private int version;
} 

这样在更新客户数据时,会检查version字段,只有版本号与数据库中的记录相同,才执行更新操作,否则抛出OptimisticLockException异常。