Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kontrol konkurensi di Aurora DSQL
Konkurensi memungkinkan beberapa sesi untuk mengakses dan memodifikasi data secara bersamaan tanpa mengorbankan integritas dan konsistensi data. Aurora DSQL menyediakan kompatibilitas PostgreSQL sambil menerapkan mekanisme kontrol konkurensi yang modern dan bebas kunci. Ini mempertahankan kepatuhan ACID penuh melalui isolasi snapshot, memastikan konsistensi dan keandalan data.
Keuntungan utama Aurora DSQL adalah arsitekturnya yang bebas kunci, yang menghilangkan hambatan kinerja database yang umum. Aurora DSQL mencegah transaksi lambat memblokir operasi lain dan menghilangkan risiko kebuntuan. Pendekatan ini membuat Aurora DSQL sangat berharga untuk aplikasi throughput tinggi di mana kinerja dan skalabilitas sangat penting.
Respons kontrol konkurensi
Aurora DSQL menggunakan kontrol konkurensi optimis (OCC), yang bekerja berbeda dari sistem berbasis kunci tradisional. Alih-alih menggunakan kunci, OCC mengevaluasi konflik pada waktu komit. Proses evaluasi konflik waktu komit ini juga disebut ajudikasi. Ketika Aurora DSQL mendeteksi konflik, ia mengembalikan kegagalan serialisasi PostgreSQL dengan kode SQLSTATE. 40001 Pesan respons menyertakan kode OCC yang mengidentifikasi jenis konflik:
- OC000 - Konflik data
-
Dua transaksi mencoba memodifikasi baris yang sama. Transaksi dengan waktu komit paling awal berhasil, dan transaksi yang bertentangan menerima respons OC000:
ERROR: change conflicts with another transaction (OC000) (SQLSTATE 40001) - OC001 - Konflik skema
-
Katalog skema cache sesi sudah kedaluwarsa. Ketika Aurora DSQL mendeteksi bahwa versi katalog telah berubah sejak sesi memuat cache-nya, dan transaksi tidak dapat dengan aman melakukan rebase ke versi saat ini, transaksi menerima respons OC001:
ERROR: schema has been updated by another transaction (OC001) (SQLSTATE 40001)Operasi apa pun yang memodifikasi katalog skema dapat menyebabkan respons OC001, termasuk pernyataan DDL seperti
CREATE TABLEdanALTER TABLE, sertaGRANTpernyataan dan.REVOKEUntuk informasi selengkapnya, lihat DDL dan transaksi terdistribusi di Aurora DSQL.
Rancang aplikasi Anda untuk menerapkan logika coba ulang untuk menangani respons ini. Pola desain yang ideal adalah idempoten, memungkinkan percobaan ulang transaksi sebagai jalan pertama bila memungkinkan. Logika yang disarankan mirip dengan logika aborsi dan coba lagi dalam situasi batas waktu atau kebuntuan kunci PostgreSQL standar. Namun, OCC mengharuskan aplikasi Anda untuk menjalankan logika ini lebih sering.
Jenis konflik data
Karena mekanisme kontrol konkurensi Aurora DSQL, SELECT ... FOR KEY SHARE klausa SELECT ... FOR
UPDATE dan menghasilkan hasil melalui deteksi konflik yang optimis pada waktu komit daripada mengunci. Di Aurora DSQL, ketika satu transaksi menulis baris dan yang lain membacanya dengan salah satu klausa sebelumnya, konflik mungkin muncul pada waktu komit tergantung pada kolom mana yang digunakan transaksi. Klausa berikut menentukan bagaimana Aurora DSQL mendeteksi konflik ini.
Definisi kolom kunci
Kolom kunci adalah kolom yang merupakan anggota indeks unik, non-parsial, non-ekspresi. Semua kolom lainnya adalah kolom non-kunci.
SELECT ... FOR UPDATE-
Menyatakan bahwa Aurora DSQL menilai baris yang dipilih seolah-olah transaksi menulis ke baris tersebut. Jika transaksi lain berjalan
UPDATE,DELETE,SELECT ... FOR UPDATE, atauSELECT ... FOR KEY SHAREpada baris yang sama dan melakukan commit terlebih dahulu, transaksi yang dijalankanSELECT ... FOR UPDATEgagal denganOC000respons. Klausa ini bertentangan dengan penulisan bersamaan ke baris, dan dengan pembacaanFOR UPDATEatauFOR KEY SHAREbersamaan. SELECT ... FOR KEY SHARE-
Menyatakan bahwa transaksi tergantung pada kolom kunci dari baris yang dipilih. Jika transaksi lain menghapus baris, mengubah kolom kuncinya, atau menjalankan
SELECT ... FOR UPDATEdan melakukan commit terlebih dahulu, transaksi yang dijalankanSELECT ... FOR KEY SHAREgagal dengan responsOC000. Kolom yang bersamaanUPDATEdengan kolom non-kunci tidak bertentangan.
Aurora DSQL tidak mendukung FOR SHARE klausa NO KEY UPDATE or. Namun, DML secara implisit menggunakan mekanisme tersebutNO KEY UPDATE. Matriks berikut merangkum ketika dua transaksi bersamaan yang mengakses baris yang sama bertentangan. An X menunjukkan bahwa dua operasi bertentangan: transaksi mana pun yang terakhir dilakukan gagal dengan OC000 respons. Sel kosong menunjukkan bahwa kedua transaksi dapat dilakukan.
| Operasi | INSERT,DELETE, UPDATE (kolom kunci), atau SELECT ... FOR UPDATE |
UPDATE(hanya kolom non-kunci) |
SELECT ... FOR KEY SHARE |
|---|---|---|---|
INSERT,DELETE, UPDATE (kolom kunci), atau SELECT ... FOR UPDATE |
X | X | X |
UPDATE(hanya kolom non-kunci) |
X | X | |
SELECT ... FOR KEY SHARE |
X |
Pedoman untuk mengoptimalkan kinerja transaksi
Untuk mengoptimalkan kinerja, minimalkan pertikaian tinggi pada tombol tunggal atau rentang kunci kecil. Untuk mencapai tujuan ini, rancang skema Anda untuk menyebarkan pembaruan di rentang kunci cluster Anda dengan menggunakan pedoman berikut:
-
Pilih kunci utama acak untuk tabel Anda.
-
Hindari pola yang meningkatkan pertengkaran pada tombol tunggal. Pendekatan ini memastikan kinerja optimal bahkan ketika volume transaksi tumbuh.