tencent cloud

TencentDB for MySQL

ドキュメントTencentDB for MySQL自社研究カーネル安定性系特性ホットアップデートホットアップデート:マルチホットアップデートのヒント

ホットアップデート:マルチホットアップデートのヒント

Download
フォーカスモード
フォントサイズ
最終更新日: 2026-07-01 14:54:33

機能概要

TencentDB for MySQLのMySQL 8.0 20260512バージョンでは、2つのSQLヒントを追加しました。これは、単一のトランザクション内で複数のホットスポット行を更新する、または同一トランザクション内で同一のホットスポット行に複数回アクセスすることをサポートするためのものです。本記事では、これら2つのヒントの使用方法について重点的に説明します。
ヒント名
適用範囲
用途
TXSQL_FORCE_LOCK
トランザクションレベル
1つのトランザクション内で複数の異なるホットスポット行を更新します。
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への後続アクセスをすべて許可します。
トランザクションが2回目以降に行XにアクセスするDML上
Hintは無記入と同等です:行Xは初回アクセス時に「非独立グループ」として記録されており、今回のアクセスは「同一ホットスポット行への二次アクセス」と判定され、トランザクションはロールバックされます。
現在のトランザクションがTXPQL_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;

-- ② 2番目以降の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への初回アクセスでは、2つの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;

-- 2回目のアクセス時に初めてINDEPENDENT_GROUPを追加しましたが、すでに手遅れです。
-- この時点でid=1は「非独立グループ」として記録されています。この操作は「同一ホットスポット行への二次アクセス」と判定され、トランザクションはロールバックされます。
UPDATE /*+ TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */
t_account SET balance = balance + 1 WHERE id = 1;
COMMIT;

使用制約

単一トランザクションは、最大10個のホットスポット行に関与できます(undoページの固定永続化領域の容量制限による)。これを超えると、トランザクションはロールバックされ、warningが出力されます。
TXSQL_FORCE_LOCKは、トランザクションの最初のDMLに配置する必要があります。TXSQL_FORCE_LOCK_INDEPENDENT_GROUPは、対応するホットスポット行への初回アクセスDMLに配置する必要があります。配置を誤ると、無効になるか、トランザクションがロールバックされます。
Hintはトランザクションやステートメントをまたいで継承されません。各トランザクション/ステートメントごとに、再宣言する必要があります。
説明:
機能を使用する前に、テスト環境でビジネストランザクションを検証し、Hintが実際に有効になっていることを確認することをお勧めします(SHOW WARNINGSを使用して、配置位置の誤りにより無視されていないかどうかを確認できます)。

補足説明

本バージョンでは、ホットスポット行の冷却時のパフォーマンス低下問題も最適化されました:キュー先頭の待機者の自己ウェイクアップと、スライディングウィンドウに基づく冷却メカニズムにより、ホットスポットトラフィックが大きい状態から小さい状態に変化する際の不要なトランザクション遅延を解決しています。この最適化はビジネスに影響を与えず、改造も不要です。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック