Redis-事务

事务

其实就是同一组指令需要一起执行。

一个队列中、一次性、顺序性、排他性的执行一系列的命令

redis与数据库事务的区别

image-20240401135206539

怎么使用

case1:正常执行

MULTI

开启事务

image-20240401141119017

后续的命令要加入这个是事务当中

EXEC 结束

case2:放弃事务

MULTI

DISCARD

这个输入之后就是全体放弃,之前执行一半的事务全部撤销

image-20240401141941014

相当于一个是编译报错一个是运行时报错

case3:全体连坐

一条命令出错全部打回去

语法出错了,直接编译就存在问题,当然执行不了

image-20240401142255133

case4:冤有头债有主

对的执行,错的停止,类似于运行时异常,当一个命令失败了,

类似于语法没有检查出错误

image-20240401142554856

case5:watch监控

redis会使用watch来提供乐观锁定,类似于CAS(check-and-Set)

乐观锁:optimistic lock 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下再次期间别人有没有去更新这个数据

乐观锁的策略: 提交版本必须大于记录当前版本才能执行更新

拿一个watch监控一个key,如果这个key在监控期间没有人动过,皆大欢喜,否则,本次执行的操作就会设置成一个null。

watch 初始化k1 和balance两个key,先监控再开启multi,保证两个key变动在同一个事务当中。

image-20240401144932380

有加塞篡改

case6:unwatch

image-20240401145239659

放弃监控

总结

一旦执行了exec之前加的监控锁都会被取消掉,当客户端连接丢失的时候(比如退出连接),所有的东西都会被取消监控

  • 开启:以MULTI 开启一个事务
  • 入队:将多个命令入队到事务当中去,接到这些命令并不会立即的执行,而是会放到等待执行的事务队列中
  • 执行:由EXEC命令触发事务