[9월 4주차] Typeorm ManyToMany, MySQL과 Postgres의 REPEATABLE READ

Rookedsysc·2024년 9월 22일
0

Typeorm

ManyToMany Problem

Typeorm ManyToMany를 설정할 때 사용하는 JoinTable의 Annotation 사용법을 제대로 숙지하지 않아서 연관관계의 Entity가 Undefined로 조회되는 Bug가 발생했다. 해당 내용은 typeorm 공식 문서에 적혀있는데, JoinTable Annotation을 연관관계 양쪽 중 한 쪽에 둬서 해결이 가능했다.

Isolation Level

MySQL vs Postgres MVCC 동작

MySQL은 MVCC 동작을 할 때 버저닝을 해서 Undo 로그에 기록하는 식으로 삭제를 진행하지만 Postgres는 MVCC를 할 때 SoftDelete와 비슷하게 논리적으로 삭제하는 방식으로 Delete 연산을 처리한다.

이에 따라서 DB에서 삭제를 하고 조회를 할 때의 성능차이가 발생하는데 조회 성능은 실제로 데이터가 사라지는 MySQL 쪽이 좀 더 빠르다. 그러나 삭제 성능은 Undo 로그를 삭제할 필요없이 Update를 하는 Postgres 쪽이 좀 더 빠르다.

Postgres는 이러한 SoftDelete 목록이 더 이상 진짜로 필요없다라고 판단(MySQL에서 Undo 로그를 삭제하는 시점)될 때, Vacuum이라는 일종의 배치 동작을 통해서 실제로 데이터들을 삭제해주게 된다.

MySQL의 REPEATABLE READ와 Phantom Read

MySQL도 Postgres처럼 REPEATABLE READ에서 Phantom Read가 발생하지 않는데 이는 Next Level Lock 때문이라고 한다.

  • Next Level Lock : 인덱스의 현재 위치와 그 다음 갭을 동시에 잠금으로써 새로운 행의 삽입을 방지
  • 출처 : MySQL 공식문서

0개의 댓글