MULTI / EXEC / DISCARD în Redis & In-Memory Data Store

Grupează mai multe comenzi într-o tranzacție: Redis le execută pe toate, în ordine, fără să intercaleze comenzile altor clienți.

Sintaxă comandă
MULTI
  comandă ...
EXEC
DISCARD

Ce face MULTI / EXEC / DISCARD

După MULTI, comenzile nu se mai execută imediat: Redis le pune la coadă și răspunde QUEUED. La EXEC le execută pe toate deodată, una după alta, fără ca alt client să intervină între ele, și întoarce lista răspunsurilor. DISCARD (din Redis 2.0.0) renunță la comenzile din coadă.

Atenție: tranzacțiile Redis nu au „rollback”. Dacă o comandă dă eroare la execuție (de exemplu tip greșit), celelalte se execută oricum. Doar erorile de sintaxă detectate la punerea în coadă anulează toată tranzacția (EXECABORT). În redis-cli, promptul arată (TX) cât timp ești în tranzacție.

Parametri

Parametru Descriere
MULTI Începe tranzacția.
EXEC Execută comenzile din coadă.
DISCARD Renunță la comenzile din coadă.

Ce returnează

MULTI și DISCARD: OK. EXEC: lista răspunsurilor, sau (nil) dacă o cheie urmărită cu WATCH s-a schimbat.

Exemple

Exemplul 1: Scăderea stocului și înregistrarea comenzii

Cele două comenzi se execută împreună; răspunsurile vin la EXEC.

SET stoc:caiet 40
MULTI
DECRBY stoc:caiet 2
RPUSH comenzi:ana caiet:2
EXEC

Ieșire în redis-cli

127.0.0.1:6379> SET stoc:caiet 40
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> DECRBY stoc:caiet 2
QUEUED
127.0.0.1:6379(TX)> RPUSH comenzi:ana caiet:2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) (integer) 38
2) (integer) 1

Exemplul 2: Eroare de sintaxă: tranzacția este anulată

INCR fără cheie este respins la punerea în coadă, așa că EXEC nu execută nimic.

MULTI
SET stare activ
INCR
EXEC

Ieșire în redis-cli

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET stare activ
QUEUED
127.0.0.1:6379(TX)> INCR
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors.

Exemplul 3: Eroare la execuție: celelalte comenzi rulează

INCR pe un text eșuează, dar SET-ul de dinainte a fost executat. Nu există rollback.

MULTI
SET nume Ana
INCR nume
EXEC

Ieșire în redis-cli

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET nume Ana
QUEUED
127.0.0.1:6379(TX)> INCR nume
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) ERR value is not an integer or out of range

Greșeli frecvente

  • Nu folosi rezultatul unei comenzi din tranzacție într-o comandă următoare din aceeași tranzacție: valorile vin abia la EXEC. Pentru logică de tip „citește și decide” folosește WATCH sau un script Lua.
  • Comenzile blocante (BLPOP) nu blochează în interiorul MULTI.
  • În Redis Cluster, toate cheile din tranzacție trebuie să fie în același hash slot.

Comenzi înrudite

  • WATCH / UNWATCH: Urmărește chei înaintea unei tranzacții; dacă altcineva le modifică până la EXEC, tranzacția nu se mai execută.
  • INCR / INCRBY / DECR: Crește sau scade atomic un număr salvat într-o cheie; ideal pentru contoare de vizite, stocuri și ID-uri.
  • SET: Salvează o valoare text la o cheie, opțional cu expirare (EX/PX), doar dacă nu există (NX) sau doar dacă există (XX).