程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 鎖(學習筆記),學習筆記

鎖(學習筆記),學習筆記

編輯:Oracle教程

鎖(學習筆記),學習筆記


行級鎖定和表級鎖定:

行級鎖定:

當用戶執行了,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#';

解除死鎖

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved