[TroubleShooting] Redis - get연산의 null과 transactional

Jieun·2024년 7월 5일
0

프로젝트 기록

목록 보기
5/5

참고


잘 돌아가던 로직에 아 맞다 transactional~ 하면서 애노테이션을 추가하자 nullpointerException을 마주쳤다.
분명히 직접 cli로 조회하면 값이 존재하는데 왜?? 라는 의문이 생겨 무심코 마우스를 올렸다가 답을 찾았다

Returns:
null when used in pipeline / transaction

JPA에서 트랜잭션에서의 조회연산(select)은
트랜잭션 격리수준에 따라 값의 유지여부는 갈리지만, 바로 데이터베이스로 전송되어 실행된다.
update 쿼리와 다르게 어딘가 저장되어 있다가 commit시점에 실행되는 것이 아니다.

하지만 Redis는 MULTI-EXEC 방식으로 트랜잭션이 동작하기 때문에 JPA와 조금 다른 결과가 생길 수 있다


A Redis Transaction is entered using the MULTI command. The command always replies with OK. At this point the user can issue multiple commands. Instead of executing these commands, Redis will queue them. All the commands are executed once EXEC is called.

MULTI - 이후에 오는 연산들은 전부 queued, 이후에 exec 명령이 호출되는 시점에 한 번에 실행된다.

get이든 set이든 exec시점에 날라가 실행되기 때문에 transaction 내부에서 조회를 하게 되면, exec이 끝난 후에 get의 값을 얻기 때문에 의미가 없어 null을 리턴한다

따라서 조회, 수정 로직을 구분에 transaction 단위를 나누는 것이 중요해보인다.

0개의 댓글