
模拟锁冲突按案例
1 .打开一个会话,更新emp表事务,不提交。
session1
sqlplus as sysdba
SQL> update scott.emp set sal=0 ;
2 .再打开另一个会话,删除表emp,发生锁冲突。
session 2
sqlplus scott/oracle
SQL> delete from scott.emp ;
3. 查出等待类别,看等待次数和等待时间,等待次数少、时间久 一般有问题
SQL> select * from v$system_wait_class order by time_waited desc;
4 .再查一次
SQL> select * from v$system_wait_class order by time_waited desc;
5 .可见Application 执行次数少,但是时间长,变化率比较高
2381 104004(第一次查)
2388 112108(第二次查)
6 .首先定位大类:Application
认为是应用程序的问题
依次考虑 大类--> 等待类 --> 小类
Application 的wait_class#=1
7 .找出等待类是1, 也就是 Application 的事件
SQL> select event from V$SYSTEM_EVENT where wait_class#=1;
EVENT
---------------------------------
enq: RO - fast object reuse
enq: TX - row lock contention
SQL*Net break/reset to client
等待次数少,但是时间长
SQL> select event ,total_waits,time_waited from V$SYSTEM_EVENT where wait_class#=1;
EVENT TOTAL_WAITS TIME_WAITED
----------------------- -------------- --------------
enq: RO - fast object reuse 17 9
enq: TX - row lock contention 2 64027
SQL*Net break/reset to client 1210 18
等待次数最少,但是时间最长的是enq: TX - row lock contention
定位问题是:enq: TX - row lock contention
8 .发生这个事件:enq: TX - row lock contention 等待事件的名字,通过事件名字去找是谁产生了这个等待事件(会话信息)
SQL> select sid ,event,USERNAME,PROGRAM from v$session where event like'%enq%row%';
9 .找出SCOTT执行哪条语句发生等待
SQL> select sid ,username ,sql_id from v$session where sid=49;
10 .通过SQLid找出SQL语句
SQL> select sql_text from v$sql where sql_id='a3dt4jynh04k3';
SQL_TEXT
----------------------------
delete from scott.emp
结论:scott在执行delete from scott.emp 行锁冲突,而发生了等待。
11 .查找谁阻塞了scott
SQL> select SID, SERIAL#, USERNAME from V$SESSION where SID in (select BLOCKING_SESSION from V$SESSION);
kill掉阻塞的session,解决问题
SQL> alter system kill session '39,2628' immediate ;
如果要快速释放资源,找出进程
SQL> select spid from v$process where ADDR =(select PADDR from v$session where sid=39 and SERIAL#=2628);
SPID
-----------
15475
$ kill -9 15475
以上就是查找处理锁冲突的标准流程。











