Petunjuk inventaris memungkinkan Anda menyematkan logika kontrol transaksi langsung dalam pernyataan SQL—melakukan commit atau rollback transaksi berdasarkan hasil eksekusi pernyataan tersebut. Dalam skenario penulisan dengan konkurensi tinggi seperti penjualan kilat dan pengurangan inventaris, beberapa transaksi bersaing untuk memperbarui baris yang sama secara simultan, menyebabkan kontensi lock yang menurunkan throughput. Petunjuk inventaris menyelesaikan setiap operasi tulis yang bersaing dalam satu round trip, sehingga menghilangkan kebutuhan akan logika retry di sisi aplikasi. Gunakan fitur ini bersama dengan fitur statement queue untuk menserialisasi operasi tulis yang bertabrakan ke dalam bucket dan memaksimalkan throughput.
Versi yang didukung
Petunjuk inventaris tersedia pada versi PolarDB for MySQL berikut:
| Versi | Versi minor kernel minimum |
|---|---|
| PolarDB for MySQL 8.0 | 8.0.1.1.1 |
| PolarDB for MySQL 5.7 | 5.7.1.0.17 |
| PolarDB for MySQL 5.6 | Semua versi minor |
Untuk memeriksa versi minor kernel kluster Anda, lihat Query the engine version.
Cara kerja
Petunjuk inventaris mendukung pernyataan SELECT, UPDATE, INSERT, dan DELETE. Tiga jenis petunjuk tersedia:
| Petunjuk | Efek | Dipicu saat |
|---|---|---|
COMMIT_ON_SUCCESS | Melakukan commit transaksi saat ini | Pernyataan dieksekusi berhasil |
ROLLBACK_ON_FAIL | Melakukan rollback transaksi saat ini | Pernyataan gagal |
TARGET_AFFECT_ROW(n) | Menandai pernyataan sebagai gagal jika jumlah baris yang terpengaruh tidak sama dengan n | Eksekusi pernyataan |
Petunjuk-petunjuk ini bekerja bersama untuk menjalankan operasi DML sekaligus menentukan hasil transaksi dalam satu pernyataan:
COMMIT_ON_SUCCESSsegera melakukan commit transaksi ketika pernyataan berhasil.ROLLBACK_ON_FAILsegera melakukan rollback transaksi ketika pernyataan gagal.TARGET_AFFECT_ROW(n)mengubah ketidaksesuaian jumlah baris—misalnya, mencoba memperbarui item yang sudah habis—menjadi kegagalan pernyataan, yang kemudian ditangkap olehROLLBACK_ON_FAIL.
Menggabungkan ketiga petunjuk ini dengan statement queue menserialisasi operasi tulis yang bertabrakan ke dalam bucket dan menyelesaikan setiap transaksi dalam satu round trip.
Sintaks
Sintaks berbeda antara PolarDB for MySQL 5.6 dan PolarDB for MySQL 5.7/8.0.
COMMIT_ON_SUCCESS
Menjalankan commit transaksi ketika pernyataan berhasil.
PolarDB for MySQL 5.6
UPDATE COMMIT_ON_SUCCESS t
SET c = c - 1
WHERE id = 1;PolarDB for MySQL 5.7 dan 8.0
UPDATE /*+ COMMIT_ON_SUCCESS */ t
SET c = c - 1
WHERE id = 1;ROLLBACK_ON_FAIL
Menjalankan rollback transaksi ketika pernyataan gagal.
PolarDB for MySQL 5.6
UPDATE ROLLBACK_ON_FAIL t
SET c = c - 1
WHERE id = 1;PolarDB for MySQL 5.7 dan 8.0
UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;TARGET_AFFECT_ROW
Menandai pernyataan sebagai gagal jika jumlah baris yang terpengaruh tidak sesuai dengan nilai yang ditentukan. Menetapkan nilai ke 1 berarti pernyataan berhasil jika setidaknya satu catatan diperbarui. Jika tidak ada baris yang sesuai dengan klausa WHERE, pernyataan gagal dan mengembalikan error.
PolarDB for MySQL 5.6
UPDATE TARGET_AFFECT_ROW 1 t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.PolarDB for MySQL 5.7 dan 8.0
UPDATE /*+ TARGET_AFFECT_ROW(1) */ t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.Gunakan dengan Antrian Pernyataan
Gabungkan COMMIT_ON_SUCCESS, ROLLBACK_ON_FAIL, dan TARGET_AFFECT_ROW dengan statement queue untuk mengantrekan operasi tulis yang bertabrakan ke dalam bucket yang sama dan menyelesaikan setiap transaksi dalam satu kali eksekusi.
PolarDB for MySQL 5.6 — menggunakan POLARDB_STATEMENT_CONCURRENT_QUEUE dengan ekspresi kunci atau nilai literal:
UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE id 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
UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE 1 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: 0PolarDB for MySQL 5.7 dan 8.0 — menggunakan CCL_QUEUE_VALUE di dalam blok petunjuk /*+ ... */:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE('id') */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE(1) */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0Batasan
| Batasan | Lingkup | Detail |
|---|---|---|
autocommit mode | Hanya PolarDB for MySQL 8.0 | COMMIT_ON_SUCCESS dan ROLLBACK_ON_FAIL tidak dapat dijalankan saat autocommit diaktifkan. Nonaktifkan autocommit sebelum menggunakan petunjuk ini, atau bungkus pernyataan dalam transaksi eksplisit. |
Menjalankan COMMIT_ON_SUCCESS atau ROLLBACK_ON_FAIL dalam mode autocommit menghasilkan error berikut:
UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;
-- ERROR 7531 (HY000): Inventory transactinal hints didn't allowed in autocommit mode