Redis-事务
事务
其实就是同一组指令需要一起执行。
一个队列中、一次性、顺序性、排他性的执行一系列的命令
redis与数据库事务的区别
怎么使用
case1:正常执行
MULTI
开启事务
后续的命令要加入这个是事务当中
EXEC 结束
case2:放弃事务
MULTI
DISCARD
这个输入之后就是全体放弃,之前执行一半的事务全部撤销
相当于一个是编译报错一个是运行时报错
case3:全体连坐
一条命令出错全部打回去
语法出错了,直接编译就存在问题,当然执行不了
case4:冤有头债有主
对的执行,错的停止,类似于运行时异常,当一个命令失败了,
类似于语法没有检查出错误
case5:watch监控
redis会使用watch来提供乐观锁定,类似于CAS(check-and-Set)
乐观锁:optimistic lock 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下再次期间别人有没有去更新这个数据
乐观锁的策略: 提交版本必须大于记录当前版本才能执行更新
拿一个watch监控一个key,如果这个key在监控期间没有人动过,皆大欢喜,否则,本次执行的操作就会设置成一个null。
watch 初始化k1 和balance两个key,先监控再开启multi,保证两个key变动在同一个事务当中。
有加塞篡改
case6:unwatch
放弃监控
总结
一旦执行了exec之前加的监控锁都会被取消掉,当客户端连接丢失的时候(比如退出连接),所有的东西都会被取消监控
- 开启:以MULTI 开启一个事务
- 入队:将多个命令入队到事务当中去,接到这些命令并不会立即的执行,而是会放到等待执行的事务队列中
- 执行:由EXEC命令触发事务