Can a key expire within a MULTI/EXEC transaction?

Last updated 08, May 2024

Question

Can a key expire within a MULTI/EXEC transaction?

Answer

Keys can expire within a MULTI/EXEC transaction. Check the following example.

127.0.0.1:6379> GET cnt
"1"
127.0.0.1:6379> EXPIRE cnt 10
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> INCR cnt
QUEUED
Copy code

Wait some time and execute the transaction.

127.0.0.1:6379(TX)> EXEC
1) (integer) 1
127.0.0.1:6379> GET cnt
"1"
Copy code

The key cnt has expired in the transaction, then reinitialized by the INCR command to 1.

Expired WATCHed keys

Note also that in Redis versions before 6.0.9, an expired watched key would not cause a transaction to be aborted. Starting with 6.0.9, watched keys expiration cause transactions abortion.

127.0.0.1:6379> EXPIRE cnt 20
(integer) 1
127.0.0.1:6379> WATCH cnt
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET hola mundo
QUEUED
Copy code

Wait some time, and observe how the transaction is aborted.

127.0.0.1:6379(TX)> EXEC
(nil)
Copy code

Modifying the TTL in a MULTI/EXEC transaction

The expiration time of a key can be modified directly within a MULTI/EXEC transaction.

127.0.0.1:6379> EXPIRE cnt 30
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> EXPIRE cnt 1000
QUEUED
127.0.0.1:6379(TX)> EXEC
1) (integer) 1
127.0.0.1:6379> TTL cnt
(integer) 994
Copy code