tencent cloud

TencentDB for MySQL

문서TencentDB for MySQL자체개발 커널안정적 특성핫스팟 업데이트핫스팟 업데이트: 다중 핫스팟 업데이트 힌트

핫스팟 업데이트: 다중 핫스팟 업데이트 힌트

Download
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-07-01 14:54:33

기능 개요

TencentDB for MySQL은 MySQL 8.0 20260512 버전에서 두 개의 SQL Hint를 추가했습니다. 이는 단일 트랜잭션 내에서 여러 핫스팟 행을 업데이트하거나, 동일 트랜잭션 내에서 동일 핫스팟 행에 여러 번 액세스하는 것을 지원하기 위함입니다. 본 문서에서는 이 두 Hint의 사용 방식을 중점적으로 설명합니다.
Hint 이름
적용 범위
용도
TXSQL_FORCE_LOCK
트랜잭션 레벨
단일 트랜잭션 내에서 여러 개의 상이한 핫스팟 행을 업데이트합니다.
TXSQL_FORCE_LOCK_INDEPENDENT_GROUP
단일 핫스팟 행 레벨
동일 트랜잭션이 동일 핫스팟 행에 대해 다중 액세스를 수행할 수 있도록 허용합니다.

사용 설명

구문 형식

Hint는 MySQL 표준 /*+ ... */ 구문을 사용하며, UPDATE / INSERT / DELETE 키워드 바로 뒤에 위치시킵니다.
UPDATE /*+ TXSQL_FORCE_LOCK */ table_name SET col = ... WHERE ...;
UPDATE /*+ TXSQL_FORCE_LOCK TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */ table_name SET col = ... WHERE ...;

핵심 배치 규칙(반드시 준수)

TXSQL_FORCE_LOCK은 트랜잭션의 첫 번째 DML 문에 위치시켜야 합니다.
올바른 위치에 배치: 전체 트랜잭션이 FORCE_LOCK 모드로 전환되며, 이후 DML에는 Hint를 추가로 포함할 필요가 없습니다.
첫 번째 DML이 아닌 위치에 배치: Hint가 무시되고 경고가 발생하며, 트랜잭션은 기존 제약 조건에 따라 실행됩니다.
TXSQL_FORCE_LOCK_INDEPENDENT_GROUP은 트랜잭션이 대상 핫스팟 행에 처음 접근하는 DML에 위치시켜야 합니다.
해당 Hint는 트랜잭션이 이미 TXSQL_FORCE_LOCK 상태일 때만 적용되며, 그렇지 않으면 파싱 단계에서 무시되고 경고가 발생합니다.
대상 핫스팟 행의 속성은 첫 번째 액세스 시점에 일괄적으로 결정됩니다. 이후 다시 액세스할 때 Hint를 포함하더라도 '동일 트랜잭션 내에서 동일 핫스팟 행에 두 번째로 액세스'한 것으로 간주되어 트랜잭션 롤백이 발생합니다.
Hint는 트랜잭션 또는 문장을 넘어서 상속되지 않으며, 트랜잭션 종료 시 자동으로 비활성화됩니다.

INDEPENDENT_GROUP 상이한 배치 위치의 실제 동작

배치 위치
실제 효과
트랜잭션이 행 X를 처음으로 액세스하는 DML 구문에
행 X가 독립 그룹으로 진입하며, 본 트랜잭션은 행 X에 대한 후속 액세스를 모두 허용합니다.
트랜잭션이 행 X를 두 번째 이후로 액세스하는 DML 구문에
Hint는 작성하지 않은 것과 동일하게 처리됩니다. 행 X는 첫 번째 액세스 시 '비독립 그룹'으로 기록되었으며, 이번 액세스는 '동일 핫스팟 행에 대한 재차 액세스'로 판정되어 트랜잭션이 롤백됩니다.
현재 트랜잭션이 TXSQL_FORCE_LOCK 트랜잭션이 아닌 경우
파싱 단계에서 경고를 발생시키고 폐기하며, 일반 구문으로 처리합니다.

사용 시나리오 및 전체 예시

시나리오 1: 단일 트랜잭션에서 상이한 다중 핫스팟 행 업데이트

