Hint 이름 | 적용 범위 | 용도 |
TXSQL_FORCE_LOCK | 트랜잭션 레벨 | 단일 트랜잭션 내에서 여러 개의 상이한 핫스팟 행을 업데이트합니다. |
TXSQL_FORCE_LOCK_INDEPENDENT_GROUP | 단일 핫스팟 행 레벨 | 동일 트랜잭션이 동일 핫스팟 행에 대해 다중 액세스를 수행할 수 있도록 허용합니다. |
/*+ ... */ 구문을 사용하며, 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 ...;
배치 위치 | 실제 효과 |
트랜잭션이 행 X를 처음으로 액세스하는 DML 구문에 | 행 X가 독립 그룹으로 진입하며, 본 트랜잭션은 행 X에 대한 후속 액세스를 모두 허용합니다. |
트랜잭션이 행 X를 두 번째 이후로 액세스하는 DML 구문에 | Hint는 작성하지 않은 것과 동일하게 처리됩니다. 행 X는 첫 번째 액세스 시 '비독립 그룹'으로 기록되었으며, 이번 액세스는 '동일 핫스팟 행에 대한 재차 액세스'로 판정되어 트랜잭션이 롤백됩니다. |
현재 트랜잭션이 TXSQL_FORCE_LOCK 트랜잭션이 아닌 경우 | 파싱 단계에서 경고를 발생시키고 폐기하며, 일반 구문으로 처리합니다. |
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;
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;
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;
SHOW WARNINGS를 통해 배치 위치 오류로 인해 무시되었는지 확인 가능합니다).피드백