How to Analyse Row Lock Contention in Oracle 10gR2 and later

我们有一道面试题,原以为很简单,但是却发现面试者能够完美解出的几乎没有,一部分人有思路,但是可能是因为面试紧张,很难在指定时间内完成解题,而更大一部分人连思路也不清晰。 题目是:请将emp.empno=7369的记录ename字段修改为“ENMOTECH”并提交,你可能会遇到各种故障,请尝试解决。 其实题目的设计非常简单,一个RAC双节点的实例环境,面试人员使用的是实例2,而我们在实例1中使用select for update将EMP表加锁。 SQL> select * from emp for update; 此时在实例2中,如果执行以下SQL语句尝试更新ename字段,必然会被行锁堵塞。 SQL> update emp set ename=’ENMOTECH’ where empno=7369; 这道面试题中包含的知识点有: 1. 如何在另外一个session中查找被堵塞的session信息; 2. 如何找到产生行锁的blocker; 3. 在杀掉blocker进程之前会不会向面试监考人员询问,我已经找到了产生堵塞的会话,是不是可以kill掉; 4. 在获得可以kill掉进程的确认回复后,正确杀掉另一个实例上的进程。 这道题我们期待可以在5分钟之内获得解决,实际上大部分应试者在15分钟以后都完全没有头绪。 正确的思路和解法应该如下: 检查被阻塞会话的等待事件 更新语句回车以后没有回显,明显是被锁住了,那么现在这个会话经历的是什么等待事件呢? SQL> select sid,event,username,sql.sql_text 2 from v$session s,v$sql sql 3 where s.sql_id=sql.sql_id 4 and sql.sql_text like ‘update emp set ename%’; SID EVENT USERNAME…