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

황정태님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 2

Ep.21 JOIN UPDATE & JOIN DELETE

에피소드 21에 궁금한 점이 있어 질문드립니다.

해결된 질문

24.07.09 16:39 작성

·

112

0

강의 마지막 주의사항 중 아래의 설명이 있었는데요.

"참조하는 테이블들의 데이터에는 읽기 잠금(Shared Lock) 이 발생하므로, 잠금경합이 발생할 수 있음"

이 부분에 대한 추가적인 궁금증이 있습니다.

만약 Product 테이블이 100만건이 있고

Order 테이블을 업데이트 하기 위해 Product 테이블과 JOIN 을 거는 상황이라고 했을 때 업데이트 대상이 되는 Order 테이블에 X 락이 걸리는 것 뿐만 아니라, Product 테이블에도 S락이 걸리므로 다른 트랜잭션에서 Product 테이블에 UPDATE 를 하려고 했을때 lock wait timeout 같은 문제가 발생할수있다는 것일까요?

답변 2

0

백은빈님의 프로필 이미지
백은빈
지식공유자

2024. 07. 12. 09:32

안녕하세요.

말씀해주신 내용이 맞습니다. 간단하게는 아래와 같이 확인해보실 수 있어요~

-- // 1. 테스트 테이블 생성
CREATE TABLE `products` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `price` int DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `product_id` int NOT NULL,
  `product_name` varchar(10) NOT NULL,
  `user_id` int NOT NULL,
  `status` varchar(10) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

-- // 2. 테스트 데이터 생성
INSERT INTO products VALUES (1, '사과', 1000), (2, '오렌지', 1000), (3, '바나나', 1000), (4, '수박', 1000), (5, '블루베리', 1000);
INSERT INTO orders VALUES (1, 3, '잘못된이름', 1, 'FINISHED', NOW(), NOW());

-- // 3. 쿼리 실행 테스트
-- // 1) orders 테이블에서 주문한 제품명에 대해 '잘못된이름' 값을 '바나나'로 올바르게 변경
Session 1> BEGIN;
Session 1> UPDATE orders o
           JOIN products p ON p.id = o.product_id
           SET o.product_name = p.name
           WHERE o.id = 1;

-- // 2) 다른 세션에서 '바나나' 제품에 대해 가격 변경 시도
Session 2> BEGIN;
Session 2> UPDATE products SET price = 2000 WHERE id=3;
==> Session 1에서 수행된 JOIN UPDATE 쿼리로 인해 실행되지 못하고 잠금을 대기

그리고 MySQL 서버에 performance_schema가 활성화돼있는 경우 performance_schema.data_locks 테이블을 조회하면 쿼리에서 어떤 데이터에 대해 어떤 잠금을 수행하고 있는지도 확인하실 수 있어요. 이 부분도 살펴보셔도 좋을 것 같아 말씀드립니다.

-- // performance_schema 활성화 여부 확인
mysql> show global variables like 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+

그럼 추가로 더 궁금한 부분 있으시면 편하게 말씀해주세요.

감사합니다.

황정태님의 프로필 이미지
황정태
질문자

2024. 07. 15. 08:47

상세한 예시까지 첨부된 답변 너무 감사드립니다!

0

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

2024. 07. 11. 16:41

안녕하세요, 인프런 AI 인턴입니다.

제공해주신 정보 속에서는 잠금(lock) 메커니즘에 대한 구체적인 내용이나 예시가 포함되어 있지 않습니다. 따라서 질문하신 내용에 직접적으로 답변드릴 수 있는 정보를 제공하기 어렵습니다. SQL 데이터베이스의 잠금 메커니즘과 관련하여 공식 문서나 기술 참고 자료를 찾아보시는 것이 좋을 것 같습니다. 잠금경합이나 lock wait timeout 발생에 대한 이해와 관련해서는 트랜잭션의 격리 수준(isolation level), 트랜잭션 처리 과정에서의 잠금 타입(읽기 잠금, 쓰기 잠금 등)을 공부하는 것이 도움이 될 수 있습니다.