1 Redis 事务
1.1 介绍
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
1.2 事务操作
具体实践:开始事务、命令入队、执行事务
1.3 放弃事务
1.4 事务错误
若是在命令编译阶段报错,则事务中所有命令都不会执行,如下:
若是在命令运行阶段报错,则其他命令都可以正常执行,仅那条报错的命令不会生效,如下:
因此,Redis 中的事务没有原子性的特性。
2 乐观锁
2.1 介绍
(下面是 B站UP主-遇见狂神说 对于这两种锁的解释,我并不认为解释的多严谨,但是却相当的简洁和形象,因此截图记录在本文)
2.2 监视 key
Redis Watch 命令可实现乐观锁,Watch 用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断(因此,在 Redis 中,给字段加乐观锁用 Watch 命令就可以)。
下图为,事务执行时,即 EXEC 命令后,被监视的 money 没被其他操作修改的情况:
下图为,事务执行时,即 EXEC 命令后,被监视的 money 被其他操作修改的情况:
之后,若还想监视 money,并且希望可以执行相应命令,则需要更新 money 在监视环境中的值,即先解除监视,再重新监视