Redis 数据库的事务机制

1、Redis 事务机制

1.1 事务的定义

  事务是指一系列操作数据库的步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
 
1.2 Redis 的事务
  同样,Redis 中的事务也是一组命令的集合,至少是两个或两个以上的命令。Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  Redis 事务的主要作用就是串联多个命令,防止别的命令插队。
 
2、 Redis 事务相关命令
 Multi: 开启事务
语法: multi
作用:标记一个事务的开始。事务内的多条命令会按照先后顺序,被放进一个队列当中。
返回值:总是返回 ok
 exec :提交事务
语法:exec
作用:执行所有事务块内的命令
返回值:事务内的所有执行语句内容,事务被打断(影响)返回 nil
 Discard:取消事务
语法:discard 作用:取消事务,放弃执行事务块内的所有命令
返回值:总是返回 ok
 watch
语法:watch key [key ...]
作用:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动, 那么事务将被打断。
返回值:总是返回 ok
 unwatch
语法:unwatch
作用:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC命令 或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了 。
返回值:总是返回 ok
 
3、事务的实现
3.1 正常执行事务
事务的执行步骤: 开启事务, 其次向事务队列中加入命令,最后执行事务提交。
 
3.2 事务故障 1:执行 exec 命令之前,入队命令错误
  事务执行 exec 之前,入队命令错误(语法错误;严重错误导致服务器不能正常工作),则放弃事务。
  事务执行 exec 之前,组队中某个命令出现了报告错误,执行时事务终止,整个的所有队列都会被取消。
 
3.3 事务故障 2:执行 exec 命令之后,队列命令执行错误
  在 exec 执行后的所产生的错误, 即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。Redis 在事务失败时不进行回滚,而是继续执行余下的命令。
 
3.4 正常放弃事务
  执行discard命令。
 
4、Redis 的 watch 机制
4.1 事务冲突
(1)悲观锁
  悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会等待,直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
 
(2)乐观锁
  乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。
 
4.2 Redis 的 WATCH 机制
  WATCH 机制:使用 WATCH 监视一个或多个 key,跟踪 key 的 value 修改情况,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,则整个事务就被取消。EXEC 返回提示信息,表示事务已经失败。
  事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。
  使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行。
  何时取消 key 的监视(WATCH)?
  ①WATCH 命令可以被调用多次。对键的监视从 WATCH执行之后开始生效,直到调用 EXEC 为止。不管事务是否成功执行,对所有键的监视都会被取消。
  ②当客户端断开连接时,该客户端对键的监视也会被取消。
  ③UNWATCH 命令可以手动取消对所有键的监视。
 
 
posted @ 2023-04-05 12:55  Linqylin  阅读(50)  评论(0编辑  收藏  举报