oracle中加鎖與解鎖

    oracle中的數據在併發操作時,爲了防止錯誤的發生可以進行記錄或者數據庫表的加鎖操作。當鎖操作完成時可以進行解鎖操作。

    數據庫中加鎖有兩種方式,獨佔模式共享模式

    1.獨佔模式,不允許其他會話以任何方式共享鎖定資源,當進行數據庫數據修改時可以使用這種模式。

    2.共享模式,允許在數據訪問時,併發共同訪問,但是當修改數據時上升爲獨佔模式。

    鎖分爲行級鎖和表級鎖,行級鎖是鎖定某些行記錄,表級鎖是鎖定整張表。

    1.行級鎖。

    insert update delete (隱式加行鎖)

    select...for update(顯示加行鎖,共享模式)

select * from emp where deptno=30 for update 
update emp set ename='Joke' where empno=7499;
在釋放鎖之前其他用戶只能對進行數據查詢,不能對數據進行insert、delete和update。

假如有其他用戶要鎖定同一資源:可以使用wait 子句對鎖的等待時間控制 如: 在另一用戶中:select * from emp where deptno=30 for update wait 2 (等待2秒 如2秒鐘還未釋放資源,系統將會給出提示信息。

    2.表級鎖。

    共享模式(in share mode) 
共享更新模式(in share update mode) 排他鎖模式 鎖定表的通用語法: 
lock table 表名 in <share or share update or exclusive mode>;

 1) 共享模式 
不允許其他用戶插入,更新和刪除行,多個用戶可以同時在同一表上設置共享鎖,這樣設置鎖的多個用戶都只能執行查詢 lock table emp in share mode; 
2)共享更新模式(in share update mode)
允許多個用戶同時鎖定表的不同行, 允許其他用戶進行DML(insert update delete select)操作 , 除了已鎖定的行 
如: lock table emp in share update mode; 
select * from emp where deptno=30 for update //鎖定的行 其他用戶不能delete ,update 部門30的僱員信息 
其他用戶可以查看鎖定的行: select * from emp where deptno=30

3)排他鎖模式(限制性強) 
不允許其他用戶插入,更新和刪除行, 允許查看數據,但只有一個用戶可以在表中放置排他鎖 
lock table emp in exclusive mode; 

    解鎖

(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time; 
(4)殺掉對應進程
執行命令:alter system kill session'1025,41';
其中1025爲sid,41爲serial#.


發佈了28 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章