このトピックでは、AliSQLが提供するインベントリヒント機能について説明します。 この機能を [ReturningQueue] および [Statement Queue] 機能とともに使用すると、トランザクションを高速にコミットおよびロールバックできます。
背景情報
フラッシュ販売などのビジネスシナリオでは、在庫削減は高い同時実行性とシリアル化を必要とする一般的なタスクモデルです。 このモデルでは、AliSQLはキューとトランザクションヒントを使用して同時実行を制御し、トランザクションをコミットまたはロールバックします。 これにより、ビジネスのスループットが向上します。
テーブルの1行のホットデータを更新すると、インベントリヒント機能を使用して、ApsaraDB RDS for MySQLインスタンスのパフォーマンスを最大31,000トランザクション /秒 (TPS) に向上させることができます。 詳細については、「単一の行でのホットデータ更新のテスト方法と結果」をご参照ください。
前提条件
RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。
- MySQL 8.0
- MySQL 5.7
- MySQL 5.6
構文
次のヒントは、SELECT、UPDATE、INSERT、およびDELETEステートメントでテーブルを指定するために導入されます。
- COMMIT_ON_SUCCESSとROLLBACK_ON_FAIL
これらは2つのトランザクションヒントです。
- COMMIT_ON_SUCCESS: このヒントが適用されるステートメントの実行が成功した場合、トランザクションをコミットすることを指定します。
- ROLLBACK_ON_FAIL: このヒントが適用されたステートメントの実行が失敗した場合、トランザクションをロールバックすることを指定します。
構文:
/* + COMMIT_ON_SUCCESS * / /* + ROLLBACK_ON_FAIL */
例:
UPDATE /* + COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ T SET c = c - 1 WHERE id = 1;
- TARGET_AFFECT_ROW (番号)
これは条件付きヒントです。 ステートメントに適用した後、影響を受ける行の数がこのヒントで指定された数と同じである場合にのみ、ステートメントの実行が成功します。
構文:
/* + TARGET_AFFECT_ROW (番号) */
例:
UPDATE /* + TARGET_AFFECT_ROW(1) */ T SET c = c - 1 WHERE id = 1;
注意事項
- ヒントの後にテーブル名を付ける必要があります。
- トランザクションヒントは自動コミットモードをサポートしていません。 自動コミットモードで実行されるステートメントでトランザクションヒントを使用すると、エラーが報告されます。 例:
でトランザクションヒントのインベントリが許可されなかったmysql> UPDATE /* + commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; エラー7531 (HY000): 自動コミットモード
- 取引ヒントは、サブステーションでは使用できません。 サブステートメントでトランザクションヒントを使用すると、エラーが報告されます。 例:
でインベントリトランザクションヒントが許可されなかったmysql> CREATE TRIGGER tri_1 -> 挿入前にt -> 各列のため -> 開始 -> INSERT /* + commit_on_success */ INTO t1 VALUES (1); -> end // mysql> INSERTにt値 (2、1); ERROR HY000: ストアドプロシージャ
- 条件付きヒントは、SELECTステートメントまたはEXPLAINステートメントでは使用できません。 SELECTまたはEXPLAINステートメントで条件付きヒントを使用すると、エラーが報告されます。 例:
と一致しませんでしたmysql> EXPLAIN UPDATE /* + commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; エラー7532 (HY000): インベントリ条件付きヒントが結果
説明 TARGET_AFFECT_ROWヒントに無効な番号を指定し、システムがエラーを報告しているかどうかを確認できます:mysql> EXPLAIN UPDATE /* + commit_on_success rollback_on_fail target_affect_row(-1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; ---- ----------- --------------------------------------------------------------------------------------------------------- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ---- ----------- --------------------------------------------------------------------------------------------------------- | 1 | UPDATE | t | NULL | range | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using where | ---- ----------- --------------------------------------------------------------------------------------------------------- セットの1列、2警告 (0.00秒) mysql> 警告を表示します。+ -------- + ------- + ----------------------------------------------------------------------------------------------------------------------------------------- + | レベル | コード | メッセージ | + -------- + ------- + ----------------------------------------------------------------------------------------------------------------------------------------- + | 警告 | 1064 | オプティマイザーヒント構文エラー '-1近く) */ t set col1=col1 + 1 (id =1' 行目) | | 注 | 1003 | update /* + COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ 'test'.'t' set 'test'.'t'= ('test'.'t'.'col1' + 1) ('test'.'t'.'id' = 1) | + -------- + ------- + ----------------------------------------------------------------------------------------------------------------------------------------- + セットの2列 (0.00秒)
戻る作業
システムがリアルタイムの結果セットを返すことを可能にするために、インベントリのヒント機能を返す機能と一緒に使用できます。 詳細については、「返却」をご参照ください。 例:
mysql> CALL dbms_trans.returning("*", "update /* + commit_on_success rollback_on_fail target_affect_row(1) */ t
col1=col1 + 1 (id=1 ") を設定します。+ ---- + ------
| id | col1 |
+ ---- + ------
| 1 | 13 |
+ ---- + ------
セットの1列 (0.00秒)
mysql> CALL dbms_trans.returning("*", "insert /* + commit_on_success rollback_on_fail target_affect_row(1) */ into
t値 (10,10)";
+ ---- + ------
| id | col1 |
+ ---- + ------
| 10 | 10 |
+ ---- + ------
セットの1列 (0.01秒)
ステートメントキューの操作
システムのステートメントキュー機能でインベントリのヒントを使用して、ステートメントをキューに入れることができます。 詳細は、「ステートメントキュー」をご参照ください。 例:
mysql> UPDATE /* + ccl_queue_field(id) commit_on_success rollback_on_fail target_affect_row(1) */ t
-> SET col1 = col1 + 1
-> WHERE id = 1;
クエリOK、影響を受ける1行 (0.00秒)
一致した行: 1変更: 1警告: 0
mysql> UPDATE /* + ccl_queue_value(1) commit_on_success rollback_on_fail target_affect_row(1) */ t
-> SET col1 = col1 + 1
-> WHERE id = 1;
クエリOK、影響を受ける1行 (0.00秒)
一致した行: 1変更: 1警告: 0