悲观锁和乐观锁

来源:互联网 发布:红米手机壳淘宝 编辑:程序博客网 时间:2024/06/08 15:36

悲观锁:是指每次在操作数据时,总是悲观地认为会有其他事务也会来操作同一数据,因此在整个数据处理过程中,将数据处于锁定状态,悲观锁由数据库来实现,在锁定的时间其他事务不能对数据进行存取,
Hibernate锁模式:
(1).LockMode.NONE
如果缓存中存在对象,直接返回该对象的引用,否则通过select语句到数据库中加载该对象,这是锁模式的默认值
(2)LockMode.READ
不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否与数据库中的对象版本一致
(3)LockMode.UPGRADE
不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否与数据库中的对象版本一致,如果数据库系统支持悲观锁(如Oracle/MySql),就执行select ….for update语句,如果不支持(如sybase)就执行普通select语句·
(4)LockMode.UPGRADE_NOWAIT
与LockMode.UPGRADE具有同样的功能,此外,对于Oracle等支持update 弄wait的数据库,执行select…for update nowait语句,nowait表明如果执行该select语句的事务不能立即获得悲观锁,那么不会等待其他事务释放锁,而是立即抛出锁定异常
(5)LockMode.WRITE
保存对象时会自动使用锁定模式,仅供HIbernate内部使用,应用程序中不应该使用
(6)LockMode.FORCE
强制更新数据库中对象的版本属性,从而表明当前事务已经更新了这个对象
乐观锁:通常认为多个事务操作同一数据的情况很少发生,因此乐观锁不做数据库层次的锁定,而是基于数据版本标识应用程序级别上的锁定机制。
在Hibernate应用中,乐观锁有两种基于版本控制的实现:

  1. 基于version的乐观锁
  2. 基于timestamp的乐观锁
    所谓数据版本控制,就是通过为数据库表增加一个“version”字段。读取数据时,将版本号读出和保存时加 1操作,在提交数据时,将现有版本号与数据库记录的版本号进行比较,提交数据的版本号减一等于数据表的版本号,则允许更新数据
原创粉丝点击