乐观锁(Optimistic locking)
- 顾名思义就是保持一种乐观的态度,认为系统中的事务并发更新不会很频繁,如果冲突了再重新来一次
- 它的基本思想就是每一次提交事务更新时,想看看要修改的东西从上次读取以后有没有被其他事务修改过,如果修改过,那么更新就会失败。
- 常用实现方法:实体中增加一个版本控制字段,每次事务更新后就将新版本(version)字段:版本字段的值+1
Java实体bean类
@Version private int version; public int getVersion() { return version; } public void setVersion(int version) { this.version = version; }
或者不使用注解,配置hbm.xml
<version name="version"></version>
悲观锁
- 基本思想就是每次一个事务读取某一条记录时,就会把这条记录锁住,其他的事务想要更新,必须等当前事务提交或者回滚解除锁后才能操作(数据库事务隔离级别:可重复读)
- 悲观锁的实现,依靠数据库提供的锁机制(只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保存外部系统不会修改数据)
- 配置
乐观锁与悲观锁的比较
- 乐观锁:
- 优势:并发性好,性能较高
- 确定:用户体验不好,录入半天,提交时被告知已经修改
- 悲观锁:
- 优势:会锁住记录,一个用户修改完成前,其他用户不能操作该记录
- 确定:并发性不好,性能不高
- 对与悲观锁是针对并发的可能性比较大,而一般在应用中用乐观锁足以