Redis事务
-
和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。
-
Redis中事务的实现特征:
- 1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务。
- 2). 我们可以通过MULTI命令开启一个事务,可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。
- 3). 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。
-
注意:
- 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
- Redis事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
- 这是官网上的说明 From redis docs on transactions:
- https://redis.io/topics/transactions
- It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
总结:
-
Redis支持事务, 但是不够严格完整,只能说是半事务
-
(1)正常执行–和之前一样
-
(2)放弃事务–和之前一样
-
3)若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行–和之前一样
-
(4)若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。–和之前不一样,并没有完全回滚