reids集群不支持事务
ACID
- 相对于Mysql中的原子性,Redis中的原子性只保证若干个操作都执行或者都不执行,如果中间某条指令执行失败也不会回滚。
- 无持久性(因为不同的持久化策略可能会丢失或多或少的修改)
- 不涉及隔离性(redis串行,两个事务之间本身就没有交集)
- 无一致性
事务的原理
-
开启事务:当客户端发送**
MULTI**命令时,Redis服务器会在该客户端的状态上设置一个事务标识。 -
命令入队:此后,客户端发送的普通命令不会被立即执行。服务器会将这些命令解析后,存入与该客户端关联的事务队列中,并向客户端回复
QUEUED表示入队成功。 -
如果中间想取消事务,也就是丢弃之前,那就发送discard命令。
-
执行事务:当客户端发送**
EXEC**命令时,服务器会遍历该客户端的事务队列,按照先进先出(FIFO) 的顺序依次执行队列中的所有命令,中间不会执行其他客户端的命令。执行完毕之后客户端返回队列中所有命令的执行结果。
watch
WATCH 是 Redis 为实现事务的乐观锁而提供的命令。它用于在事务执行前监视一个或多个键,如果在执行事务 (EXEC) 时,被监视的键被其他客户端修改了,那么整个事务将被取消,从而保证数据的一致性。unwatch可以取消监视。
之所以说他是乐观锁,是因为watch假设数据在大多数情况下不会发生冲突,因此在操作数据时并不加锁以防止大量冲突导致事务频繁取消,而是只在最终执行事务时检查数据是否被修改过
实现原理
它的实现原理就是给被监视的key一个版本号,之后每次对该key修改都会自增版本号,等事务exec时检查这个key的版本号是否等于初始版本号,如果不等于就说明key被修改过,事务取消。
使用示例
