redis事物不支持回滚
redis事物支持单实例 不支持集群使用
redis事务执行过程
一个事务从开始到执行会经历以下三个阶段:
1)开始事务。
2)命令入队。当客户端进入事务状态之后, 服务器在收到来自客户端的命令时, 不会立即执行命令, 而是将这些命令全部放进一个事务队列里, 然后返回QUEUED, 表示命令已入队:
3)执行事务。若在事务队列中存在命令性错误,则执行EXEC命令时,所有命令都不会执行
若在事务队列中存在运行错误,则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。 运行错误是指用不同的语法操作不同的数据类型
事务的 ACID 性质
在Redis中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下,事务也具有持久性性(Durability)。
原子性
事务具有原子性指的是, 数据库将事务中的多个操作当作一个整体来执行,服务器要么就执行事务中的所有操作, 要么就一个操作也不执行。
对于Redis的事务功能来说,事务队列中的命令要么就全部都执行,要么就一个都不执行,因此, Redis的事务是具有原子性的。
Redis的事务和传统的关系型数据库事务的最大区别在于,Redis不支持事务回滚机制(rollback), 即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。 下面展示了即使RPUSH命令在执行期间出现了错误,事务的后续命令也会继续执行下去, 并且之前执行的命令也不会有任何影响:
127.0.0.1:6379> set msg hello
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd fruit apple banana cherry
QUEUED
127.0.0.1:6379> rpush msg bye redis
QUEUED
127.0.0.1:6379> sadd alphabet a b c
QUEUED
127.0.0.1:6379> exec
1) (integer) 3
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) (integer) 3
不支持事务回滚是因为这种复杂的功能和Redis追求简单高效的设计主旨不相符,并且Redis事务的执行时错误通常都是编程错误产生的, 这种错误通常只会出现在开发环境中, 而很少会在实际的生产环境中出现。
一致性
事务的一致性是指,如果数据库执行前是一致的,那么在事务执行后,无论事务是否执行成功,数据库也应该是一致的。
隔离性
事务的隔离性指的是,即使数据库中有多个事务并发地执行,各个事务之间也不会互相 影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。
因为Redis使用单线程的方式来执行事务(以及事务队列中的命令),并且服务器保证, 在执行事务期间不会对事务进行中断,因此,Redis的事务总是以串行的方式运行的,并且 事务也总是具有隔离性的。
持久性
事务的耐久性指的是,当一个事务执行完毕时,执行这个事务所得的结果巳经被保存到 永久性存储介质(比如硬盘)里面了, 即使服务器在事务执行完毕 之后停机, 执行事务所得的结果也不会丢失。Redis事务的耐久性由服务器所使用持久化模式决定的:
(1) 当服务器在无持久化的内存模式下运作时,事务不具有耐久性。因为一旦服务器停机,
服务器所有的数据都将丢失。
(2) 当服务器在ROB持久化模式下运作时,事务同样不具有耐久性。因为服务器只会在特定的保存条件下才会执行BGSAVE命令,并且异步执行的BGSAVE命令不能保证事务的数据第一时间被保存到硬盘上。
(3) 当服务器运行在AOF持久化模式下,并且appendfsync选项的值为always时,程序总会在执行命令之后调用同步(sync)函数,将命令数据真正地保存到硬盘里。