]> git.saurik.com Git - redis.git/commit - src/multi.c
Safer handling of MULTI/EXEC on errors.
authorantirez <antirez@gmail.com>
Thu, 15 Nov 2012 19:11:05 +0000 (20:11 +0100)
committerantirez <antirez@gmail.com>
Thu, 22 Nov 2012 09:36:20 +0000 (10:36 +0100)
commit41f0f927c97aafc2a7a42006491fca9181fab14c
tree28d078f697d15a76bfe207eba89714c983ba050b
parent5ab4151d7f771ae6e97edc4c27e55c368228315e
Safer handling of MULTI/EXEC on errors.

After the transcation starts with a MULIT, the previous behavior was to
return an error on problems such as maxmemory limit reached. But still
to execute the transaction with the subset of queued commands on EXEC.

While it is true that the client was able to check for errors
distinguish QUEUED by an error reply, MULTI/EXEC in most client
implementations uses pipelining for speed, so all the commands and EXEC
are sent without caring about replies.

With this change:

1) EXEC fails if at least one command was not queued because of an
error. The EXECABORT error is used.
2) A generic error is always reported on EXEC.
3) The client DISCARDs the MULTI state after a failed EXEC, otherwise
pipelining multiple transactions would be basically impossible:
After a failed EXEC the next transaction would be simply queued as
the tail of the previous transaction.
src/multi.c
src/redis.c
src/redis.h