DBAtlas · データベース運用アトラス

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) でアトミックな操作を行うことを検討する。

DBAtlas で開く →

同じデータベースの他の項目