[笔记迁移][Redis][5]Redis事务(重要!)

版权声明:Collected by Bro_Rabbit only for study https://blog.csdn.net/weixin_38240095/article/details/83349975

一、概述

Redis事务
一次执行多个Redis命令,本质是一组命令集合。一个Redis事务中的所有命令都会被序列化(加入队列),按照顺序串行地执行而不允许插入其他命令(简言之,不许加塞的一次批处理)

二、使用

  • 官网摘要

    A Redis transaction is entered using the MULTI command. The command always replies with OK. At this point the user can issue multiple commands. Instead of executing these commands, Redis will queue them. All the commands are executed once EXEC is called.
    Calling DISCARD instead will flush the transaction queue and will exit the transaction.
    
  • 概览

    命令 说明
    DISCARD 取消事务,放弃执行事务块内的所有命令
    EXEC 执行所有事务块内的命令,类似COMMIT
    MULTI 标记一个事务块的开始
    UNWATCH 取消WATCH命令对所有key的监控
    WATCH key/key1,ke2,… 监视一个或多个key,如果在事务执行之前这个或这些key被其他命令改动,那么事务将打断
  • 案例
    (Case 1)正常执行:以MULTI开始,EXEC结束并一次性执行
    TransactionSuccess
    注:向事务块添加的命令不限,只要符合Redis命令即可==“入队”==

    (Case 2)放弃事务
    TransactionGiveup

    (Case 3)原子“连坐”
    PartAtomic
    注:EXEC前抛出的错误,类似“强行编译错误”

    (Case 4)“冤有头债有主”——“部分事务”
    PartProceed注:EXEC后抛出错误,类似“运行时异常”,不影响其他可以正确执行的命令

    (CASE 5)WATCH监控与UNWATCH取消监控[ 与高并发场景相关,特别重要!]
    WatchFail
    注:
    WATCH加乐观锁之后,MULTI事务开始之前,对被加锁key置值,导致事务执行失败
    UNWATCH
    注:UNWATCH解除乐观锁之后,事务可以执行成功

    小结:
    (1) WATCH {key}指令,类似乐观锁,事务提交时,若{key}所指val被其他客户端改变,则整个事务队列都不会被执行

    (2) 通过WATCH命令在事务执行之前监控了多个keys,若监控之后有任何一个key发生了变化,其后EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

    (3) 一旦执行了EXEC,无论成功与失败,之前加的监控所都会被取消

三、特性

  1. 单独的隔离操作
    事务中的所有命令都会序列化、一次性、按顺序执行。 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

  2. 没有隔离级别的概念
    队列中的命令在EXEC之前都不会被实际执行

  3. 不保证原子性——部分传统事务特性
    在Redis同一个事务中,如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

猜你喜欢

转载自blog.csdn.net/weixin_38240095/article/details/83349975