الجمعة، 31 يناير 2014

Lock in Oracle Database

بسم الله الرحمن الرحيم

ان شاء اله هنتكلم على ال Lock

عندنا نوعين من ال Lock بيحصلوا
فى حالة ان User1 بيعمل الجمله الآتيه
UPDATE Employees
SET Salary =5000;
دا اسمه Table Level lock
و دا بيسبب ان User2 او اى حد هيشتغل على اى Row فى ال Table هيفضل منتظر لحد ما User1 يقفل ال Transaction المفتوحه ب Commit او Rollback

و النوع التانى
فى حالة ان User1 بيعمل الجمله الآتيه
UPDATE Employees
SET Salary =5000
WHERE employee_id=150;
دا اسمه Row Level lock
و دا بيسبب ان User2 او اى حد هيشتغل على اى نفس ال  Row فى ال Table هيفضل منتظر لحد ما User1 يقفل ال Transaction المفتوحه ب Commit او Rollback

و هنعرف دلوقتى ازاى نجيب ال Session اللى عامله Lock و اسم المستخدم و اسم مستخدم الجهازو هو داخل و عمل ال Lock ببرنامج ايه SQL*Plus ولا SQL Developer مثلا و جمله ال SQL اللى عامله Lock
دا سكريبت فيه اغلب اللى هنحتاجه 
السكريبت مبنى على اكتر من Dynamic View و هم
v$lock, v$session, v$sql
و تقدروا تشوفوا معلومات اكتر عنهم من:

SELECT L.SID, S.SERIAL#, S.STATE, S.EVENT, S.WAIT_TIME, S.USERNAME, S.OSUSER, 
S.MACHINE, S.PROGRAM, C.SQL_FULLTEXT
FROM V$lock L 
JOIN V$session S
ON (L.SID = S.SID)
JOIN V$sql C
ON (C.SQL_ID = S.SQL_ID)
WHERE L.block > 0;

و بعد ما نعرف كل المعلومات عن ال Lock لو ال User ما عملش Commit او Rollback
لازم ادخل اعمل Kill لل Session اللى مسببه ال Lock
عشان اعمل Kill بحتاج من السكريبت السابق حاجتين
L.SID & S.SERIAL#

و بستخدمهم فى الأمر اللى تحت
Alter System Kill session 'L.SID,S.SERIAL#' immediate;

ليست هناك تعليقات:

إرسال تعليق