悲观锁和乐观锁

来源:互联网 发布:住范儿 价格 知乎 编辑:程序博客网 时间:2024/06/03 22:53

一、悲观锁

Hibernate本身不提供悲观锁的实现,需要依赖数据库的本身实现。

当数据库里对应的数据被悲观锁锁定时,其他人就不能读取和修改被锁定的数据,该数据的资源一直被一个人霸占着,直到该用户结束操作。

Hibernate悲观锁的使用:

调用session的get()或load()方法
调用session的lock()方法
调用Query的setLockMode()方法 
通过以上三种方式将锁模式指定LockOptions.UPGRADE

上代码:

Employee emp1=(Employee)session.load(Employee.class, 1001,LockOptions.UPGRADE) ;//开始上锁,后面的都查不到数据

Employee emp2=(Employee)session.get(Employee.class, 1001,LockOptions.UPGRADE);

Query query=session.createQuery("from Employee where eno=1001");
query.setLockOptions(LockOptions.UPGRADE);

Criteria c=session.createCriteria(Employee.class);
c.setLockMode(LockMode.UPGRADE)
;

注:由此可见资源一直被霸占,所以悲观锁适合短事务


二、乐观锁

乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问该数据资源,因此不作数据库层次上的锁定。为了维护正确的数据,乐观锁使用应用程序上的版本控制(由程序逻辑来实现的)来避免可能出现的并发问题。

Hibernate的乐观锁可以通过两种方式实现:
*版本控制
*时间戳


具体可以这样操作:在实体类t中添加version成员变量
在*.hbm.xml中添加<version>元素映射版本属性

注:

当Hibernate初始插入一条新Account记录时,会自动将其版本字段version进行初始化。
当更新某一个Account对象时,Hibernate会根据该对象的id和version属性匹配更新的数据库数据

如果存在匹配的记录,就更新该记录,并且把version列的值+1

如果不存在匹配的记录,那么Hibernate抛出过期对象状态异常-StaleObjectStateException。。



原创粉丝点击