Memecahkan masalah kesalahan isolasi serial - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai 1 November 2025. Jika Anda ingin menggunakan Python UDFs, buat UDFs sebelum tanggal tersebut. Python yang ada UDFs akan terus berfungsi seperti biasa. Untuk informasi lebih lanjut, lihat posting blog.

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

Memecahkan masalah kesalahan isolasi serial

ERROR:1023 DETAIL: Pelanggaran isolasi serial di atas meja di Redshift

Saat Amazon Redshift mendeteksi kesalahan isolasi yang dapat diserialisasi, Anda akan melihat pesan kesalahan seperti berikut ini.

ERROR:1023 DETAIL: Serializable isolation violation on table in Redshift

Untuk mengatasi kesalahan isolasi serializable, Anda dapat mencoba metode berikut:

  • Coba lagi transaksi yang dibatalkan.

    Amazon Redshift mendeteksi bahwa beban kerja bersamaan tidak dapat diserialkan. Ini menunjukkan celah dalam logika aplikasi, yang biasanya dapat diatasi dengan mencoba kembali transaksi yang mengalami kesalahan. Jika masalah berlanjut, coba salah satu metode lain.

  • Pindahkan operasi apa pun yang tidak harus berada dalam transaksi atom yang sama di luar transaksi.

    Metode ini berlaku ketika operasi individu dalam dua transaksi saling mereferensikan satu sama lain dengan cara yang dapat mempengaruhi hasil transaksi lainnya. Misalnya, dua sesi berikut masing-masing memulai transaksi.

    Session1_Redshift=# begin;
    Session2_Redshift=# begin;

    Hasil dari pernyataan SELECT dalam setiap transaksi mungkin dipengaruhi oleh pernyataan INSERT di yang lain. Dengan kata lain, anggaplah Anda menjalankan pernyataan berikut secara serial, dalam urutan apa pun. Dalam setiap kasus, hasilnya adalah salah satu pernyataan SELECT mengembalikan satu baris lebih banyak daripada jika transaksi dijalankan secara bersamaan. Tidak ada urutan di mana operasi dapat berjalan secara serial yang menghasilkan hasil yang sama seperti ketika dijalankan secara bersamaan. Dengan demikian, operasi terakhir yang dijalankan menghasilkan kesalahan isolasi serial.

    Session1_Redshift=# select * from tab1; Session1_Redshift=# insert into tab2 values (1);
    Session2_Redshift=# insert into tab1 values (1); Session2_Redshift=# select * from tab2;

    Dalam banyak kasus, hasil dari pernyataan SELECT tidak penting. Dengan kata lain, atomisitas operasi dalam transaksi tidak penting. Dalam kasus ini, pindahkan pernyataan SELECT di luar transaksi mereka, seperti yang ditunjukkan pada contoh berikut.

    Session1_Redshift=# begin; Session1_Redshift=# insert into tab1 values (1) Session1_Redshift=# end; Session1_Redshift=# select * from tab2;
    Session2_Redshift # select * from tab1; Session2_Redshift=# begin; Session2_Redshift=# insert into tab2 values (1) Session2_Redshift=# end;

    Dalam contoh ini, tidak ada referensi silang dalam transaksi. Kedua pernyataan INSERT tidak saling mempengaruhi. Dalam contoh ini, setidaknya ada satu urutan di mana transaksi dapat berjalan secara serial dan menghasilkan hasil yang sama seolah-olah dijalankan secara bersamaan. Ini berarti bahwa transaksi dapat diserialkan.

  • Paksa serialisasi dengan mengunci semua tabel di setiap sesi.

    GEMBOKPerintah memblokir operasi yang dapat mengakibatkan kesalahan isolasi serializable. Saat Anda menggunakan perintah LOCK, pastikan untuk melakukan hal berikut:

    • Kunci semua tabel yang terpengaruh oleh transaksi, termasuk yang terpengaruh oleh pernyataan SELECT hanya-baca di dalam transaksi.

    • Kunci tabel dalam urutan yang sama, terlepas dari urutan operasi yang dilakukan.

    • Kunci semua tabel di awal transaksi, sebelum melakukan operasi apa pun.

  • Gunakan isolasi snapshot untuk transaksi bersamaan

    Gunakan perintah ALTER DATABASE dengan isolasi snapshot. Untuk informasi selengkapnya tentang parameter SNAPSHOT untuk ALTER DATABASE, lihat. Parameter

ERROR:1018 DETAIL: Relasi tidak ada

Saat menjalankan operasi Amazon Redshift bersamaan di sesi yang berbeda, Anda akan melihat pesan galat seperti berikut ini.

ERROR: 1018 DETAIL: Relation does not exist.

Transaksi di Amazon Redshift mengikuti isolasi snapshot. Setelah transaksi dimulai, Amazon Redshift mengambil snapshot dari database. Untuk seluruh siklus hidup transaksi, transaksi beroperasi pada status database sebagaimana tercermin dalam snapshot. Jika transaksi membaca dari tabel yang tidak ada dalam snapshot, itu akan menampilkan pesan kesalahan 1018 yang ditunjukkan sebelumnya. Bahkan ketika transaksi bersamaan lainnya membuat tabel setelah transaksi mengambil snapshot, transaksi tidak dapat membaca dari tabel yang baru dibuat.

Untuk mengatasi kesalahan isolasi serialisasi ini, Anda dapat mencoba memindahkan awal transaksi ke titik di mana Anda tahu tabel itu ada.

Jika tabel dibuat oleh transaksi lain, poin ini setidaknya setelah transaksi dilakukan. Juga, pastikan bahwa tidak ada transaksi bersamaan yang dilakukan yang mungkin telah menjatuhkan tabel.

session1 = # BEGIN; session1 = # DROP TABLE A; session1 = # COMMIT;
session2 = # BEGIN;
session3 = # BEGIN; session3 = # CREATE TABLE A (id INT); session3 = # COMMIT;
session2 = # SELECT * FROM A;

Operasi terakhir yang dijalankan sebagai operasi baca oleh session2 menghasilkan kesalahan isolasi serial. Kesalahan ini terjadi ketika session2 mengambil snapshot dan tabel telah dihapus oleh sesi komit1. Dengan kata lain, meskipun session3 bersamaan telah membuat tabel, session2 tidak melihat tabel karena tidak ada dalam snapshot.

Untuk mengatasi kesalahan ini, Anda dapat menyusun ulang sesi sebagai berikut.

session1 = # BEGIN; session1 = # DROP TABLE A; session1 = # COMMIT;
session3 = # BEGIN; session3 = # CREATE TABLE A (id INT); session3 = # COMMIT;
session2 = # BEGIN; session2 = # SELECT * FROM A;

Sekarang ketika session2 mengambil snapshot-nya, session3 telah dilakukan, dan tabelnya ada di database. Session2 dapat membaca dari tabel tanpa kesalahan.