事务
Redis 事务提供了一种将多个命令打包,然后一次性、顺序性地执行的机制。这在一定程度上提供了操作的原子性。尽管 Redis 事务不能回滚(如果事务中的某个命令失败,事务中的其他命令仍然会被执行),但它们确保了一系列命令会被连续执行,不会插入其他客户端的命令。
使用 Redis 事务的步骤
Redis 事务的使用通常遵循以下步骤:
- 开始事务:使用
MULTI
命令开始一个事务。 - 命令入队:在执行
MULTI
后,所有后续的命令都不会立即执行,而是被放入队列中。在这个阶段,如果有命令语法错误,Redis 会返回错误,但命令仍会被添加到队列中。 - 执行事务:使用
EXEC
命令执行事务。当收到EXEC
命令时,Redis 会顺序执行队列中的所有命令。如果在执行MULTI
之后、EXEC
执行之前客户端连接断开,那么整个事务队列中的命令都不会被执行。 - 放弃事务:如果在任何时候你想放弃事务,可以使用
DISCARD
命令。这会清空事务队列,并将连接状态回滚到正常。
事务的特性
- 原子性:Redis 事务的原子性保证了事务内的命令序列要么全部执行,要么一个也不执行。然而,这种原子性不包括命令执行的结果——即使某些命令执行失败,其他命令仍会继续执行。
- 隔离性:事务中的所有命令在
EXEC
命令发出之前都不会被执行,这意味着它们是隔离的,并且作为一个整体执行。 - 持久性:一旦事务中的所有命令被执行,它们的效果(除了因错误而未执行的命令)就是持久的。
- 非回滚性:如果事务中的命令执行过程中出现错误,Redis 不会回滚之前已经执行的命令。需要注意的是,这里的错误指的是命令执行的运行时错误,而不是语法错误。
示例
下面是一个 Redis 事务的简单示例:
> MULTI
OK
> INCR mycounter
QUEUED
> INCR mycounter
QUEUED
> EXEC
1) (integer) 1
2) (integer) 2
这个事务简单地将 mycounter
的值增加了两次。使用 MULTI
开始事务,然后将两个 INCR mycounter
命令放入队列。最后,使用 EXEC
执行所有命令。
全体连坐
发生编译错误后全部不会执行
冤有头债有主
发生运行时错误,其他都会执行
watch
使用watch监控之后,发生修改不管在multi中有多少条语句都返回nil