oracle中的數據在並發操作時,為了防止錯誤的發生可以進行記錄或者數據庫表的加鎖操作。當鎖操作完成時可以進行解鎖操作。
數據庫中加鎖有兩種方式,獨占模式和共享模式。
1.獨占模式,不允許其他會話以任何方式共享鎖定資源,當進行數據庫數據修改時可以使用這種模式。
2.共享模式,允許在數據訪問時,並發共同訪問,但是當修改數據時上升為獨占模式。
鎖分為行級鎖和表級鎖,行級鎖是鎖定某些行記錄,表級鎖是鎖定整張表。
1.行級鎖。
insert update delete (隱式加行鎖)
select...for update(顯示加行鎖,共享模式)
select * from emp where deptno=30 for update
select * from A where id=2 for update skip locked
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 ;
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#.