Transacciones Redis
Las transacciones de Redis pueden ejecutar múltiples comandos a la vez, y cuentan con las siguientes tres garantías importantes:
- Las operaciones por lotes se colocan en la cola de caché antes de enviar el comando EXEC.
- Después de recibir el comando EXEC, se entra en la ejecución de la transacción. Si falla cualquier comando en la transacción, los demás comandos aún se ejecutan.
- Durante el proceso de ejecución de la transacción, las solicitudes de comando enviadas por otros clientes no se insertarán en la secuencia de comandos de ejecución de la transacción.
Una transacción pasa por las siguientes tres etapas desde el inicio hasta la ejecución:
- Iniciar la transacción.
- Poner comandos en cola.
- Ejecutar la transacción.
Ejemplo
El siguiente es un ejemplo de transacción. Primero usaMULTIpara iniciar una transacción, luego pone múltiples comandos en cola en la transacción, y finalmenteEXECel comando dispara la transacción, ejecutando todos los comandos en la transacción:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
La ejecución de un solo comando de Redis es atómica, pero Redis no agrega ningún mecanismo para mantener la atomicidad en las transacciones, por lo que la ejecución de las transacciones de Redis no es atómica.
Una transacción puede entenderse como un script de ejecución por lotes empaquetado, pero las instrucciones por lotes no son operaciones atómicas. El fallo de una instrucción intermedia no provocará la reversión de las instrucciones ya ejecutadas, ni impedirá la ejecución de las instrucciones posteriores.
Esta es la explicación del sitio web oficial. From redis docs ontransactions:
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.
Por ejemplo:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
Si falla en set b bbb, set a ya se ha ejecutado con éxito y no se revertirá, y set c continuará ejecutándose.
Comandos de transacciones Redis
La siguiente tabla enumera los comandos relacionados con las transacciones de Redis:
| Número | Comando y descripción |
|---|---|
| 1 | DISCARD Cancela la transacción y abandona la ejecución de todos los comandos dentro del bloque de transacción. |
| 2 | EXEC Ejecuta todos los comandos dentro del bloque de transacción. |
| 3 | MULTI Marca el inicio de un bloque de transacción. |
| 4 | UNWATCH Cancela la vigilancia de todas las claves por parte del comando WATCH. |
| 5 | WATCH key [key ...] Vigila una (o más) clave(s). Si esta(s) clave(s) es/son modificada(s) por otros comandos antes de la ejecución de la transacción, la transacción se interrumpirá. |