このトピックでは、AliSQLが提供するインベントリヒント機能について説明します。 この機能をリターンおよびステートメントキュー機能と一緒に使用すると、トランザクションを高速にコミットおよびロールバックできます。 これにより、アプリケーションのスループットが向上します。
背景情報
フラッシュ販売などのビジネスシナリオでは、在庫削減は高い同時実行性とシリアル化を必要とする一般的なタスクモデルです。 このモデルでは、AliSQLはキューとトランザクションヒントを使用して同時実行を制御し、トランザクションをコミットまたはロールバックします。 これにより、アプリケーションのスループットが向上します。
テーブルの1行のホットデータを更新すると、インベントリヒント機能を使用して、ApsaraDB RDS for MySQLインスタンスのパフォーマンスを最大31,000トランザクション /秒 (TPS) に向上させることができます。 詳細については、「単一の行でのホットデータ更新のテスト方法と結果」をご参照ください。
前提条件
RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。
MySQL 8.0
MySQL 5.7
MySQL 5.6
構文
次のヒントが導入され、SELECT、UPDATE、INSERT、およびDELETEステートメントで使用できます。
MySQL 5.7とMySQL 8.0
次のトランザクションヒントが導入されます。
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(NUMBER) が導入されます。
現在のステートメントに条件付きヒントを適用すると、影響を受ける行の数がこのヒントで指定された数と同じである場合にのみ、ステートメントの実行が成功します。
構文:
/* + TARGET_AFFECT_ROW (番号) */
例:
UPDATE /* + TARGET_AFFECT_ROW(1) */ T SET c = c - 1 WHERE id = 1;
MySQL 5.6
MySQL 5.6のヒントの構文は、MySQL 5.7およびMySQL 8.0のヒントの構文と似ています。 唯一の違いは、MySQL 5.7にヒントを含める必要がなく、コメントにMySQL 8.0を含める必要がないことです。
例:
UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL T SET c = c - 1 WHERE id = 1; UPDATE TARGET_AFFECT_ROW(1) T SET c = c - 1 WHERE id = 1;
使用上の注意
ヒントの後にテーブル名を付ける必要があります。
トランザクションで使用されるヒントが有効になると、トランザクションの自動コミットがトリガーされます。 したがって、トランザクションの最後のSQLステートメントにヒントを配置します。
トランザクションヒントは自動コミットモードをサポートしていません。 自動コミットモードで実行されるステートメントでトランザクションヒントを使用すると、エラーが報告されます。 例:
でトランザクションヒントのインベントリが許可されなかったmysql> UPDATE /* + commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; エラー7531 (HY000): 自動コミットモード
取引ヒントは、サブステーションでは使用できません。 サブステートメントでトランザクションヒントを使用すると、エラーが報告されます。 例:
でインベントリトランザクションヒントが許可されなかったmysql> 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