ERR WATCH inside MULTI is not allowed: WATCH inside MULTI is not allowed
RedisNe 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.
Aynı motorda diğer kayıtlar
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range
- ERR Protocol error: invalid multibulk lengthProtocol error: invalid multibulk length
- ERR Number of keys can't be greater than number of argsEVAL/EVALSHA: numkeys exceeds argument count
- ERR WAIT cannot be used with replica instancesWAIT cannot be used with replica instances
- ERR Background append only file rewriting already in progressAOF rewrite already in progress
- IOERR error or timeout reading from target instanceMIGRATE: I/O error or timeout to target
- ERR Error compiling script (new function)Error compiling Lua script