Topik ini menjelaskan fitur petunjuk inventaris yang disediakan oleh AliSQL. Anda dapat menggunakan fitur ini bersama dengan fitur returning dan antrian pernyataan untuk melakukan commit dan rollback transaksi dengan kecepatan tinggi, sehingga meningkatkan throughput aplikasi.
Informasi latar belakang
Dalam skenario bisnis seperti flash sale, pengurangan inventaris adalah model tugas umum yang memerlukan konkurensi dan serialisasi tinggi. Dalam model ini, AliSQL menggunakan antrian dan petunjuk transaksional untuk mengontrol konkurensi serta melakukan commit atau rollback transaksi, sehingga meningkatkan throughput aplikasi.
Anda dapat menggunakan fitur petunjuk inventaris untuk meningkatkan performa instance ApsaraDB RDS for MySQL hingga mencapai 31.000 transaksi per detik (TPS) ketika Anda memperbarui data panas pada satu baris tabel. Untuk informasi lebih lanjut, lihat Metode dan hasil pengujian pembaruan data panas pada satu baris.
Prasyarat
Instance RDS harus menjalankan salah satu versi MySQL berikut:
MySQL 8.0
MySQL 5.7
MySQL 5.6
Sintaksis
Petunjuk berikut diperkenalkan dan dapat digunakan dalam pernyataan SELECT, UPDATE, INSERT, dan DELETE:
MySQL 5.7 dan MySQL 8.0
Petunjuk transaksional berikut diperkenalkan:
COMMIT_ON_SUCCESS: Transaksi akan di-commit jika eksekusi pernyataan tempat petunjuk ini diterapkan berhasil.
ROLLBACK_ON_FAIL: Transaksi akan di-rollback jika eksekusi pernyataan tempat petunjuk ini diterapkan gagal.
Sintaksis:
/*+ COMMIT_ON_SUCCESS */ /*+ ROLLBACK_ON_FAIL */Contoh:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ T SET c = c - 1 WHERE id = 1;Petunjuk kondisional TARGET_AFFECT_ROW(NUMBER) diperkenalkan.
Setelah Anda menerapkan petunjuk kondisional pada pernyataan saat ini, eksekusi pernyataan tersebut hanya akan berhasil jika jumlah baris yang terpengaruh sama dengan angka yang ditentukan dalam petunjuk ini.
Sintaksis:
/*+ TARGET_AFFECT_ROW(NUMBER) */Contoh:
UPDATE /*+ TARGET_AFFECT_ROW(1) */ T SET c = c - 1 WHERE id = 1;
MySQL 5.6
Sintaksis untuk petunjuk dalam MySQL 5.6 serupa dengan sintaksis untuk petunjuk dalam MySQL 5.7 dan MySQL 8.0. Satu-satunya perbedaan adalah Anda tidak perlu menyertakan petunjuk dalam komentar seperti pada MySQL 5.7 dan MySQL 8.0.
Contoh:
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;
Catatan penggunaan
Petunjuk harus diikuti oleh nama tabel.
Ketika petunjuk yang digunakan dalam transaksi berlaku, itu memicu komitmen otomatis transaksi. Oleh karena itu, letakkan petunjuk pada pernyataan SQL terakhir dari transaksi.
Petunjuk transaksional tidak mendukung mode autocommit. Jika Anda menggunakan petunjuk transaksional dalam pernyataan yang dieksekusi dalam mode autocommit, kesalahan akan dilaporkan. Contoh:
mysql> UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; ERROR 7531 (HY000): Inventory transactional hints didn't allowed in autocommit modePetunjuk transaksional tidak dapat digunakan dalam sub-pernyataan. Jika Anda menggunakan petunjuk transaksional dalam sub-pernyataan, kesalahan akan dilaporkan. Contoh:
mysql> CREATE TRIGGER tri_1 -> BEFORE INSERT ON t -> FOR EACH ROW -> BEGIN -> INSERT /*+ commit_on_success */ INTO t1 VALUES (1); -> end// mysql> INSERT INTO t VALUES (2, 1); ERROR HY000: Inventory transactional hints didn't alllowed in stored procedurePetunjuk kondisional tidak dapat digunakan dalam pernyataan SELECT atau EXPLAIN. Jika Anda menggunakan petunjuk kondisional dalam pernyataan SELECT atau EXPLAIN, kesalahan akan dilaporkan. Contoh:
mysql> EXPLAIN UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; ERROR 7532 (HY000): Inventory conditional hints didn't match with resultCatatanAnda dapat menentukan angka yang tidak valid dalam TARGET_AFFECT_ROW dan memeriksa apakah sistem melaporkan kesalahan:
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 row in set, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1064 | Optimizer hint syntax error near '-1) */ t set col1=col1+1 where id =1' at line 1 | | Note | 1003 | update /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ `test`.`t` set `test`.`t`.`col1` = (`test`.`t`.`col1` + 1) where (`test`.`t`.`id` = 1) | +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Bekerja dengan fitur returning
Anda dapat menggunakan fitur petunjuk inventaris bersama dengan fitur returning untuk memungkinkan sistem mengembalikan set hasil secara real-time. Untuk informasi lebih lanjut, lihat Returning. Contoh:
mysql> CALL dbms_trans.returning("*", "update /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t
set col1=col1+1 where id=1");
+----+------+
| id | col1 |
+----+------+
| 1 | 13 |
+----+------+
1 row in set (0.00 sec)
mysql> CALL dbms_trans.returning("*", "insert /*+ commit_on_success rollback_on_fail target_affect_row(1) */ into
t values(10,10)");
+----+------+
| id | col1 |
+----+------+
| 10 | 10 |
+----+------+
1 row in set (0.01 sec)
Bekerja dengan fitur antrian pernyataan
Anda dapat menggunakan fitur petunjuk inventaris bersama dengan fitur antrian pernyataan agar sistem dapat mengantre pernyataan. Untuk informasi lebih lanjut, lihat Antrian Pernyataan. Contoh:
mysql> UPDATE /*+ ccl_queue_field(id) commit_on_success rollback_on_fail target_affect_row(1) */ t
-> SET col1 = col1 + 1
-> WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 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;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0