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