悲观锁的本质上是数据库自身所具备的一种机制,在数据库的事务里面有一个隔离性的概念,其主要的特征是当一个session操作某条数据的时候,其它的session是无法操作的,所以这就是一种锁的实现,而这种锁是数据库自身所带的功能。但是在之前都是针对于更新的操作使用的锁,于是如果希望在查询的时候也使用锁,那么就加上FOR UPDATE:
SELECT * FROM 表名称 FOR UPDATE;
表示使用悲观锁,在事务提交或回滚之前数据都不允许更新。
而乐观锁是不使用数据库锁的处理情况(并不推荐),需要在你真正使用的数据表里面追加一个字段,而这个字段用于做一个版本号,例如:正常情况下你的用户表可能只有mid、password,但是如果你使用的乐观锁则还需要追加有一个字段的列,这个列标识版本号:
create table member(
mid varchar(50) primary key,
name varchar(50),
ver int default 0
);
现在假设有一条数据:
INSERT INTO member(mid.name,ver) VALUSE ('mldn','hello',0);
现在假设有两个session要进行该数据的读取,由于没有使用悲观锁,所以两个session都可以对该数据进行修改操作,于是第一个session修改了数据,修改之后将版本号做了一个“+1”,变为了1,而后另外一个 session更新的时候,发现版本号不对,则不允许更新。
乐观锁是基于算法的一种实现, 实际之中会非常的麻烦,在Hibernate设计框架里面有此概念,但是如果从我们开发角度来讲,建议这种操作交由 数据库自行处理,建议使用悲观锁。