需要特别注意,Redis 的命令是原子性的,而 Redis 的事务是非原子性的

事务相关命令

MULTI 命令

开启事务命令,Redis将操作命令逐个放到队列中,根据EXEC命令来原子化执行命令

EXEC 命令

执行事务中的所有操作命令

DISCARD 命令

取消事务命令,放弃执行事务模块中的所有命令

WATCH 命令

监视一个 key 或者多个 key 如果在事务执行前,这些 key 被其他命令修改,则事务被中断,不会执行事务中的任何命令

UNWATCH 命令

取消 WATCH 命令对所有 key 的监控

事务流程

正常事务流程

使用MULTI 命令开启一个事务,并且使用 set 命令新建两个字符串键 key1key2,初始值分别为 val1val2

127.0.0.1:6379> set key1 val1
OK
127.0.0.1:6379> set key2 val2
OK

然后我们使用一个事务来修改两个 key 的值,命令为

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 new_val1
QUEUED
127.0.0.1:6379> set key2 new_val2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK

最后我们使用get命令来查询我们修改的键

127.0.0.1:6379> get key1
"new_val1"
127.0.0.1:6379> get key2
"new_val2"
127.0.0.1:6379>

可以看到外面已经修改了两个键的值

语法错误导致事务失败流程

在事务开启后,其中某一条命令因为 redis 语法错误导致整个事务提交失败,key 的值不会发生改变

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set key1 new_val1
QUEUED
127.0.0.1:6379(TX)> sets key2 new_val2
(error) ERR unknown command `sets`, with args beginning with: `key2`, `new_val2`,
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get key1
"val1"
127.0.0.1:6379> get key2
"val2"

数据类型错误导致事务失败流程

在事务开启后,其中某一条命令因为 redis 数据类型错误导致整个事务提交失败,发生类型错误的命令的 key 的值不会发生改变,但是其他 key 会发生变化

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set key1 val1
QUEUED
127.0.0.1:6379(TX)> lpush key2 val2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get key1
"val1"
127.0.0.1:6379> get key2
"new_val2"
127.0.0.1:6379>

最新文章

  1. egit - not authorized
  2. Sqli-labs less 35
  3. soliworks三维机柜布局(二)创建设备位置
  4. C#操作Xml:使用XmlReader读Xml
  5. ckeditor上传图片的注意点
  6. C语言位运算符:与、或、异或、取反、左移和右移
  7. Java的类型转换
  8. httpd的三种模式比较
  9. EffectiveJava阅读笔记(一)
  10. openssl error while loading serial number
  11. supervisor+gunicorn部署python web项目
  12. Remote 'attachhome' failed on nodes:XXX
  13. Java程序设计16——Annotatio注释
  14. ES6对数组的扩展
  15. SQL模糊查询,sum,AVG,MAX,min函数
  16. 四川第七届 I Travel(bfs)
  17. 笔记-python-redis接口
  18. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
  19. 误删除$ORACLE_HOME/dbs下的参数文件、密码文件,如何快速重建
  20. java多线程----悲观锁与乐观锁

热门文章

  1. Hbase之权限控制
  2. 5.MongoDB系列之索引(二)
  3. 前端开发日常——CSS动画无限轮播
  4. 如何清除取消KMS激活
  5. 一步一图带你深入理解 Linux 虚拟内存管理
  6. [苹果APP上架]ios App Store上架详细教程-一条龙顺滑上架-适合小白
  7. 云数据库时代,DBA将走向何方?
  8. VO层
  9. BERT模型源码解析
  10. PHY驱动调试之 --- PHY控制器驱动(二)