Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara membuat MERGE bisa serial

Pengecualian yang Anda lihat adalah konsekuensi langsung dari penggunaan serialisasi yang ketat. Jika Anda memiliki lebih dari satu transaksi yang aktif secara bersamaan, masing-masing dimulai dengan SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, ketika salah satu dari mereka melakukan yang lain akan mendapatkan ORA-08177. Begitulah serialisasi yang ketat ditegakkan - database melempar ORA-08177 di sesi apa pun yang dimulai dengan ISOLATION LEVEL SERIALIZABLE jika transaksi lain dilakukan ke dalam tabel yang dibutuhkan sesi serializable. Jadi, pada dasarnya, jika Anda benar-benar membutuhkan serialisasi yang ketat, Anda harus menangani ORA-08177 dengan cerdas, seperti berikut:

DECLARE
  bSerializable_trans_complete  BOOLEAN := FALSE;
  excpSerializable              EXCEPTION;
  PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
  <<SERIALIZABLE_LOOP>>
  WHILE NOT bSerializable_trans_complete
  LOOP
    BEGIN
      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

      MERGE ...; -- or whatever

      COMMIT;

      bSerializable_trans_complete := TRUE;  -- allow SERIALIZABLE_LOOP to exit
    EXCEPTION
      WHEN excpSerializable THEN
        ROLLBACK;
        CONTINUE SERIALIZABLE_LOOP;
    END;
  END LOOP;  -- SERIALIZABLE_LOOP
END;

Serialisasi bukanlah keajaiban, dan itu bukan "gratis" (di mana "gratis" berarti "Saya sebagai pengembang tidak perlu melakukan apa pun untuk membuatnya berfungsi dengan baik"). Dibutuhkan lebih banyak perencanaan dan kerja di pihak pengembang agar berfungsi dengan baik, bukan kurang. Bagikan dan nikmati.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang dimaksud dengan pendahuluan di Oracle?

  2. Pilih maks(tanggal) tidak berfungsi jika baris memiliki nilai yang berbeda, saya hanya ingin mengambil baris dengan tanggal tertinggi

  3. ORA-12519 TNS:tidak ditemukan penangan layanan yang sesuai

  4. perulangan melalui array untuk kondisi where pl/sql

  5. ORA-12728:rentang tidak valid dalam ekspresi reguler