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 命令可以手动取消对所有键的监视。 标签:事务,WATCH,数据库,Redis,命令,key,执行 From: https://www.cnblogs.com/qiqi-yi/p/17289202.html