ヒント名 | 適用範囲 | 用途 |
TXSQL_FORCE_LOCK | トランザクションレベル | 1つのトランザクション内で複数の異なるホットスポット行を更新します。 |
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への後続アクセスをすべて許可します。 |
トランザクションが2回目以降に行XにアクセスするDML上 | Hintは無記入と同等です:行Xは初回アクセス時に「非独立グループ」として記録されており、今回のアクセスは「同一ホットスポット行への二次アクセス」と判定され、トランザクションはロールバックされます。 |
現在のトランザクションがTXPQL_FORCE_LOCKトランザクションではない場合です。 | 解析時に警告を出して破棄し、通常のステートメントとして処理します。 |
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;
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;
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;
SHOW WARNINGSを使用して、配置位置の誤りにより無視されていないかどうかを確認できます)。フィードバック