Redis事物和锁机制

举报
兮动人 发表于 2022/02/25 13:02:32 2022/02/25
【摘要】 1. Redis的事务定义 2. Multi、Exec、discard 3. 事务的错误处理 4. 为什么要做成事务 5. 事务冲突的问题 5.1 例子 5.2 悲观锁 5.3 乐观锁 5.4 watch key [key …] 5.5 unwatch 5.6 Redis事务三特性 1. Redis的事务定义Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。...

1. Redis的事务定义

在这里插入图片描述

  • Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • Redis事务的主要作用就是串联多个命令防止别的命令插队。

2. Multi、Exec、discard

  • 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。

  • 组队的过程中可以通过discard来放弃组队。
    在这里插入图片描述

  • 组队成功,提交成功
    在这里插入图片描述

  • 组队阶段报错,提交失败
    在这里插入图片描述

  • 如果不想组队,就使用 discard
    在这里插入图片描述

3. 事务的错误处理

  • 组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
    在这里插入图片描述

  • 组队中任意一个失败,后面三个命令都不会被执行
    在这里插入图片描述

  • 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
    在这里插入图片描述

  • incr c1 后 v1 不能加1,组队并没有报错,执行后第二个命令报错了,哪个失败对后面没有影响
    在这里插入图片描述

4. 为什么要做成事务

  • 想想一个场景:有很多人有你的账户,同时去参加双十一抢购

5. 事务冲突的问题

5.1 例子

  • 三个请求
    一个请求想给金额减8000
    一个请求想给金额减5000
    一个请求想给金额减1000
    在这里插入图片描述

5.2 悲观锁

在这里插入图片描述

  • 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

5.3 乐观锁

在这里插入图片描述

  • 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

5.4 watch key [key …]

  • 在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.5 unwatch

5.6 Redis事务三特性

  1. 单独的隔离操作
    事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  2. 没有隔离级别的概念
    队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
  3. 不保证原子性
    事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。