ERR MULTI calls can not be nested: MULTI calls can not be nested
Redis의미
MULTI(트랜잭션) 블록이 이미 열려 있는 상태에서 MULTI를 다시 보냈다. Redis는 중첩 트랜잭션 블록을 지원하지 않으며 한 번에 하나의 MULTI만 활성화될 수 있다.
원인
애플리케이션 로직이 이전 MULTI를 EXEC/DISCARD로 닫지 않고 새 MULTI를 시작했거나, 커넥션 풀의 같은 연결을 트랜잭션 상태를 제대로 초기화하지 않고 재사용했거나, 라이브러리 래퍼가 모르게 MULTI를 두 번 호출한 경우다.
해결 방법
모든 MULTI 블록을 하나의 EXEC(취소하려면 DISCARD)로 닫고, 이전 블록을 마친 후에만 새 블록을 연다. 코드 흐름에서 트랜잭션 시작/종료를 명확히 구분한다. 연결을 풀에 반환하기 전에 열린 트랜잭션이 없는지 확인한다. 중첩 로직이 필요하면 Lua 스크립트(EVAL)로 원자적 작업을 수행하는 것을 고려한다.
같은 데이터베이스의 다른 항목
- ERR Can't save in background: fork failedBackground save failed: fork failed
- NOPROTO unsupported protocol versionUnsupported RESP protocol version
- 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) (slot rehashing 중 다중 키 요청)
- ERR DISCARD without MULTIDISCARD without MULTI