ERR MULTI calls can not be nested: MULTI calls can not be nested(MULTI はネストできない)
Redis意味
MULTI (トランザクション) ブロックが既に開いている状態で再度 MULTI が送信された。Redis はネストしたトランザクションブロックをサポートせず、同時に有効にできる MULTI は 1 つだけである。
原因
前の MULTI を EXEC/DISCARD で閉じずに新しい MULTI を開始するアプリケーションロジック、トランザクション状態を正しくリセットせずにコネクションプールから同じ接続を再利用、またはライブラリのラッパーが気付かないうちに MULTI を 2 回呼び出している。
対処方法
すべての MULTI ブロックを 1 回の EXEC (取り消す場合は DISCARD) で閉じ、前のブロックが終了してから新しいブロックを開く。コードフローでトランザクションの開始/終了を明確に分離する。接続をプールに返す前に、トランザクションが開いたままでないことを確認する。ネストしたロジックが必要な場合は、Lua スクリプト (EVAL) でアトミックな操作を行うことを検討する。
同じデータベースの他の項目
- ERR Can't save in background: fork failedBackground save failed: fork failed(バックグラウンド保存失敗: fork 失敗)
- NOPROTO unsupported protocol versionUnsupported RESP protocol version(サポートされない RESP プロトコルバージョン)
- ERR Unknown option or number of arguments for CONFIG SETUnknown option or number of arguments for CONFIG SET (older versions: Unsupported CONFIG parameter)(CONFIG SET の不明なオプションまたは引数の数)
- ERR Lua script attempted to access nonexistent global variableLua script attempted to access a nonexistent global variable(Lua スクリプトが存在しないグローバル変数にアクセスしようとした)
- ERR unknown commandUnknown command(不明なコマンド)
- TRYAGAIN Multiple keys request during rehashing of slotMultiple keys request during rehashing of slot (cluster)(スロットの rehash 中の複数キー要求)
- ERR DISCARD without MULTIDISCARD without MULTI(MULTI なしの DISCARD)