oracle锁
oracle支持并发,而锁是实现并发的重要技术之一。oracle锁的类型可以通过v$lock_type查看,平时我们接触得最多是以下两种,表锁和行锁,也称为DML锁和事务锁。
select * from v$lock_type where type in('TM','TX')
行锁只有一种,就是排它锁。
表锁有以下5种:
(1)RS行级共享锁(row share):其他对象只能查询这些数据行,sql操作有select for update、lock for update、lock row share;
(2)RX行级排它锁(row exclusive):在提交前不允许做DML操作,sql操作有insert、update、delete、lock row share;
(3)S共享锁(share):sql操作有create index、lock share;
(4)SRX共享行级排它锁:sql操作有lock share row exclusive;
(5)X排它锁:alter table、drop table、drop index、truncate table、look exclusive等DDL
下表是在Oracle文档里里面列出的操作会对表加上什么类型的lock,以及该锁和其他类型的操作的兼容性。
Table 13-3 Summary of Table Locks
SQL Statement | Mode of Table Lock | Lock Modes Permitted? | ||||
---|---|---|---|---|---|---|
RS | RX | S | SRX | X | ||
|
none |
Y |
Y |
Y |
Y |
Y |
|
RX |
Y |
Y |
N |
N |
N |
|
RX |
Y* |
Y* |
N |
N |
N |
|
RX |
Y* |
Y* |
N |
N |
N |
|
RS |
Y* |
Y* |
Y* |
Y* |
N |
|
RS |
Y |
Y |
Y |
Y |
N |
|
RX |
Y |
Y |
N |
N |
N |
|
S |
Y |
N |
Y |
N |
N |
|
SRX |
Y |
N |
N |
N |
N |
|
X |
N |
N |
N |
N |
N |
以下是常用的查询视图:
select * from v$lock select * from v$transaction select * from v$session
接下来我们看一个例子,首先session A对一个表的数据进行更新,然后不提交事务,接着B对这条数据进行删除。
Session A update group_test set name='gdpu' where id =1 Session B delete from group_test where id=1
再打开一个Session C,输入:
select * from v$lock where type in('TM','TX')
由上图可以看出,Session A,B分为产生两个锁,id分为为731,389。对于sid为731的Session,产生了一个TM锁(LMODE=3,为行级排它锁RX)和TX锁,BLOCK=1表示阻塞其他操作修改这条记录。对于id为389的Session,同样产生了一个TM锁(LMODE=3)和TX锁(LMODE=0代表正在等待一个锁)。
查看v$transaction,如下:可以看出ADDR中的值00000001E76AC910与v$lock中的ADDR值一样。
select * from v$transaction
查看v$session,如下:
select * from v$session where sid in(389,731)
有时候我们执行一条Sql的时候,发现一直处于执行状态(阻塞状态),这时候可以先通过v$transaction查看是不是有另外一个操作执行了DML操作,事务未提交,然后根据ADDR的值到v$lock中查出对应的SID,然后根据SID到v$session中查找相应的信息。执行kill操作,如下:
alter system kill session '731,47206' immediate;
参考网址:http://www.cnblogs.com/suredandan/archive/2012/09/20/2696124.html