什么是 Redis 事务
Redis 事务就是一个命令执行的队列,将一系列的预定义命令包装成一个整体,就是一个队列,当执行的时候,一次性按照添加顺序依次执行,中间不会被打断或者干扰
能干嘛?
一个队列中,一次性,顺序性,排他性的执行一系列命令
Redis 事务基本操作
开启事务:multi
设置事务的开始位置,这个指令开启后,后面所有的指令都会加入事务中
127.0.0.1:6379> multiOK
执行事务:exec
设置事务的结束位置,同时执行事务,与 multi 成对出现,成对使用
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> set k3 v3QUEUED127.0.0.1:6379> exec1) OK2) OK3) OK
取消事务:discard
终止当前事务,取消 multi 后,exec 前的所有指令
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> discardOK
注意:加入事务的命令并没有立马执行,只是加入到队列中,只有执行 exec 命令后才会真正的执行
**
加入和执行事务时出错会怎么办?
- 加入事务,如果出现语法错误,事务则全部取消(全部连坐)
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> set k3(error) ERR wrong number of arguments for 'set' command127.0.0.1:6379> set k3 v4QUEUED127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.
- 执行事务报错,则成功的返回成功,失败的返回失败,不会影响报错后面的指令(冤有头,债有主)
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> set name zhangsanQUEUED127.0.0.1:6379> incr nameQUEUED127.0.0.1:6379> set k3 v3QUEUED127.0.0.1:6379> exec1) OK2) OK3) OK4) (error) ERR value is not an integer or out of range5) OK
注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己实现
_
监控 KEY
watch
对 key 进行监控,必须结合 multi 使用,并且在 exec 前执行,如果此时,所监控的 key 发生了变化,那么在执行 exec 的时候,将终止事务执行
127.0.0.1:6379> watch k1OK127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 888QUEUED127.0.0.1:6379> exec(nil)
unwatch
取消对所有 key 的监控
127.0.0.1:6379> unwatchOK
