인프런 커뮤니티 질문&답변

데자와아님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

문제점 해결하기

MySql Lock을 사용하지 않는 이유

23.07.23 11:26 작성

·

1K

0

강의에서 설명해주시기로는 쿠폰 개수를 가져오는 것부터 쿠폰 생성까지 lock을 걸어야 한다고 설명 주셨는데

이전 강의인 재고 관리 이슈와는 다르게 row가 아닌 table에 lock을 걸기 때문에 성능 이슈가 발생한다고 보면 될까요?

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

2023. 07. 25. 13:09

데자와아님 안녕하세요!
말씀해주신 것처럼 테이블단위로 걸기때문에 느려질수도 있습니다.
다만, 제가 쿠폰개수를 가져오는 것부터 쿠폰 생성까지 lock 을 걸어야 하기 때문에 성능이 저하 된다고 했었던 것은 아래와 같은 이유입니다.

  1. 10:00 lock 획득

  2. 10:01 쿠폰개수 획득

  3. 10:02 쿠폰 생성

  4. 10:03 lock 해제

위의 플로우처럼 A 라는 유저가 10시에 lock 을 획득하였고 10:03 에 lock 을 해제할 때 다른유저들은 10:00 ~ 10:03 까지 쿠폰생성 메소드에 진입을 하지 못하고 lock 을 획득할 때까지 대기하게 됩니다.
그로인하여 처리량이 낮아지는것을 성능이 저하된다 라고 표현하였습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 07. 25. 11:31

안녕하세요, 인프런 AI 인턴이에요.

MySQL에서 lock을 사용하는 이유는 동시에 여러 개의 트랜잭션이 같은 데이터를 수정하려고 할 때 데이터의 일관성을 유지하고 충돌을 방지하기 위해서입니다.

쿠폰 개수를 가져오는 작업에서도 lock을 걸어야 하는 이유는 여러 개의 트랜잭션이 동시에 해당 데이터를 읽을 경우, 잘못된 값을 읽는 문제가 발생할 수 있기 때문입니다. 따라서 lock을 사용하여 동시에 여러 개의 트랜잭션이 해당 데이터를 읽지 못하도록 막고, 일관성을 유지할 수 있습니다.

다만, table에 lock을 걸게 되면 다른 트랜잭션들이 해당 테이블의 다른 데이터에 접근할 수 없기 때문에 성능 이슈가 발생할 수 있습니다. 성능 이슈는 lock이 걸린 시간 동안 다른 트랜잭션이 대기해야 하기 때문에 발생합니다.

따라서 lock을 사용할 때는 성능 이슈를 고려하여 효율적으로 사용해야 합니다. 예를 들면, 필요한 데이터만을 lock을 걸고 나머지 부분에 대해서는 lock을 풀어주는 방법을 사용하거나, lock 대기 시간을 최소한으로 줄이기 위해 빠른 처리가 가능한 작업에 대해서만 lock을 사용하는 등의 방법을 고려할 수 있습니다.

하지만, 성능 이슈가 너무 크다면 다른 방법을 사용하는 것도 한 가지 방법입니다. 예를 들면, MySQL에서는 SELECT 문과 INSERT 문을 같은 트랜잭션 안에서 사용할 때 암묵적으로 lock을 걸어주는 기능인 격리 수준(Isolation level)을 조정하는 방법도 있습니다.

결론적으로, lock을 사용할 때는 성능 이슈를 고려하여 적절하게 사용해야 하며, 성능 문제가 심각하다면 다른 방법을 사용할 수도 있습니다. 성능 최적화에 대한 고민이 필요한 경우에는 성능 테스트를 통해 최적화를 진행하거나, DBA(DB 관리자)의 도움을 받아서 문제를 해결해보시는 것을 추천드립니다.

더 필요한 내용이 있으시면 언제든지 물어봐주세요. 좋은 하루 되세요!