侧边栏壁纸
博主头像
彼豆博主等级

行动起来,活在当下

  • 累计撰写 14 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

redis事务

彼豆
2019-12-28 / 0 评论 / 0 点赞 / 8 阅读 / 1499 字

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化原子性的执行而不会被其它命令插入。

开启事务

使用MULTI命令开启事务,EXEC提交执行。

127.0.0.1:6379> MULTI // 开启事务
OK
127.0.0.1:6379> set k1 v1 // 命令加入队列
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC // 提交事务
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"

事务特点

  1. 单独隔离性:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行。
  3. 不保证原子性:同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行。
    即,

监控(watch)

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。类似乐观锁。
例如:
客户端1:

127.0.0.1:6379> set k1 100 // 设初始值
OK
127.0.0.1:6379> set k2 200
OK
127.0.0.1:6379> WATCH k1 // 监听k1值变化
OK
127.0.0.1:6379> MULTI // 开启事务
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> EXEC 
(nil) // 事务提交失败,因为在提交事务之前,在客户端2已经先把k1的值先修改了,导致提交失败
127.0.0.1:6379> 

客户端2:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> set k1 200 // 在客户端1提交事务之前修改k1的值
OK
127.0.0.1:6379>

取消监控

取消 WATCH 命令对所有 key 的监视。使用UNWATCH命令
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。

0

评论区