22 Ocak 2014 Çarşamba

ORA-08177: can't serialize access for this transaction (ORA-08177: bu işlem için erişim serileştirilemiyor) hatası

Bu hatayı, insert işlemi yaptığım bir prosedürü serileştirmeye çalıştığım zaman aldım. Amacım, prosedürün farklı sessionlarda birbirini ezmeden çalıştırılabilmesiydi. Bunun için prosedürün tanım kısmına Serialization tanımını (SET TRANSACTION ISOLATION LEVEL SERIALIZABLE)
ekledim. Bu eklemeden sonra, prosedürü tek sessionda çalıştırsam bile hata vermeye başladı. Kısa bir aramadan sonra, ORACLE'da tabloların varsayılan olarak "Tablo seviyesinde" kilitlendiğini öğrendim. Bunu satır seviyesi olarak ayarlamak için, tabloyu oluştururken ROWDEPENDENCIES keywordunu eklemek gerekiyor. Örnek Table Create ve SP scripti aşağıdaki gibidir:



CREATE TABLE ALIBUDAK.TABLO_TEST
(
     SID      NUMBER,
     NAME VARCHAR2(20)
)
ROWDEPENDENCIES
---------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE SP_TEST
IS

    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
       
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
   
    DELETE FROM ALIBUDAK.TABLO_TEST;
    INSERT INTO ALIBUDAK.TABLO_TEST
    VALUES (1 ,'Ali');
       
    COMMIT;
END;

Hiç yorum yok:

Yorum Gönder