一、悲观锁(Pessimistic Lock)
悲观锁是Hibernate基于数据库的机制来实现的,根据是否设定了查询条件可以锁定指定的记录或锁定整个表
1 可选的锁定模式有如下几种:
LockOptions.NO_WAIT:
LockOptions.NONE:
LockOptions.READ:
LockOptions.UPGRADE:会在生成的sql语句最后加上"for update"
LockOptions.WAIT_FOREVER:
2 用于设定LockMode的接口
query.setLockMode(String alias, LockMode lockMode)
query.setLockOptions(LockOptions lockOptions)
session.get(....)
session.load(....)
session.resh(....)
criteria.setLockMode(LockMode lockMode)
二、乐观锁
hibernate基于数据版本(Version)记录机制实现,为数据增加一个版本标识,严格来讲,乐观锁是一种冲突检测机制
1 实体映射时采用@Version字段标识版本号,可以是整型也可以是Timestamp,如下所示
@javax.persistence.Entity
@Table(name = "t_concurrency_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@Column
private String sex;
@Version
private int version;
....
2 提交更新时,如果版本号大于数据表当前版本号,刚更新成功,否则认为是脏数据,抛出org.hibernate.StaleObjectStateException异常
三、乐观锁机制由Hibernate提供保证,悲观锁则是借助于数据库层提供的锁机制来实现
四、实例代码
1 悲观锁实体类
package com.justin.hibernate.model.currencycontrol;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;
/**
*
* Author: Justin Hu
* Create Date: Apr 16, 2014
* Description:
*
*/
@javax.persistence.Entity
@Table(name = "t_concurrency_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@Column
private String sex;
@Version
private int versi