redis中的事务本质上是一组命令的集合。一个事务中的所有命令都会被序列化,按照顺序串行地执行而不会被其他命令插入。
redis通过下面的五条命令来支持事务:
1. MULTI:标记一个事务块的开始
2. EXEC:执行所有事务块中的命令
3. DISCARD:放弃执行所有事务块中的命令
4. WATCH:监视一个或多个key,如果在事务执行之前这些key被其他命令改动,那么事务会被打断
5. UNWATCH:取消WATCH命令对所有key的监视
示例:
现在,当我们将一个有语法错误的命令加入队列,执行EXEC后会发现不仅错误的命令不会执行,而且正确的命令也不会执行:
但是,当我们把一个语法正确,但是运行时会出错的命令加入队列,例如,对非数字类型的值执行自增操作,会发现,当执行EXEC后,仅仅该条错误命令不会执行,其他命令都会照常执行:
所以可以说,redis是部分支持事务的。
redis的WATCH命令可以监视一个或多个key,一旦其中有任意一个key被修改,那么在此之后的事务都不会执行,例如:
注意:由于WATCH命令的作用只是当被监控的键被修改后取消之后的事务,并不能保证其他客户端不修改监控的值,所以当EXEC命令执行失败之后需要手动重新执行整个事务:
执行EXEC命令之后会取消监控使用WATCH命令监控的键,另外,也可以通过在执行MULTI命令之前使用UNWATCH命令来取消监控。