redis事务简介
redis事务的本质就是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化,在事务执行过程中,会按照顺序串行化。
redis事务没有隔离级别的概念
批量操作在发送exec命令前被放入队列缓存,并不会实际执行。
redis不保证原子性
redis中,单条命令是原子的,但是事务不是原子的(命令的语法错误可以保留原值,比如set k1 v1,set k2 v2,写成sets,这种错误可以回滚,如果lpush k2 22这种错误可能会部分执行,跳过一些错误 ),且没有回滚,事务中任意命令执行失败,其余的命令仍会被执行。
例1:
set k1 v1
set k2 v2
multi
set k1 11
sets k2 22(这种语法错误会回滚,命令输入后会提示error,语法错误命令入队前就会检测出来)
例2:
set k1 v1
set k2 v2
multi
set k1 11
lpush k2 22(这种会跳过部分错误,部分执行,命令输入后,提示queue)
一个事务从开始到执行会经历会经历三个阶段:
第一阶段:开始事务 MULTI开启事务
第二阶段:命令入列
第三阶段:执行命令 EXEC
DISCARD取消事务,放弃执行块中的所有命令
WATCH监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中任何命令。
UNWATCH取消watch对所有key的监视
总结:redis的事务,就是将一堆命令打包,然后按照顺序执行,没有隔离性,不保证原子性,之所以redis提供这种简易事务,也是为了高并发下性能的考虑,不支持事务回滚。