Redis事务机制讲解与传统关系型事务比较

Redis基本命令

MULTI与EXEC命令

以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
在这里插入图片描述

DISCARD命令

DISCARD 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消

get class应该返回nil 因为之前我有拿这个key操作过 不用在乎

当输入EXEC报错表示:EXEC没有MULTI 这两个是跟着的
在这里插入图片描述

WATCH命令

WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。

首先监听了msg这个键 在EXEC之前 新开一个客户端去修改msg键的值 再EXEC会失败 而且get出来的是新终端的值

在这里插入图片描述

图接Redis执行事务过程原理

如果set key value 会判断是否处于事务状态 如果处于事务状态 会返回Query
在这里插入图片描述

Redis事务ACID

传统关系型数据库ACID就不列举了 可以去博主Mysql专栏有详细讲解

原子性

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。如果一个事务队列中的所有命令都被成功地执行,那么称这个事务执行成功

一致性

入队错误

在命令入队的过程中,如果客户端向服务器发送了错误的命令,比如命令的参数数量不对,等等, 那么服务器将向客户端返回一个出错信息, 并且将客户端的事务状态设为 REDIS_DIRTY_EXEC 。

执行错误

如果命令在事务执行的过程中发生错误,比如说,对一个不同类型的 key 执行了错误的操作, 那么 Redis 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令, 所以它对事务的一致性也没有影响

隔离性

WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败

持久性

因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久化模式(rdb aof)决定

所以说Redis只具有原子性、一致性(一旦入队错误整个事务失败)和隔离性(事务都是单个队列组成)

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113839128