一、乐观锁
乐观锁认为无论什么时候都不会出现问题,所以不会上锁,只是在更新数据的时候,会去比对某个字段,查询在这期间是否有人操作过这个数据。
乐观锁主要用于抢红包,淘宝抢购,秒杀之类
其他客户端每一次提交数据都会数据库的数据版本进行修改,当本次提交时会对版本进行比较,要是版本低于本次版本则会提示失败。
不冲突 | 冲突 |
---|---|
![]() | ![]() |
二、实现乐观锁
通过watch实现乐观锁。开启两个终端:
终端1:
127.0.0.1:6379> set a 40
OK
127.0.0.1:6379> set b 20
OK
127.0.0.1:6379> watch a b //监视key:a、b
OK
127.0.0.1:6379> multi //开始事务
OK
127.0.0.1:6379> incr a
QUEUED
在终端1的事务未执行前,在终端2对监视的键值进行操作:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr a
QUEUED
127.0.0.1:6379> exec
1) (integer) 41
返回终端1执行事务,因为watch监视到key发生改变,事务执行失败,返回nil
注意:在事务执行完毕后,相应的watch生命周期结束
在上述操作之后,在两个终端再执行两次的操作
终端1:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr b
QUEUED
终端2:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr b
QUEUED
127.0.0.1:6379> exec
1) (integer) 21
终端1执行业务,事务依旧执行,并未失败