온라인 게임에서 두 유저가 돈을 교환한다고 하자.
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://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 |