行級鎖定和表級鎖定:
行級鎖定:
當用戶執行了,INSERT,UPDATE,DELETE及SELECT FOR UPDATE語句時,
ORACLE將隱式的實現記錄的鎖定,如果事務沒有提交,回滾,就一直在鎖定狀態,一直到事務提交後,才會將數據鎖釋放
表級鎖定:
表級鎖定需要用戶明確的使用LOCK TABLE語句手工鎖定
語法
LOCK TABLE 表名稱|視圖名稱,表名稱|視圖名.... IN 鎖定模式 MODE[NOWAIT]
NOWAIT這是一個可選項,當視圖鎖定一張表時,如果發現已經被其他事務鎖定時,不會等待
鎖:共享鎖和排它鎖.
鎖分以下幾種:
ROW SHARE 行共享鎖
在鎖定期間允許其他事務並發對表進行各種操作,但不允許任何事務對同一張表進行獨占操作(禁止排它鎖)
ROW EXCLUSIVE 行排它鎖
允許用戶進行任何操作,與行共享鎖不同的是它不能防止其它事務對同一張表進行手工鎖或者獨占操作
SHARE 共享鎖
其它事務只能執行是查詢操作,不能修改操作
SHARE ROW EXCLUSIVE 共享排它鎖
能許任何用戶進行查詢操作,但不允許其它用戶使用共享鎖
共享排它鎖的常見應用
EXCLUSIVE:排它鎖
事務將以獨占方式鎖定表,其它用戶允許查度,但不能修改也不能設置任何的鎖
死鎖:
將事務自動提交關閉
SET AUTOCOMMIT=OFF 取消自動處理,開啟事務處理
悲觀鎖:查詢到數據後使用FOR UPDATE 將數據鎖定
第一個會話執行
SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;
第2個會話也執行
SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;
發現第2個會話,一直在等待,不執行
第一個會話執行COMMIT或者ROLLBACK後,會話2才可以執行
樂觀鎖:把所有鎖定都延遲到即將執行更新之前
使用UPDATE 表名 set 字段 WHERE 字段1=查詢出的狀態,AND字段2=查詢出的狀態
在第一個SESSION上針對emp表使用共享鎖
LOCK TABLE emp IN SHARE MODE NOWAIT
第二個SESSION中刪除emp全部數據
DELETE FROM emp;
因是共享鎖,第二個SESSION應該只能查度不能修改,所以一直在等待
解鎖:
管理員登錄
查看數據庫中的鎖定
SELECT session_id,oracle_username,process FROM v$locked_object;
可以發現死鎖的SESSION_ID;
查詢V$session數據字典
SELECT sid,serial#,username,lockwait,status FROM v$session where sid IN(SESSION_ID);
可以查詢到Serial#
通過
ALTER SYSTEM KILL SESSION'sid,serial#';
解除死鎖