Redis事务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30038111/article/details/79960298

什么是 Redis 事务

    Redis 事务是要保证一条或多条命令执行的原子性,即这些操作要么全部成功,要么全部失败。

Redis 事务命令和原理

命令

  • watch 监控 key
    监控 key 是否发生变化,在事务中会以 CAS 的方式判断 key 是否发生变化,如果发生了变化,会导致事务中的所有命令执行失败,但不会报错。
  • multi 开启事务
  • discard 取消事务
    取消事务并清除事务中的队列,返回 ok。如果 key 受监控,那么会取消监控,然后清除事务。
  • exec 提交事务
  • unwatch 取消监控
    取消所有 key 的监控

注意:exec 和 discard 都必须在 multi 中执行,否则报错(error) ERR EXEC without MULTI、(error) ERR DISCARD without MULTI;watch 必须在 multi 之前执行,否则报错(error) ERR WATCH inside MULTI is not allowed

原理

    将一条或多条命令序列化后放入执行队列,在提交事务之后,这些命令按顺序执行。
    如果在开启事务前,使用 watch 监控某些 key,那么提交事务之后,执行队列在执行命令时会通过 CAS 操作判断受监控的 key 是否发生了改变,如果 key 发生了变化,这个事务中的所有操作都会失败。事务执行完之后,会取消监控。

Redis 事务的分类

    事务可以分为正常事务、放弃事务、失效事务和部分成功事务。

  • 正常事务
  • 放弃事务,在事务中使用 discard 或者事务中语法错误,导致放弃事务
# 使用 discard
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 1000
QUEUED
127.0.0.1:6380> set zhaoliu 1000
QUEUED
127.0.0.1:6380> discard
OK
127.0.0.1:6380> get lisi
(nil)
127.0.0.1:6380> 
# 语法错误
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 1000
QUEUED
127.0.0.1:6380> cls
(error) ERR unknown command 'cls'
127.0.0.1:6380> get lisi
(nil)
127.0.0.1:6380> 
  • 失效事务,使用 watch 监控 key 时,key 发生变化后提交事务,导致事务失效
# 第一个客户端
127.0.0.1:6380> set lisi 1000
OK
127.0.0.1:6380> watch lisi
OK
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 999
QUEUED
127.0.0.1:6380> exec
(nil)
# 第二个客户端,在第一个客户端执行 exec 之前修改 key 的值
127.0.0.1:6380> set lisi 888
OK
  • 部分成功事务,类型转换失败时,导致部分事务成功
127.0.0.1:6380> mset lisi 1000 wangwu 1000
OK
127.0.0.1:6380> multi
OK
127.0.0.1:6380> incrby lisi 888
QUEUED
127.0.0.1:6380> sadd wangwu iii
QUEUED
127.0.0.1:6380> exec
1) (integer) 1888
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6380> 
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页