开发者学堂课程【Redis 入门到精通(进阶篇):事务-锁】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/765/detail/13434
事务-锁
内容介绍
一、基于特定条件的事务执行
二、watch 指令的使用
三、unwatch 指令的使用
一、基于特定条件的事务执行
1、业务场景
天猫双十一热卖过程中,对已经售罄的货物追加补货,四个业务员都有权限进行补货,补货的操作可能是一系列的操作牵扯到多个连续操作如何保证不会重复操作?
2、业务分析
多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作。
在操作之前锁定要操作的数据,一旦发生变化,终止当前操作。
3、解决方案
对key添加监视所,在执行exec前如果key发生了变化,终止事务执行。
watch key1 [key2......]
取消对所有 key 的监视
Unwatch
二、watch 指令的使用
先设置两个值,set name123,set age321 下面就可以开 watch,如果想保证两个都不变再执行就写 watch name age,watch 定义事务 get name 可以执行
127.0.0.1:6379> f1ushdb
OK
127.0.0.1:6379> keys 8
(empty list or set)
127.0.0.1:6379>set name 123
OK
127.0.0.1:6379>set age 321
OK
127.0.0.1:6379>watch name
OK
127.0.0.1:6379>get name
"123"
127.0.0.1:6379> multi
OK
127.0.0.1:6379>set aa bb
QUEUED
127.0.0.1:6379> get a
OUEUED
127.0.0.1:6379>exec
1) OK
2) "bb'
如果讲它改变继续监控,在执行之前将另一个客户端去改 name 值
127.0.0.1:6379> watch name age
OK
127.0.0.1:6379>mu1ti
OK
127.0.0.1:6379>set aa cc
QUEUED
127.0.0.1:6379> get aa
QUEUED
127.0.0.1:6379> exec
(ni1)
127.0.0.1:6379>
执行后会是空也就是说 watch 监控的指令一旦下面定义的事物不会再执行了。
不可以开启事务以后再 watch
127.0.0.1:6379>mu1ti
OK
127.0.0.1:6379>watch name
(error) ERR WATCH inside MULTI is not allowed
127.0.0.1:6379>
三、unwatch 指令的使用
127.0.0.1:6379> watch name
(error) ERR WATCH inside MULTI is not allowed
127.0.0.1:6379>discard
OK
127.0.0.1:6379>watch name
OK
127:0.0.1:6379> get name
"321"
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379>set aa cc
QUEUED
127.0.0.1:6379>get aa
QUEUED
unwatch 不需要设定取消对谁的监视,是全部取消。执行前另一个客户端改变name 值,依然可以正常执行,这就是加锁与取消锁
127.0.0.1:6379>exec
1) OK
2) 127.0.0.1:6379>
"cc'
127.0.0.1:6379>