一、问题现象:
ORACLE OEM巡检发现某时段存在较大的WAITTING事件(如图1的红色部分):
(图1:Database Activity)
其实发现这个问题还可以从v$locked_object、AWR中发现,但要数最直观的还是OEM的ACTIVESESSIONS视图。
二、问题分析:
1、为了定位事件,采集该时段的ADDM快照(如图2:开始PM4,结束PM7):
(图2:Database Activity)
2、直奔主题SQL statements were found waiting for row lock waits(如图3)
(图3:SQL statements were found waiting for row lock waits)
通过“Wait class "Application" was consuming significant database time”我们分析由于应用程序的问题导致enq: TX - row lock contention。再看SQL语句,基本判断是由于未COMMIT导致。
TX锁通常被称为事务锁,当一个事务开始时,如执行INSERT/DELETE/UPDATE/MERGE等操作或者使用SELECT ... FOR UPDATE语句进行查询时,会首先获取事务锁,直到该事务结束。Oracle的TX锁定是在行级获得的,每个数据行上都存在一个锁定位(1b-Lock Byte),用于判断该记录是否被锁定,同时在每个数据块的头部(Header)存在一个ITL的数据结构,用于记录事务信息等,当需要修改数据时,首先需要获得回滚段空间用于存储前镜像信息,然后这个事务信息同样被记录在ITL上,通过ITL可以将回滚信息和数据块关联起来,所以说Oracle的行级锁定是在数据块上获得的,行级锁只有排他锁没有共享模式。