类似MySQL的事务,Redis 事务一次性可以执行多个指令, 而这多个指令通过以下的方式来保证: - EXEC 命令执行之前,所有的指令都是被暂存(Queued)在队列中;
- Service端接收到EXEC命令后开始执行事务,事务中某些命令执行失败,其余命令依旧执行;
- 在事务执行的时候具备隔离性,其他Client端执 购买电话号码列表 行的指令不会乱入到当前指令的执行顺序中的。
3.1 原子性(Atomicity)在事务执行的过程中,可能遇到这几种命令执行错误: - 在执行 EXEC 命令前,指令本身错误:
- 参数数量不一致构成的错误
- 命令名称构成的错误,使用了不存在或者错误的命令:比如上面的 'UPD'
- 超过MaxMemory内存限制,导致内存不足
- 在执行 EXEC 命令后,命令的不合理操作导致的失败。比如数据类型不匹配(对 String 类型 的 value 执行了 INCR 或者 DECR 之类的操作)
- 在执行事务的 EXEC 命令时,实例故障导致的失败,这种情况比较少一点。
3.1.1 EXEC 执行前报错执行前错误是指命令入队(Queue)时,Redis 就会发现并记录报错。
即使执行了 EXEC命令之后,Redis也会拒绝执行指令队列中的所有指令,返回事务失败的结果。
这样一来,所有的指令都不会被执行,保持了原子性。下面是指令入队列的报错的实例,跟上面的举例一致:
|