悲观锁: 指在应用程序中显示地为数据资源加锁. 悲观锁假定当前事务操纵数据资源时, 肯定还会有其他事务同时访问该数据资源, 为了避免当前事务的操作受到干扰, 先锁定资源. 尽管悲观锁能够防止丢失更新和不可重复读这类并发问题, 但是它会影响并发性能, 因此应该谨慎使用悲观锁.
乐观锁: 乐观锁假定当前事务操纵数据资源时, 不会有其他事务同时访问该数据资源, 因此完全依靠数据库的隔离级来自动管理锁的工作. 应用程序采用版本控制手段来避免可能出现并发问题.
悲观锁有两种实现方式:
一: 在应用程序中显示指定采用数据库系统的独占锁来锁定数据资源.
二: 在数据库表中增加一个表明记录状态的LOCK字段, 当它取值为'Y' 时, 表示该记录已经被某个事务锁定, 如果为N 表明该记录处于空闲状态, 事务可以访问它.
当事务执行select 语句的时候, 默认情况下, 数据库系统会采用共享锁来锁定查询的记录. 此外MYSQL Oracle Ms SQL都支持以下形式的select 语句:
select ... for update
以上语句显示的指定采用独占锁来锁定查询的记录.
在Hibernate应用中, 当通过Session的get() 和load() 方法来加载一个对象时, 可以采用以下的方式声明使用悲观锁:
session.get(XXX.class, new Long(1), LockMode.UPGRADE)
利用Hibernate的版本控制来实现乐观锁
乐观锁是由应用程序提供的一种机制, 这种机制既能保证多个事务并发访问数据, 又能防止第二类丢失更新. 可以利用hibernate的版本控制功能来实现乐观锁.
在数据库中加入一个字段, VERSION, 每次更新通过session中的实体对象的version属性进行更新, 如session中version为0, 则where version = 0. 否则将抛出异常.