sql >> Database teknologi >  >> RDS >> Oracle

Sådan gør du MERGE serialiserbar

Den undtagelse, du ser, er en direkte konsekvens af at bruge streng serialisering. Hvis du har mere end én transaktion aktiv på samme tid, startede hver med SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, når en af ​​dem forpligter, vil de andre få en ORA-08177. Det er sådan streng serialisering håndhæves - databasen kaster en ORA-08177 i enhver session startet med ISOLATION LEVEL SERIALIZABLE, hvis en anden transaktion forpligter sig til en tabel, som den serialiserbare session har brug for. Så dybest set, hvis du virkelig har brug for streng serialisering, skal du håndtere ORA-08177'erne intelligent, som i følgende:

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;

Serialisering er ikke magi, og det er ikke "gratis" (hvor "gratis" betyder "jeg som udvikler behøver ikke at gøre noget for at få det til at fungere ordentligt"). Det kræver mere planlægning og arbejde fra bygherrens side at få det til at fungere ordentligt, ikke mindre. Del og nyd.



  1. Genskab Bad RAC Node

  2. Sådan ændres samlingen af ​​en SQL Server-database ved hjælp af T-SQL

  3. Er disse to forespørgsler ens - GROUP BY vs. DISTINCT?

  4. Få prisdata for et produkt, der kan reserveres, med datointervaller i WooCommerce