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 StatementMode of Table LockLock Modes Permitted?
RSRXSSRXX

SELECT...FROM table...

none

Y

Y

Y

Y

Y

INSERT INTO table...

RX

Y

Y

N

N

N

UPDATE table ...

RX

Y*

Y*

N

N

N

DELETE FROM table...

RX

Y*

Y*

N

N

N

SELECT ... FROM tableFOR UPDATE OF ...

RS

Y*

Y*

Y*

Y*

N

LOCK TABLE tableIN ROW SHARE MODE

RS

Y

Y

Y

Y

N

LOCK TABLE tableIN ROW EXCLUSIVE MODE

RX

Y

Y

N

N

N

LOCK TABLE tableIN SHARE MODE

S

Y

N

Y

N

N

LOCK TABLE tableIN SHARE ROW EXCLUSIVE MODE

SRX

Y

N

N

N

N

LOCK TABLE tableIN EXCLUSIVE MODE

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

原文地址:https://www.cnblogs.com/gdpuzxs/p/6924020.html