게시글 조회수 update시 문제 발견점

깡통·2024년 1월 20일
0

게시글 조회시 게시글 존재여부, 조회수 업데이트, 해시태그와 댓글들을 가져오는 쿼리들이 연이어서 발생합니다.
이중에 update 쿼리가 나가는 부분이 가장 문제가 될수있다고 인식했습니다.

update문은 어떻게 동작하는지 확인해보겠습니다.
인텔리제이 sql console을 2개열고 서로 다른 트랜잭션을 시작해 동작을 확인해보려고합니다.

start transaction;


트랜잭션 하나가 동작중입니다.

update post set view_count = 2 where post.id = 1;


트랜잭션 1에서 post테이블의 조회수인 view_count의 조회수를 update합니다.

현재 동작중인 lock 리스트들을 확인해봅니다. 해당 트랜잭션에서 IX모드인 테이블락과, X락과 REC_NOT_GAP모드의 레코드락이 잡히는걸 볼수있습니다.

IX락
IX락은 의도적인 락(Intention Exclusive)으로 테이블의 레코드에 락을 얻기위해 설정하는 락입니다.
이게 왜 필요할까요?
만약 IX락이 없다면, 트랜잭션 A가 X락을 잡기위해 대기하고, 트랜잭션 B도 같은 레코드에 X락을 얻으려고 하다가 데드락이 발생할수있기 때문입니다.
IX락은 동일한 테이블에 여러 트랜잭션에서 IX락을 동시에 설정할수있습니다.

요약하자면, 현재 트랜잭션에서 view_count 레코드에 대해 독점적인 액세스를 시도하겠다고 선언하여 레코드 단위의 락을 잡았다고 할수 있습니다.

start transaction;

트랜잭션 2에서 새롭게 트랜잭션을 시작합니다.

현재 2개의 트랜잭션이 동작중입니다.

update post set view_count = 2 where post.id = 1;

그 후 트랜잭션 2에서 조회수를 update 시도합니다.
이 경우 문제가 생깁니다.

우선, 위에서 언급했다시피 트랜잭션2에서도 IX락, 레코드락을 걸게 됩니다.

실제로 트랜잭션 2에선 그림과같이 계속해서 대기하다가 타임아웃이 초과됩니다.

즉, 게시글을 검증하고, 조회수 상승시키고, 해시태그,좋아요, 댓글등을 가져오는 쿼리가 포함된 다른트랜잭션이 끝날때까지 대기가 발생하게 됩니다.

0개의 댓글

관련 채용 정보