一.基本概念
Oracle数据库的锁类型
(1)
(2)
(3)
DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
二.常见DML锁分类
DML锁分类表
锁模式 | | | |
0 | | | |
1 | | | |
2 | | 其他对象只能查询这些数据行 | |
3 | SX(Row-X) | 在提交前不允许做DML操作 | |
4 | | | |
5 | | | |
6 | | | Lock exclusive |
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
1级锁有:Select,有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share
select for update当对话使用for update子串打开一个光标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其它对象只能查询这些数据行,不能进行update、delete或select for update操作,insert的操作还是可以的。
(但是在11g的实验中使用select for update产生的锁确实3级锁)
3级锁有:Insert, Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Share locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。
ORA-00054: resource busy and acquire with NOWAIT specified
(ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源)
5级锁有:Lock Share Row Exclusive
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
当对父表进行修改时,若子表对应的记录存在,则产生ORA-02292异常;否则只对父表加TX锁和RX锁;
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
三.常见相关锁的视图
1.关于V$lock表和相关视图的说明
--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
CTIME
NUMBER
Time since current mode was granted
BLOCK
NUMBER
The lock is blocking another lock
0, 'Not Blocking',
1, 'Blocking',
2, 'Global',
--该锁是否阻塞了另外一个锁
2.其它相关视图说明
视图名 | 描述 | 主要字段说明 |
v$session | 查询会话的信息和锁的信息。 | sid,serial#:表示会话信息。 program:表示会话的应用程序信息。 row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。 lockwait :该会话等待的锁的地址,与v$lock的kaddr对应. |
v$session_wait | 查询等待的会话信息。 | sid:表示持有锁的会话信息。 Seconds_in_wait:表示等待持续的时间信息 Event:表示会话等待的事件,锁等于enqueue |
| | |
dba_locks | 对v$lock的格式化视图。 | Session_id:和v$lock中的Sid对应。 Lock_type:和v$lock中的type对应。 Lock_ID1: 和v$lock中的ID1对应。 Mode_held,mode_requested:和v$lock中 的lmode,request相对应。 |
v$locked_object | 只包含DML的锁信息,包括回滚段和会话信息。 | Xidusn,xidslot,xidsqn:表示回滚段信息。和 v$transaction相关联。 Object_id:表示被锁对象标识。 Session_id:表示持有锁的会话信息。 Locked_mode:表示会话等待的锁模式的信 息,和v$lock中的lmode一致。 |
四.常见的SQL查询
1.查询数据库中的锁
select * from v$lock;
select * from v$lock where block=1;
2.查询被锁的对象
select * from v$locked_object;
3.查询阻塞
查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');
查阻塞别的会话锁
select * from v$lock where lmode>0 and type in ('TM','TX');
4.查询数据库正在等待锁的进程
select * from v$session where lockwait is not null;
5.查询会话之间锁等待的关系
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;
6.查询锁等待事件
select * from v$session_wait where event='enqueue';
7.查找锁住的表和解锁
select
from
where
--通过SID,
--alter
也可以在操作系统层面kill
在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 #spid(即上面查到的spid)
2)在windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即上面查到的spid。
例:c:>orakill orcl #spid
8.
select s.username, o.object_name, s.machine, s.sid, s.serial#, k.type,k.LMODE,k.BLOCK
几个名词概念:
statement:
session:
transaction:所有的改动都能划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql
用法介绍:
update,
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会师释放。
简单举例:
transaction
select
如上,这个将会对查询出来的行加上一个行锁,如果在
transaction
需要在transaction
使用这个行锁的情况一般是对并发的情况要求比较高的时候,需要锁住某行进行一些更新语句之后进行释放,再让其他transaction
for
of
例如:select
where
这样的话student表中对应的行是不加锁的,对connector一个表中行加锁
不使用两个表都加锁。
[NOWAIT]的使用是当锁冲突的时候提示的情况:
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054:
在页面上调试的时候由于异常处理不好,把数据锁住了没有提交,也没有rollback,遇到这样的情况的时候可以通过以下方式解决:
-----查看被锁对象的序列号、sid
SELECT
FROM
WHERE
AND
ORDER
/
------利用sid
alter
243是sid
所以在使用锁的时候一定要做好页面的异常控制,不然很容易出问题。
*******************************************************
数据库中锁类型的介绍:
有两种基本的锁类型,排它锁(Exclusive
其中DML锁(data
DML锁的目的在于保证并发情况下的数据完整性,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
在此分享的简单的select