Redis事务

文章目录

  • Redis事务
    • 事务实例
      • MULTI 命令
      • EXEC 命令
    • 事务异常
      • 1. 进入队列之前发生错误
        • Redis 是没有回滚操作的
    • Watch 命令
      • 执行 watch 命令,不执行 MULTI、exec
      • 执行 watch 命令,通知执行 MULTI、exec
    • UnWatch 命令

redis是NOSQL数据库,所以也存务,只是在事此事务和关系型数据库的事务是有区别的。

事务实例

MULTI 命令

在执行 MULTI 命令之后,此时将进入阻塞状态。当我们继续发送命令时,命令不会立即执行,而是会排队等待。直到输入 EXEC 命令执行,队列中的命令才会一一执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 111
QUEUED
127.0.0.1:6379> set k2 222
QUEUED
127.0.0.1:6379> set k3 333
QUEUED
127.0.0.1:6379> set k4 444
QUEUED
127.0.0.1:6379> get k3
QUEUED

EXEC 命令

127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
4) OK
5) "333"

事务异常

1. 进入队列之前发生错误

一般都是命令出现错误。Redis 会将进入队列失败的事件进行记录,在执行 EXEC 命令提交事务的时候,不会执行并且会放弃这一条事务。

输入命令

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhang
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex nan haha #故意写错
QUEUED
127.0.0.1:6379> set address beijing
QUEUED

执行结果

127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR syntax error
4) OK

查询数据

127.0.0.1:6379> keys *
1) "address"
2) "name"
3) "age"
127.0.0.1:6379> get name
"zhang"
127.0.0.1:6379> get sex
(nil)
Redis 是没有回滚操作的

Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。

因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速

Watch 命令

watch 命令可以监控一个或多个键,一旦有其中一个键被修改(被删除),后面的事务就不会执行了。监控一直持续到 EXEC 命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)

假设我们通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。

执行 watch 命令,不执行 MULTI、exec

这里可以看到保存到数据数据库的 name = zhang 被修改成了 name = li

127.0.0.1:6379> set name zhang
OK
127.0.0.1:6379> WATCH name
OK
127.0.0.1:6379> set name li
OK
127.0.0.1:6379> get name
"li"
执行 watch 命令,通知执行 MULTI、exec

使用 watch 监听 age ,在再执行 MULTI 命令,在执行 exec 之前 age 有任何改变,都不会执行此事务

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> 

exec 执行之后,会自动执行 UNWatch 命令,撤销监听操作

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"

UnWatch 命令

此命令表示撤销监听

下面的操作测试可以看到,取消监听后,exec 提交事务后,address 被修改了

127.0.0.1:6379> set address beijing
OK
127.0.0.1:6379> WATCH address
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> UNWATCH
QUEUED
127.0.0.1:6379> set address nanchang
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get address
"nanchang"

Redis事务、MULTI 命令和EXEC 命令相关推荐

  1. Redis 事务失效或取消执行命令的场景

    1 概述 (1)Redis 事务失效的场景: 事务中的部分命令执行失败 (2)Redis 取消执行事务中的所有命令(Redis清空队列中的全部命令并取消事务)的场景: 部分命令入队失败.乐观锁失败 2 ...

  2. Redis事务Multi介绍

    Redis事务 Redis的事务是通过multi.exec.discard和watch这四个命令来完成的. Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合. Redis将命令 ...

  3. #!/bin/bash和#!/bin/sh的区别,source命令和exec命令

    Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别 一.含义 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的she ...

  4. Redis事务入门及命令

    文章目录 Redis 事务入门及命令 事务概念 Redis 事务概念 Redis 事务特性 Redis 三个阶段 入门代码示例 Redis 相关命令 MULTI DISCARD EXEC WATCH ...

  5. Redis事务,watch命令学习

    redis事务: redis的事务和mysql等关系型数据库的事务不太一样,redis中的事务不会回滚,只能手动收拾事务失败后的烂摊子. 在命令行中,MULTI是事务的开始命令.EXEC是事务的执行命 ...

  6. 【Linux】一步一步学Linux——exec命令(208)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 exec命令用于调用并执行指令的命令.exec命令通常用在 ...

  7. 十七、Redis事务

    一.Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求 ...

  8. 面试问到 Redis 事务,我脸都绿了。。

    前言 前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受. 虽然,这位读者面试最后算是过了,但是薪资方面没 ...

  9. Redis:事务、管道、Lua脚本

    1. Redis事务定义 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是先将属于一个 ...

最新文章

  1. 微信真要做操作系统了?
  2. 对python的认识800字_我对python里True和False的理解
  3. Vue计算属性和监听属性
  4. Android获取存储和打印输出Logcat日志
  5. 解决Ubuntu系统中文乱码显示问题,终端打开文件及查看目录
  6. codeforces 476B.Dreamoon and WiFi 解题报告
  7. 【李宏毅2020 ML/DL】P23 Transformer | Self-attention, Multi-head Self-attention
  8. 供应链 信用管理 大数据_大数据分析在供应链管理中的应用
  9. python字符串_Python字符串三种格式化输出
  10. 达芬奇剪辑调色软件:DaVinci Resolve Studio 17.3.2 for Mac中文版
  11. 生成drl文件_Allegro生成Gerber文件的方法
  12. Emmagee工具的使用以及csv数据分析
  13. Internet 选项在哪
  14. 视频编码器h.264和mpeg4的区别?
  15. 如何理解卷积:信号处理、图像处理中的应用
  16. Win10电脑清除运行窗口的历史记录
  17. html跳转qq浏览器,导入其他书签
  18. 清华大学数据挖掘课程幕课习题(第二章)
  19. jackson序列化首字母大写amp;jackson序列化结果字段名重复
  20. “蔚来杯“2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案)

热门文章

  1. 多语句表值函数与内联表值函数区别?
  2. C++学习 2019-1-20
  3. MSISDN(Mobile Subscriber International ISDN/PSTN number)
  4. 米米143V15-1/冒险岛143服务端/米米143/米米冒险岛143服务端V15 本地授权
  5. 推荐一款不错的播放器客户端——乐鱼播放器
  6. tm是什么域名_.tm是什么域名
  7. Beautiful Soup库的用法
  8. 查看 Git Clone文件下载在哪里
  9. 一枚FLAG普通码农辞职,回国3年的感受...
  10. 电子科大计算机科学与技术高考分数,2021四川省高考分数线公布,总分达不到这个数,考电子科大有点悬...