본문 바로가기

프로그래밍/Database

MySQL Locking Reads

온라인 게임에서 두 유저가 돈을 교환한다고 하자.

A가 1000원을 B에게 주기 위해 A는 1000원이 있는지 확인한 후 B는 1000원을 증감한 뒤 트랜잭션을 커밋한다.

트랜잭션 커밋 또는 롤백 전에 다른 프로세스가 A의 돈을 조회하는 경우 차감전의 돈을 알게 될 것이다.

이를 방지하기 위해 물론 isolation으로 처리할 수 있지만 이러 동시성을 고려해야 하는 경우가 많지 않으면 간단히 잠금 쿼리를 활용하면 된다.

    SELECT ... LOCK IN SHARE MODE;

    SELECT ... FOR UPDATE;

LOCK IN SHARE MODE는 트랜잭션이 끝날 때 까지 ROW값이 변경되지 않음을 보장한다. 따라서 UPDATE, DELETE 는 대기해야 한다. SELECT는 동시에 여러 세션이 수행할 수 있다.

FOR UPDATE는 SELECT로 들고온 데이터를 변경하기 위해 쓴다. 따라서 SELECT, UPDATE, DELETE 모두 대기해야 한다.

출처:

https://sangheon.com/%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C%EB%A5%BC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-mysql-%EC%9E%A0%EA%B8%88-%EB%91%90%EA%B0%80%EC%A7%80/

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

'프로그래밍 > Database' 카테고리의 다른 글

mongo + ec2 + springboot  (0) 2020.09.10
Couchbase cluster with 2 vm  (0) 2019.07.17
DBCP & Timeout  (0) 2019.04.05
NoSQL 정리  (0) 2019.03.21
Normalization & Denormalization 요약  (0) 2019.03.19