적용: 단일 트랜잭션 내에서 여러 핫스팟 데이터를 동시에 수정해야 하는 경우(예: 여러 계정 잔액을 일괄 차감)에 사용합니다.
방법: 트랜잭션의 첫 번째 DML에만 TXSQL_FORCE_LOCK을 추가하며, 이후 DML에는 Hint를 추가로 포함할 필요가 없습니다.
BEGIN;
-- ① 첫 번째 DML에는 TXSQL_FORCE_LOCK을 포함시켜야 합니다.
UPDATE /*+ TXSQL_FORCE_LOCK */ t_account SET balance = balance + 100 WHERE id = 1;

-- ② 두 번째 및 이후 DML에는 hint를 추가로 포함할 필요가 없으며, 트랜잭션이 이미 force_lock 모드에 진입한 상태입니다.
UPDATE t_account SET balance = balance + 100 WHERE id = 2;
UPDATE t_account SET balance = balance + 100 WHERE id = 3;
COMMIT;

시나리오 2: 단일 트랜잭션에서 동일 핫스팟 행 다중 액세스

적용: 단일 트랜잭션 내에서 동일 핫스팟 데이터에 대해 여러 번의 읽기/쓰기 작업을 수행해야 하는 경우(예: 먼저 차감, 다음 검증, 이후 조정)에 사용합니다.
방법: 트랜잭션이 해당 핫스팟 행에 처음 접근하는 DML에 TXSQL_FORCE_LOCK과 TXSQL_FORCE_LOCK_INDEPENDENT_GROUP을 동시에 포함시킵니다. 이후 접근에는 Hint를 포함하지 않습니다.
BEGIN;
-- ① id=1에 처음 접근할 때 두 개의 hint를 반드시 동시에 포함시켜야 합니다.
UPDATE /*+ TXSQL_FORCE_LOCK TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */
t_account SET balance = balance + 1 WHERE id = 1;

-- ② 이후 id=1에 대한 접근에는 INDEPENDENT_GROUP을 포함하지 않아야 하며, 포함해서도 안 됩니다.
UPDATE t_account SET balance = balance + 1 WHERE id = 1;
COMMIT;

반례: INDEPENDENT_GROUP 초기 액세스 누락

다음은 잘못된 사용법 예시이며, 트랜잭션이 롤백됩니다:
BEGIN;
-- id=1에 처음 접근할 때 INDEPENDENT_GROUP을 누락했습니다.
UPDATE /*+ TXSQL_FORCE_LOCK */ t_account SET balance = balance + 1 WHERE id = 1;

-- 두 번째 접근 시에야 INDEPENDENT_GROUP을 추가했지만, 이미 너무 늦었습니다.
-- 이 시점에서 id=1은 '비독립 그룹'으로 기록되었으며, 본 항목은 '동일 핫스팟 행에 대한 두 번째 접근'으로 판단되어 트랜잭션이 롤백됩니다.
UPDATE /*+ TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */
t_account SET balance = balance + 1 WHERE id = 1;
COMMIT;

사용 제약

단일 트랜잭션은 최대 10개의 핫스팟 행에 참여할 수 있으며(undo 페이지 고정 지속성 영역 용량 제한으로 인함), 이를 초과하면 트랜잭션이 롤백되고 경고가 기록됩니다.
TXSQL_FORCE_LOCK은 트랜잭션의 첫 번째 DML에 위치시켜야 하며, TXSQL_FORCE_LOCK_INDEPENDENT_GROUP은 해당 핫스팟 행에 처음 접근하는 DML에 위치시켜야 합니다. 잘못된 위치에 배치하면 기능이 비활성화되거나 트랜잭션이 롤백됩니다.
Hint는 트랜잭션 또는 문장을 넘어서 상속되지 않으며, 각 트랜잭션/문장마다 다시 선언해야 합니다.
설명:
기능을 사용하기 전에 테스트 환경에서 업무 트랜잭션을 검증하여 Hint가 실제로 적용되었는지 확인하시기 바랍니다(SHOW WARNINGS를 통해 배치 위치 오류로 인해 무시되었는지 확인 가능합니다).

추가 설명

본 버전에서는 핫스팟 행 쿨링 시 발생하는 성능 저하 문제를 함께 최적화했습니다. 대기열 선두 대기자의 자동 재개 및 슬라이딩 윈도우 기반 쿨링 메커니즘을 통해, 핫스팟 트래픽이 감소할 때 불필요한 트랜잭션 지연을 해결했습니다. 이 최적화는 업무에 영향을 주지 않으며, 별도 개선 작업이 필요하지 않습니다.

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백