鎖有“只讀鎖”、“排它鎖”,“共享排它鎖”等多種類型,而且每種類型又有“行級鎖”(一次鎖住一條記錄),“頁級鎖”(一次鎖住一頁,即數據庫中存儲記錄的最小可分配單元),“表級鎖”(鎖住整個表)。
若為“行級排它鎖”,則除被鎖住的行外,該表中其他行均可被其他的用戶進行修改(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;