在Hibernate中, locking主要用于并发控制,可以分为悲观锁和乐观锁两种实现方式。
- 悲观锁:
- 假定会发生并发冲突,在获取数据时会对其加锁,其他事务无法访问被锁定的数据,直到锁定被释放。
- 实现方式:通过hibernate.cfg.xml配置lock-strategy,采用悲观锁的数据库锁机制 (如行锁)。
例如:
<class name="Customer" ...>
<property name="lock_strategy">PESSIMISTIC_WRITE</property>
</class>
这将采用数据库的写锁(如MySQL的行锁),获取数据时会被锁定,其他事务无法更新直到提交。
- 乐观锁:
- 假定不会发生并发冲突,不加锁地获取数据进行操作,在更新数据时验证它是否被其他事务修改过,如果被修改则更新失败。
- 实现方式:通过@Version注解和version字段进行版本控制,每更新一次version会加1。
例如:
@Entity(optimisticLock=true)
public class Customer {
@Id
private int id;
private String name;
@Version
private int version;
}
这样在更新客户数据时,会检查version字段,只有版本号与数据库中的记录相同,才执行更新操作,否则抛出OptimisticLockException异常。