View a markdown version of this page

Bekerja dengan kendala kunci asing di Aurora DSQL - Amazon Aurora DSQL

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Bekerja dengan kendala kunci asing di Aurora DSQL

Dengan batasan kunci asing di Aurora DSQL, Anda dapat mendorong logika integritas referensial aplikasi ke dalam database. Aurora DSQL mendukungNO ACTION,,RESTRICT, CASCADESET NULL, dan tindakan SET DEFAULT referensial. Ini juga mendukung tipe MATCH FULL dan MATCH SIMPLE cocok, dan batasan kunci asing yang dapat ditunda. Untuk rincian sintaks lengkap, lihatKendala kunci asing.

Bagaimana Aurora DSQL mempertahankan integritas referensial

Aurora DSQL mempertahankan integritas referensial dalam dua langkah: verifikasi snapshot saat transaksi berjalan, dan resolusi konflik pada waktu komit. Bersama-sama, langkah-langkah ini menjamin bahwa transaksi yang dilakukan tidak pernah melanggar batasan kunci asing.

Verifikasi snapshot. Setiap transaksi di Aurora DSQL berjalan dengan snapshot yang konsisten dari database yang diambil pada waktu mulai. Saat Anda menyisipkan atau memperbarui baris referensi, Aurora DSQL membaca tabel yang direferensikan pada snapshot waktu mulai transaksi Anda untuk mengonfirmasi bahwa kunci yang direferensikan ada. Saat Anda menghapus atau memperbarui kunci yang direferensikan, Aurora DSQL membaca tabel referensi dalam snapshot transaksi. Ini menegaskan bahwa tidak ada baris referensi yang ada (forRESTRICT) atau bahwa operasi tidak meninggalkan baris yatim piatu (forNO ACTION). Karena verifikasi ini membaca dari snapshot waktu awal transaksi alih-alih mengambil kunci, transaksi lain dapat terus memodifikasi tabel yang direferensikan dan referensi secara paralel.

Commit-time resolusi. Verifikasi snapshot memastikan bahwa batasan dipegang pada waktu mulai transaksi, tetapi tidak antara mulai dan komit. Transaksi bersamaan dapat menghapus baris yang direferensikan atau menyisipkan baris referensi yang bertentangan setelah transaksi Anda dimulai. Untuk menilai konflik ini, Aurora DSQL secara implisit menerapkan KEY SHARE klausa ke baris yang direferensikan untuk mendeteksi apakah ada perubahan bersamaan yang membatalkan snapshot Anda. Jika Aurora DSQL mendeteksi konflik, gagal transaksi dengan kesalahan serialisasi. Untuk informasi selengkapnya tentang bagaimana KEY SHARE klausa mempengaruhi transaksi bersamaan, lihatKontrol konkurensi di Aurora DSQL.

Pemeriksaan integritas referensial menghasilkan pembacaan tambahan

Semua operasi bahasa manipulasi data (DML) pada tabel yang direferensikan atau referensi memerlukan pembacaan tambahan untuk menjamin integritas referensial. Sebelum Anda menambahkan batasan kunci asing ke tabel, tolok ukur beban kerja dan validasi bahwa karakteristik kinerja memenuhi harapan Anda.

Contoh alur perencanaan

Dalam skenario berikut, orders tabel memiliki batasan kunci asing pada product_id kolom yang mereferensikan products tabel. Ini membuat tabel products direferensikan dan orders tabel referensi.

CREATE TABLE products ( product_id integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, product_id integer REFERENCES products, quantity integer ); INSERT INTO products VALUES (1, 'Widget', 9.99);

Konflik: hapus dan sisipkan secara bersamaan

Dalam skenario ini, satu sesi menghapus baris yang direferensikan sementara sesi lain menyisipkan baris referensi.

-- Session A BEGIN; DELETE FROM products WHERE product_id = 1; -- Session B BEGIN; INSERT INTO orders VALUES (100, 1, 5); -- Session A COMMIT; -- succeeds -- Session B COMMIT; -- fails with serialization error ERROR: change conflicts with another transaction (OC000) (SQLSTATE 40001)

Kedua sesi berjalan pada saat yang sama. Aurora DSQL menyelesaikan konflik saat komit. Anda tidak dapat berakhir dengan pesanan yang menunjuk ke produk yang dihapus.

Tidak ada konflik: pembaruan kolom non-kunci

Dalam skenario ini, satu sesi memperbarui kolom non-kunci pada baris yang direferensikan sementara sesi lain menyisipkan baris referensi.

-- Session A BEGIN; UPDATE products SET name = 'Super Widget' WHERE product_id = 1; -- Session B BEGIN; INSERT INTO orders VALUES (101, 1, 3); -- Session A COMMIT; -- succeeds -- Session B COMMIT; -- succeeds

Memper name barui (kolom non-kunci) tidak bertentangan dengan kunci asing aktif. product_id Baris referensi hanya peduli bahwa kolom kunci baris yang direferensikan tetap sama.

Praktik terbaik dengan kunci asing di Aurora DSQL

Menerapkan logika coba lagi

Konflik menyebabkan kesalahan alih-alih menunggu. Rancang beban kerja Anda untuk mencoba lagi transaksi yang gagal. Untuk informasi lebih lanjut tentang konkurensi di Aurora DSQL, lihat. Kontrol konkurensi di Aurora DSQL

Minimalkan churn kolom kunci pada baris yang banyak direferensikan

Jika beberapa baris referensi mereferensikan baris yang sama dan kolom kuncinya sering berubah, pertimbangkan untuk merestrukturisasi skema. Pindahkan nilai yang sering berubah ke kolom non-kunci sehingga kolom yang direferensikan tetap stabil. Mengubah kolom non-kunci pada tabel yang direferensikan tidak bertentangan dengan sisipan referensi.