해결된 질문
작성
·
144
0
강의 마지막 주의사항 중 아래의 설명이 있었는데요.
"참조하는 테이블들의 데이터에는 읽기 잠금(Shared Lock) 이 발생하므로, 잠금경합이 발생할 수 있음"
이 부분에 대한 추가적인 궁금증이 있습니다.
만약 Product 테이블이 100만건이 있고
Order 테이블을 업데이트 하기 위해 Product 테이블과 JOIN 을 거는 상황이라고 했을 때 업데이트 대상이 되는 Order 테이블에 X 락이 걸리는 것 뿐만 아니라, Product 테이블에도 S락이 걸리므로 다른 트랜잭션에서 Product 테이블에 UPDATE 를 하려고 했을때 lock wait timeout 같은 문제가 발생할수있다는 것일까요?
답변 2
0
안녕하세요.
말씀해주신 내용이 맞습니다. 간단하게는 아래와 같이 확인해보실 수 있어요~
-- // 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 |
+--------------------+-------+
그럼 추가로 더 궁금한 부분 있으시면 편하게 말씀해주세요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
제공해주신 정보 속에서는 잠금(lock) 메커니즘에 대한 구체적인 내용이나 예시가 포함되어 있지 않습니다. 따라서 질문하신 내용에 직접적으로 답변드릴 수 있는 정보를 제공하기 어렵습니다. SQL 데이터베이스의 잠금 메커니즘과 관련하여 공식 문서나 기술 참고 자료를 찾아보시는 것이 좋을 것 같습니다. 잠금경합이나 lock wait timeout 발생에 대한 이해와 관련해서는 트랜잭션의 격리 수준(isolation level), 트랜잭션 처리 과정에서의 잠금 타입(읽기 잠금, 쓰기 잠금 등)을 공부하는 것이 도움이 될 수 있습니다.
상세한 예시까지 첨부된 답변 너무 감사드립니다!