redis 事物
- 前言
首先我们需要明确一下什么是事物 ?
事务是一组原子操作单元。更简答的说就是:要么全部执行成功,要么撤销不执行。
事物应该具有的4个属性 : 原子性、一致性 、隔离型 、持续性这4个属性通常被称为 ACDI
原子性: 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性: 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性: 持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
- redis的事物机制
redis为我们提供了事物机制 。
首先介绍几条命令 : multi , exec , discard , watch
multi -- redis 开启事物 , 它总是返回ok ,multi 执行后 , 客户端向服务端发起多条命令,这些命令不会被立即执行,而被放到一个队列中,当执行exec时,所有的命令才会被执行
exec -- 提交事物 执行所有的命令, 当一个客户端开启了事物, 但因为一些外界或者程序原因导致 exec 没有被正确执行。那么事务中的所有命令都不会被执行。
discard -- 清空事务队列, 并放弃执行事务
- 事物中的错误
事物在执行exec之前,可能会发生各种各样的错误 ,例如:命令错误,内存不足等问题。
- 因此客户端需要检查入队列的返回值,当返回值为QUEUED,表示入队成功 , 否则入队失败 。 不过,从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事 务。在 Redis 2.6.5 以前, Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。 而新的处理方式则使得在流水线(pipeline)中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯。
- 还有执行过程中最重要的是记住这样一条, 即使事务中有某条/某些命令执行失败了, 事务队列中的其他命令仍然会继续执行 —— Redis 不会停止执行事务中的命令。
浙公网安备 33010602011771号