결제 처리 로직 디버깅하다가 이상한 걸 발견했는데요. 하나의 트랜잭션 안에서 같은 계좌 잔액을 두 번 조회했거든요. 근데 첫 번째 SELECT랑 두 번째 SELECT 결과가 달라요. 중간에 제가 UPDATE 한 것도 없는데 값이 바뀌어 있더라고요.
대충 이런 흐름이었어요.
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 10; -- 5000 나옴
-- (이 사이에 다른 세션이 커밋함)
SELECT balance FROM accounts WHERE id = 10; -- 3000 나옴??
COMMIT;
같은 트랜잭션 안이면 스냅샷이 고정돼야 하는 거 아닌가요? 왜 두 번째 읽을 때 다른 세션이 커밋한 값이 반영되는 건지 모르겠어요. 참고로 저희는 Postgres 씁니다.
혹시 격리수준이랑 관련 있는 건가요? 뭘 봐야 하는지 방향만이라도 잡아주시면 감사하겠습니다.