Redis 事务提纲
Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。
事务开始到结束的三个阶段:
- 事务开始 MULTI
- 命令入队
- 事务执行 EXEC
Redis WATCH命令
WATCH命令是一个乐观锁 (optimistic locking),它在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC执行命令时,检查被监视的键是否至少有一个 已经被修改,如果是的话,服务器拒绝执行事务,并向客户端返回代表事务执行失败的空回复。
Redis事务的ACID
原子性
Redis的事务和传统关系型数据库事务的最大区别在于,Redis不支持事务的回滚机制。即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续 执行下去,直到将事务队列中的所有命令执行完毕为止。
Redis的作者在事务功能的文档中解释说,不支持事务回滚是因为这种复杂的功能和Redis追求的简单高效的设计宗旨不符。并且他认为,Redis事务的执行时错误 通常都是编程错误产生的,这种错误通常只会出现在开发环境中,而很少会在实际的生产环境中出现,所以他认为没有必要为Redis开发事务回滚功能。
一致性
入队错误:不存在命令:服务器会拒绝执行入队过程中出现的错误事务。
执行错误:服务器不会中断事务的执行,继续执行事务下的其他命令。
服务器停机:无论服务器采用无持久化、aof、rdb哪种持久化,都能保证一致性。
隔离性
- Redis使用单线程的方式来执行事务,并且服务器保证,在执行事务期间不会对事务进行中断,因此Redis事务都是串行的方式运行的,并且事务也总是具有隔离性的。
耐久性
无持久化、rdb、aof都无法保证绝对的耐久性。
只有在每个事务结束之后执行SAVE命令,才能保证事务的耐久性。不过效率很低。