锁
悲观锁
- 认为什么时候都会出问题,无论做什么都会加锁
乐观锁
-
很乐观,认为什么时候都不会出问题,所以不会上锁。
-
更新数据时去判断一下,在此期间,是否有人修改过这个数据
-
应用于:秒杀场景
**watch
**相当于乐观锁
- 正常执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set money 100
QUEUED
127.0.0.1:6379(TX)> set out 0
QUEUED
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) (integer) 80
4) (integer) 20
- 非正常执行【原线程才执行一半,又出现新的线程,把原数据修改了时候】
1、先加入事务,但是没有执行
加入新的线程,修改了数据
执行结果
解决方案
#解锁
127.0.0.1:6379> UNWATCH
OK
#再次监视 ,这次监视的是 新线程Set之后 的值
watch money