DBAtlas · Veritabanı operasyon atlası

ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed

Redis

Ne demek?

Açık bir MULTI bloğu içindeyken WATCH komutu gönderildi. WATCH, iyimser kilitleme (optimistic locking) için anahtarları transaction başlamadan ÖNCE izlemeye almalıdır; MULTI sonrasında çağrılırsa reddedilir. Hata transaction'ı iptal etmez, yalnızca WATCH çalışmaz ve izleme yapılmaz.

Neden olur?

Kodda WATCH ile MULTI sırasının ters yazılması (önce MULTI, sonra WATCH); istemci kütüphanesinin pipeline/transaction sarmalayıcısı içinde WATCH çağırmak; ya da bağlantı havuzundan MULTI durumu açık kalmış bir bağlantının kullanılması. Bu durumda EXEC, izlenmesi beklenen anahtarlar değişmiş olsa bile çalışır; beklenen çakışma koruması devreye girmez.

Nasıl çözülür?

Doğru sıra: WATCH anahtar → (değerleri okuyun) → MULTI → komutlar → EXEC. EXEC nil dönerse izlenen anahtar değişmiş demektir; transaction'ı baştan tekrarlayın. İstemci kütüphanesinin WATCH/transaction API'sini (ör. watch + pipeline yardımcıları) kullanın. Not: SUBSCRIBE gibi pub/sub komutları MULTI içinde reddedilmez, kuyruğa alınır ve EXEC sonrası bağlantı abone moduna geçer; bu da önerilmez, pub/sub için ayrı bağlantı kullanın.

DBAtlas'ta aç →

Aynı motorda diğer kayıtlar