悲观锁的本质是数据库自身所具备的一种处理机制,在数据库的事务里面有一个隔离性的概念,其主要特征是当一个session操作某条数据的时候,其它的session是无法操作的,这就是一种锁的实现,而这种锁是数据库自身所带的功能。之前都是针对更新操作使用的锁,如果在查询的时候也使用锁,那么就加上FOR UPDATE:
SELECT*FORM 表名称FOR UPDATE;
表示使用悲观锁,在事务提交或回滚之前该数据都不允许更新。
而乐观锁是不使用数据库的处理情况,需要在你真正使用的数据表里面追加一个字段,而这个字段用于做一个版本号,例如:在正常情况下,你的用户表可能只有mid、password,但如果你使用了乐观锁则还需要追加一个字段的列,这个列标识版本号:
现在假设有一条数据: INSERTINTO member(mid,name,ver)VALUES(‘mldn’,‘hello’,0);假设有两个session要进行该数据的读取,由于没有使用悲观锁,所以这两个session都可以对该数据进行修改操作,第一个session修改了数据,修改后将版本号做了一个“+1”,变为了1,而后另外一个session更新的时候发现版本号不对,则不允许更新。
乐观锁是基于算法的一种实现,实际中会比较麻烦,在Hibernate设计框架里面有此概念,但从开发角度来讲,建议这种操作交由数据库自行处理,建议使用悲观锁。
更多专业知识,面试技巧就在面试一点通,持续更新中……
感谢浏览~
本内容来源于阿里云大学-Java面试技巧