ORACLE TABLE LOCK ve PAKET LOCK
Merhaba,
Bir tablonun LOCK durumunda olması DEVELOPMENT esnasında sıkıntılı durum oluşturabilir. Çözüm için LOCK’ı oluşturan SESSION’ı kill etmeniz gerekmektedir. Bağlantı DISCONNECT yapılsa bile SESSION arka planda devam edebilir.
Eğer pl/sql paketinizi derleyemiyorsanız, büyük olasılıkla paketin kullandığı veritawbanı objelerinden biri kilitli duruma gelmiştir.
LOCK durumunda olan objeleri bulmak için;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SELECT session_id "sid", SERIAL# "Serial", SUBSTR (object_name, 1, 20) "Object", SUBSTR (os_user_name, 1, 10) "Terminal", SUBSTR (oracle_username, 1, 10) "Locker", NVL (lockwait, 'active') "Wait", DECODE (locked_mode, 2, 'row share', 3, 'row exclusive', 4, 'share', 5, 'share row exclusive', 6, 'exclusive', 'unknown') "Lockmode", OBJECT_TYPE "Type", action FROM SYS.V_$LOCKED_OBJECT A, SYS.ALL_OBJECTS B, SYS.V_$SESSION c WHERE A.OBJECT_ID = B.OBJECT_ID AND C.SID = A.SESSION_ID |
Bu sorgu sonucunda dönen SID ve Serial alanları ilgili SESSION’ı KILL etmek için kullanılır;
1 2 3 |
ALTER SYSTEM KILL SESSION 'SID,SERIAL' IMMEDIATE; |
Tablo LOCK’larını kaldırmanıza rağmen paketinizi hala derleyemiyorsanız, paket LOCK’lara bakmanız gerekmektedir. Bunun için de paketinizin adını büyük/küçük harfe dikkat ederek aşağıdaki sorguya yazarak çalıştırınız. Yine dönen SID ve SERIAL ile ilgili SESSION’ı KILL edebilirsiniz.
1 2 3 4 5 |
SELECT x.* FROM v$session x, v$sqltext y WHERE x.sql_address = y.address AND y.sql_text LIKE '%paket_adi%'; |