Redis-事务

是什么

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

Redis事务的主要作用就是串联多个命令防止别的命令插队

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞

一个队列中,一次性、顺序性、排他性的执行一系列命令。

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

注意:

​ 如果命令入队操作有报错,那么整个事务都不会执行成功;

​ 如果命令入队操作没有报错,但是执行阶段,执行事务的某条语句有问题,这时,其他命令正常执行,只有有误的命令才会不成功。

​ 就像是java程序,命令入队像编译操作,执行事务像运行程序,编译有问题,那么不会运行程序,编译成功后,有条语句int a=10/0,那么运行时会报错,但是程序依旧运行了。

​ 即不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

​ 因此:redis支持部分事务

3阶段

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务 :以multi开始一个事务
  • 命令入队 :将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  • 执行事务 :由exec命令触发事务

常用命令

  1. DISCARD
    • 取消事务,放弃执行事务块内的所有命令。
  2. EXEC
    • 执行所有事务块内的命令。
  3. MULTI
    • 标记一个事务块的开始 。
  4. UNWATCH
    • 取消 WATCH 命令对所有 key 的监视。
  5. WATCH key [key …]
    • 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

WATCH监控

悲观锁

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

乐观锁

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

乐观锁策略:提交版本必须大于记录当前版本才能执行更新。

WATCH和UNWATCH

WATCH key [key…]

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

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

UNWATCH

取消 WATCH 命令对所有 key 的监视。

3个特性

  1. 单独的隔离操作
    • 事务中的所有命令都会序列化、按顺序执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。
  2. 没有隔离级别的概念
    • 队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
  3. 不保证原子性
    • redis同一个事务中,如果都所有命令入队成功,但是执行事务时有一条命令执行失败,事务中的其他命令任然会被执行,没有回滚。

最后更新: 2020年07月18日 21:45

原始链接: http://ligangit.com/2020/07/16/Redis-事务/

× 请我吃糖~
打赏二维码