标签归档:hibernate

hibernate的乐观锁和悲观锁

悲观锁:

正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

在Hibernate使用悲观锁十分容易,但实际应用中悲观锁是很少被使用的,因为它大大限制了并发性:

session.get(class,id,lockMode)

乐观锁:

大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个”version”字段来实现。

Hibernate为乐观锁提供了3中实现:

1. 基于version

2. 基于timestamp

3. 为遗留项目添加添加乐观锁

基于配置文件:

在class内添加:

<version name="version" column="version" type="integer"></version>
<timestamp name="updateDate" column="updateDate"></timestamp>
<class name="com.xxx" table="xxx" optimistic-lock="all">

基于annotation:

@Version
@Column(name="version",nullable=false,unique=true)
private int version;

参考:

Hibernate事务与并发问题处理(乐观锁与悲观锁)

hibernate annotation 并发操作不冲突