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