事务
- 数据库的事务:在一次数据库会话操作过程中,所有的sql执行要么都成功,要么都失败
- redis的事务:在一个队列中,一次性、顺序性、排他性地执行一系列的命令
- 单独的隔离操作:单线程执行,中间不会被其他命令插入
- 没有隔离级别的概念:事务提交前任何指令都不会被实际执行
- 不保证原子性:没有执行到一半进行回滚的能力
- 排他性:会保证一个事务中的命令依次执行,不会被其他命令插入
- 开启事务
- 命令入队,等待执行
- 依次执行命令
> multi #开启事务OK> set k1 v1 #开始入队QUEUED> set k2 v2QUEUED> get k2QUEUED> del k1QUEUED> exec #执行事务> multi #开启事务OK> set k1 v1 #开始入队QUEUED> set k2 v2QUEUED> DISCARD #放弃事务,事务队列中命令都不会被执行OKwatch命令可以监控一个或多个key,一旦其中有一个key被修改(或删除),之后的事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)。
假设我们通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。
正常 watch
Section titled “正常 watch”set money 500
set out 100
watch money #监控money
multi #开启事务
decrby money 50
incrby out 50
exec #在exec命令之前如果watch的key被其他连接修改其value,会导致整个事务的命令都不会被执行(nil)
unwatch #如果watch中key的value已经被修改,可以放弃watch
multi
decrby money 50
incrby out 50
exec