简介
Redis事务操作的基础命令有MULTI, EXEC, DISCARD 和WATCH命令。
特点
- 事务中的所有命令都是序列化并且单独执行的,在事务执行时,将不会接受其他任何一个客户端发出的请求。
- 事务中的所有命令,要么全部被执行,要么全部没有被执行。
MULTI
使用该命令进入事务模式,在执行完成该命令后,后续输入的Redis命令将会进入事务队列。
DISCARD
该命令可以清除事务队列中的所有命令,然后退出事务。
EXEC
该命令会使事务队列中的所有命令被一次性执行。
错误
语法错误
如果返回值是 QUEUED ,那么它就是成功, 不然就是失败,Redis会返回一个错误。如果在命令的队列期间发出一个错误,通常的做法是,终止事务。
由图中结果可见,在发生语法错误时,只是对应的错误命令没有进入事务队列,后续仍然可以对事务队列进行操作,因此我们要手动停止事务。
执行错误
执行 EXEC 后:所有的命令都会被执行,甚至是那些错误的命令。Redis并不会处理错误命令,也不会进行回滚。就算有命令失败,队列中的其他命令也会被执行。我们需要自己对错误进行处理。
为什么没有回滚的操作
- Redis因为速度快而出名,回滚操作明显会降低效率。
- 运行时发生的错误在实际生产环境中几乎不会出现。
WATCH
WATCH 命令为事务提供一个check-and-set (CAS) 行为。WATCH 可以用来监听事务中的队列中的命令,在EXEC之前,一旦发现有一个命令被修改了的 , 那么整个事务就会终止, EXEC返回一个 Null ,提示用户事务失败了。
例如,当我们要对某一个数据进行加一操作时,需要执行以下命令。
value = GET key
value++
SET key value
如果在同一时间,只有一个客户端在执行上面的操作,那么上面的操作是可靠的。但如果同时有多个用户执行上面的操作的话,那结果就是不可靠的。使用 WATCH 来很好的解决这个问题,当有另一个用户在我们调用WATCH 和 EXEC之间,修改了mykey的值val,那么这个事务就会失败。
WATCH key
value = GET key
value++
MULTI
SET key value
EXEC
和此前代码不同的是,新代码在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。