Redis事务的概念
Redis事务的本质是一系列命令的集合。事务支持一次执行多个命令,一个事务中所有的命令都会被序列化。在事务的执行过程中,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结来说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
与Mysql事务的区别
1)Redis事务没有隔离级别的概念:
批量指令在发送EXEC命令之前被依次放入队列中,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。
2)Redis事务不保证原子性:
Redis中,单条命令是原子性执行的,但是事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
Redis事务的三个阶段
1)开始事务
2)命令入队
3)执行事务
Redis事务命令
- 1、DISCARD 取消事务,放弃执行事务块内的所有命令
- 2、MULTI 标记一个事务块的开始
- 3、EXEC 执行所有事务块内的命令
- 4、WATCH key [key ...] 监视一个或多个key,如果在事务执行之前这个/些key被其他命令所改动,那么事务将被打断
- 5、UNWATCH 取消WATCH命令对所有key的监视
Redis事务验证
1)不保证原子性
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 1
QUEUED
127.0.0.1:6379> set key2 2
QUEUED
127.0.0.1:6379> SADD key2 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get key1
"1"
2) 监视key
Redis事务原子性.png
如图所示,在当前事务执行开始之前对key1进行监视,如果在此事务执行EXEC之前在另一个客户端对key1进行修改,则当前事务会执行失败,执行结果为nil。
总结
1)Redis事务提供了一种将多个命令打包,然后一次性、有序性执行的机制。
2)在事务中,多个命令会被入队到事务队列中,然后按FIFO的顺序执行。
3)事务在执行过程中不会被中断,当事务队列中的所有命令执行完毕后,事务才会结束。
4)带有WATCH命令的事务会将客户端和被监视的键在数据库中的watch_keys字典关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标识打开,服务只有在REDIS_DIRTY_CAS标识没有打开时,才会执行客户端提交的事务,否做拒绝执行事务。
5)Redis中的事务不支持回滚机制。