<주의> Postgresql에서는 Transaction 안에서 now()값이 바뀌지 않는다.

유알·2023년 11월 22일
0

merge문에 대한 테스트를 하고 있던 중 발견한 것인데,

MERGE INTO google_place_cache
USING (VALUES ('ㅇㅇㅇㅇ','POINT (135.503039 34.669209699999996)')) s
ON google_place_cache.google_place_id = s.column1
WHEN MATCHED THEN
  UPDATE SET location = s.column2, updated_at = NOW()
WHEN NOT MATCHED THEN
  INSERT (google_place_id, location, updated_at)
  VALUES (s.column1, s.column2, NOW());

이러한 쿼리를 여러번 발생시키는 테스트 였다.
근데 계속 fail이 나서 보니, 시간이 모두 같게 뜨는 것이었다.

그래서 처음에는 JPA 캐시 때문인가 했었지만, 놀라운 사실을 알게 되었다.

Postgresql에서는 한개의 Transcation 안에서 NOW()값은 모두 같다.

ㄴㅇㄱ

아마 성능을 위해서, 트랜잭션 시작 시점을 기록하는 거 같은데,,
시간에 매우 민감한 작업이라던지, 매우 긴 트랜잭션을 가진 작업을 쿼리할 때는 반드시 알아야할것 같다.

해결하려면, clock_timestamp()함수로 대체할 수 있다.

우연치 않게 좋은것을 배워간다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글