標籤:
鎖的概念
鎖出現在資料共用的場合,用來保證資料的一致性。當多個會話同時修改一個表時,需要對資料進行相應的鎖定。
鎖有“唯讀鎖”、“排它鎖”,“共用排它鎖”等多種類型,而且每種類型又有“行級鎖”(一次鎖住一條記錄),“頁級鎖”(一次鎖住一頁,即資料庫中儲存記錄的最小可配置單位),“表級鎖”(鎖住整個表)。
若為“行級排它鎖”,則除被鎖住的行外,該表中其他行均可被其他的使用者進行修改(Update)或刪除(delete)。若為“表級排它鎖”,則所有其他使用者只能對該表進行查詢(select)操作,而無法對其中的任何記錄進行修改或刪除。當程式對所做的修改進行提交(commit)或復原(rollback)後,鎖住的資源便會得到釋放,從而允許其他使用者進行操作。
如果兩個事務,分別鎖定一部分資料,而都在等待對方釋放鎖才能完成事務操作,這種情況下就會發生死結。
隱式鎖和顯式鎖
在Oracle資料庫中,修改資料操作時需要一個隱式的獨佔鎖,以鎖定修改的行,直到修改被提交或撤銷為止。如果一個會話鎖定了資料,那麼第二個會話要想對資料進行修改,只能等到第一個會話對修改使用COMMIT命令進行提交或使用ROLLBACK命令進行復原撤銷後,才開始執行。因此應養成一個良好的習慣:執行修改操作後,要儘早地提交或撤銷,以免影響其他會話對資料的修改。
對emp表的SCOTT僱員記錄進行修改,測試隱式鎖。步驟1:啟動第一個SQL*Plus,以SCOTT賬戶登入資料庫(第一個會話),修改SCOTT記錄,隱式加鎖。UPDATE emp SET sal=3500 where empno=7788;步驟2:啟動第二個SQL*Plus,以SCOTT賬戶登入資料庫(第二個會話),進行記錄修改操作。UPDATE emp SET sal=4000 where empno=7788;步驟3:對第一個會話進行解鎖操作:COMMIT;步驟4:查看第二個會話,此時有輸出結果:步驟5:提交第二個會話,防止長時間鎖定。
表的顯式鎖定
鎖定行
對emp表的部門10的僱員記錄加顯式鎖,並測試。
對部門10加顯式鎖:SELECT empno,ename,job,sal FROM emp WHERE deptno=10 FOR UPDATE;
步驟1:對部門10加顯式鎖:SELECT empno,ename,job,sal FROM emp WHERE deptno=10 FOR UPDATE;步驟2:啟動第二個SQL*Plus(第二個會話),以SCOTT賬戶登入資料庫,對部門10的僱員CLARK進行修改操作。UPDATE emp SET sal=sal+100 where empno=7782;步驟3:在第一個會話進行解鎖操作:COMMIT;步驟4:查看第二個會話,有輸出結果:
鎖定表
LOCK語句用於對整張表進行鎖定。
對錶的鎖定可以是共用(SHARE)或獨佔(EXCLUSIVE)模式。共用模式下,其他會話可以加共用鎖定,但不能加獨佔鎖。在獨佔模式下,其他會話不能加共用或獨佔鎖。
【訓練1】 對emp表添加獨佔鎖。
步驟1:對emp表加獨佔鎖:
LOCK TABLE emp IN EXCLUSIVE MODE;
步驟2:對錶進行解鎖操作:
COMMIT;
oracle中表的鎖定