sql >> Database >  >> RDS >> Oracle

Hoe maak je MERGE serialiseerbaar?

De uitzondering die u ziet, is een direct gevolg van het gebruik van strikte serialisatie. Als je meer dan één transactie tegelijkertijd actief hebt, elk begon met SET TRANSACTIE ISOLATIENIVEAU SERIALISEERBAAR, wanneer een van hen commit, krijgen de anderen een ORA-08177. Dat is hoe strikte serialisatie wordt afgedwongen - de database gooit een ORA-08177 in elke sessie die is gestart met ISOLATION LEVEL SERIALIZABLE als een andere transactie wordt vastgelegd in een tabel die de serialiseerbare sessie nodig heeft. Dus als je echt strikte serialisatie nodig hebt, moet je intelligent omgaan met de ORA-08177's, zoals in het volgende:

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;

Serialisatie is geen magie, en het is niet "gratis" (waar "gratis" betekent "ik als ontwikkelaar hoef niets te doen om het goed te laten werken"). Het vereist meer planning en werk van de ontwikkelaar om het goed te laten functioneren, niet minder. Deel en geniet.



  1. hoe de lengte van een kolom in slaapstand met maximale lengte in te stellen?

  2. Foreign key probleem in mysql (fout 1005)

  3. SQL Server standaard datum tijdstempel?

  4. Hoe sorteert de sql-server uw gegevens?