什么是Redis事务
可以一次执行多个命令,本质上是一组命令的集合。一个事务的所有命令都会串行的执行,不会被其他命令插入。
事务的使用
主要包含一下几个命令
MULTI
:开启事务DISCARE
:取消事务,放弃执行事务中所有命令EXEC
:执行事务块内所有命令WATCH
:监听一个或多个key,在执行事务之前key被其他命令修改,则事务中断UNWATCH
:取消WATCH对所有可以的监听
事务的性质
事务的性质主要可以概括为:ACID
- 原子性(Atomicity):一个事务队列中事务要么全部执行,要么全部不执行,当发生执行错误时,是不满足原子性的。在发生入队错误和实例错误的情况下都是符合原子性的。
- 隔离性(isolation):多个事务并发执行,且彼此不会产生影响。由于redis是单线程执行事务,事务队列中的命令是穿行执行的,且不会被其他命令插入,故满足隔离性
- 持久性(durability):事务在提交后,产生的结果对数据库是永久的。Redis在一般情况下是不具备持久性的,只有在AOF持久化模式下,并且appendfsync选项为always时才具备持久性,因为每执行一个命令都会调用同步函数(sync)
- 一致性(consistency):事务在执行前数据是一致的,在执行后数据也是一致的。即由一种一致性状态到另外一种一致性状态。
Redis事务和MySQL事务的区别
主要有以下两点区别
- Redis的事务是不支持回滚的,也就是你在执行过程中事务中的一个命令报错了,也会继续执行其他命令并提交
- Redis事务没有MySQL的隔离级别之说,或者说天然就是MySQL中的可串行化级别,因为Redis执行事务是单线程穿行执行的。
Redis的三种错误
- 入队错误:事务在将命令放入事务队列的过程中,出现命令不存在、错误,那么Redis将直接中断这个事务,即里面所有命令都不执行
- 执行错误:在执行过程中出现的错误,出现这个错误并不会中断事务的执行,会继续执行后续的命令。这个错误主要是执行类型错误,比如对不能自增的类型进行自增
- Redis实例发生错误:无论是采用的RDB还是AOF,在能找到对应文件的情况下都能恢复到原来一致的的状态。
WATCH监控
WATCH命令是一个乐观锁,采用的类似CAS(Check-and-set)+版本号的机制,用cas来判断监控的键是否发生改变,由于cas存在ABA问题,故引入版本号每次修改使version+1,比较版本号是否相同来解决ABA问题