目录
51.什么是Redis事务?
Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:Redis事务就是一次性,顺序性,排他行的执行一个队列中的一系列命令。
52.Redis事务相关命令?
muliti,exec,discard和watch是Redis事务相关的命令。
multi:开启事务,Redis会将后续的命令逐个放入队列中,然后使用exec命令来原子化执行这个命令系列。
exec:执行事务中所有操作命令。
discard:取消事务,放弃执行事务块中的所有命令。
watch:监视一个或者多个key,如果事务在执行前,这个key(或者多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
unwatch:取消watch对多有key的监视。
53.Redis事务的三个阶段?
Redis事务执行是三个阶段:
开启:以multi开始一个事务。
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。
执行:由exec命令触发事务。
当一个屋客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作。
如果客户端发送的命令为exec,discard,watch,multi四个命令中的一个,那么服务器立即执行这个命令。
与此相反,如果客户端发送的命令是exec,discard,watch,multi四个民工意外的其他命令,那么服务器并不立即执行这个命令,而是将这个命令放入一个事务队列里面,然后向客户端返回queued回复。
54.Redis事务其他实现?
基于Lua脚本,Redis可以保证脚本内命令一次性,按顺序地执行,其同时也不提供事务运行错误的回滚,执行过程如果部分命令运行错误,剩下的命令还是会继续运行完。
基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样子会需要额外写代码实现,比较繁琐。
55.Redis事务中出现错误的处理?
语法错误(编译器错误)
在开启事务后,修改k1值为11,k2值为22,但是k2语法错误,最终导致事务提交事务失败,k1,k2保留原值。
Redis类型错误(运行时错误)
在开启事务后,修改k1值为11,k2值为22,但将k2的类型作为List,在运行时检测类型错误,最终导致事务提交失败,此时事务并没有回滚,而是跳过错误命令继续执行,结果k1值改变,k2保留原值。