事务
所谓事务(Transaction) ,是指作为单个逻辑工作单元执行的一系列操作
ACID回顾
-
Atomicity(原子性): 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
Redis:一个队列中的命令 执行或不执行 不会全部执行或全部不执行
-
Consistency(一致性): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
Redis: 集群中不能保证时时的一致性,只能是最终一致性
-
Isolation(隔离性): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 Redis: 单进程单线程,命令是顺序执行的,在一个事务中,会执行其他客户端的命令
-
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
Redis有持久化但不保证数据的完整性
Redis事务
-
Redis的事务是通过multi、exec、discard和watch这四个命令来完成的。
-
Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
-
Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行
-
Redis不支持回滚操作
事务命令
multi用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化地执行这个命令队列
exec:执行命令队列
discard:清除命令队列
watch:监视key
unwatch:清除监视key
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s1 222
QUEUED
127.0.0.1:6379> hset set1 name zhangfei
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s2 333
QUEUED
127.0.0.1:6379> hset set2 age 23
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> watc