All Products
Search
Document Center

PolarDB:Petunjuk\ inventaris

Last Updated:Mar 29, 2026

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:

VersiVersi minor kernel minimum
PolarDB for MySQL 8.08.0.1.1.1
PolarDB for MySQL 5.75.7.1.0.17
PolarDB for MySQL 5.6Semua 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:

PetunjukEfekDipicu saat
COMMIT_ON_SUCCESSMelakukan commit transaksi saat iniPernyataan dieksekusi berhasil
ROLLBACK_ON_FAILMelakukan rollback transaksi saat iniPernyataan gagal
TARGET_AFFECT_ROW(n)Menandai pernyataan sebagai gagal jika jumlah baris yang terpengaruh tidak sama dengan nEksekusi pernyataan

Petunjuk-petunjuk ini bekerja bersama untuk menjalankan operasi DML sekaligus menentukan hasil transaksi dalam satu pernyataan:

  • COMMIT_ON_SUCCESS segera melakukan commit transaksi ketika pernyataan berhasil.

  • ROLLBACK_ON_FAIL segera 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 oleh ROLLBACK_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: 0

PolarDB 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: 0

Batasan

BatasanLingkupDetail
autocommit modeHanya PolarDB for MySQL 8.0COMMIT_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