Topik ini menjelaskan fitur inventory hint yang disediakan oleh AliSQL. Anda dapat menggunakan fitur ini bersama dengan fitur returning dan statement queue untuk melakukan commit dan rollback transaksi secara cepat, sehingga meningkatkan throughput aplikasi Anda.
Informasi latar belakang
Pada kasus penggunaan seperti flash sale, pengurangan inventaris merupakan tugas umum yang memerlukan konkurensi tinggi sekaligus pemrosesan serial. AliSQL menggunakan antrian dan petunjuk transaksional untuk mengontrol konkurensi, sehingga memungkinkan commit atau rollback transaksi dilakukan dengan cepat serta meningkatkan throughput bisnis.
Dengan fitur inventory hint, Anda dapat meningkatkan kinerja instans ApsaraDB RDS for MySQL hingga mencapai 31.000 transaksi per detik (TPS) saat memperbarui hot data pada satu baris tabel. Untuk informasi selengkapnya, lihat Metode dan hasil pengujian pembaruan hot data pada satu baris.
Prasyarat
Instans RDS harus menjalankan salah satu versi MySQL berikut:
MySQL 8.4
MySQL 8.0
MySQL 5.7
MySQL 5.6
Sintaksis
Petunjuk berikut diperkenalkan dan dapat digunakan dalam pernyataan SELECT, UPDATE, INSERT, dan DELETE:
Untuk MySQL 5.7, 8.0, dan 8.4:
Petunjuk transaksional berikut diperkenalkan:
COMMIT_ON_SUCCESS: Transaksi dilakukan commit jika eksekusi pernyataan tempat petunjuk ini diterapkan berhasil.
ROLLBACK_ON_FAIL: Transaksi dilakukan 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 menerapkan petunjuk kondisional ini pada pernyataan saat ini, eksekusi pernyataan hanya berhasil jika jumlah baris yang terpengaruh sama dengan angka yang ditentukan dalam petunjuk tersebut.
Sintaksis:
/*+ TARGET_AFFECT_ROW(NUMBER) */Contoh:
UPDATE /*+ TARGET_AFFECT_ROW(1) */ T SET c = c - 1 WHERE id = 1;
MySQL 5.6
Sintaksis petunjuk pada MySQL 5.6 mirip dengan sintaksis petunjuk pada MySQL 5.7 dan MySQL 8.0. Satu-satunya perbedaan adalah Anda tidak perlu menyertakan petunjuk tersebut 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, hal tersebut memicu komitmen otomatis transaksi. Oleh karena itu, letakkan petunjuk tersebut pada pernyataan SQL terakhir dalam transaksi.
Petunjuk transaksional tidak mendukung mode autocommit. Jika Anda menggunakan petunjuk transaksional dalam pernyataan yang dieksekusi dalam mode autocommit, sistem akan melaporkan error. 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 subpernyataan. Jika Anda menggunakan petunjuk transaksional dalam subpernyataan, sistem akan melaporkan error. 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, sistem akan melaporkan error. 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 error:
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 sama dengan fitur returning
Anda dapat menggunakan fitur inventory hint bersama dengan fitur returning agar sistem dapat mengembalikan set hasil secara real-time. Untuk informasi selengkapnya, 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 sama dengan fitur statement queue
Anda dapat menggunakan fitur inventory hint bersama dengan fitur statement queue agar sistem dapat mengantrikan pernyataan. Untuk informasi selengkapnya, lihat Statement queue. 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