enq: TX - row lock contention等待事件

enq: TX - row lock contention该等待事件

1:查询当前系统的等待事件

select event,sid,p1,p2,p3 from v$session_wait where event not like 'SQL*%' and event not like 'rdbms%';

EVENT                                   SID         P1              P2             P3
----------------------------------     ----      ----------       ----------    ----------
enq: TX - row lock contention           4     1415053318             196638            55836
RMAN backup & recovery I/O              5              1                256       2147483647
enq: TX - row lock contention           12    1415053318             524293            51153
RMAN backup & recovery I/O              25             1                256       2147483647
db file sequential read                 27            16            2876703                1
pmon timer                              33           300                  0                0
db file scattered read                  39            33             790536              128
VKTM Logical Idle Wait                  49             0                  0                0
Streams AQ: qmn slave idle wait         50             1                  0                0
asynch descriptor resize                53             1         4294967295             1237
jobq slave wait                         54             0                  0                0


EVENT                                   SID         P1           P2                 P3
-------------------------------------------    -------       ----------          ----------
db file sequential read               170         33         1100519             1
direct path read                      181         44          469892           124
enq: TX - row lock contention         212 1415053318          524293         51153
smon timer                            225        300               0             0
enq: TX - row lock contention         232 1415053318          524293         51153
direct path read                      234         16         1099776           128
Streams AQ: qmn coordinator idle wait 242          0               0             0

上面的等待事件说明session4,12,212,232想加锁,但是有别的session占着,所以等待。

enq是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO)
发生TX锁的原因一般有几个

1.不同的session更新或删除同一个记录。
2.唯一索引有重复索引
3.位图索引多次更新
4.同时对同一个数据块更新
5.等待索引块分裂

2:下面我们通过enq: TX - row lock contention来看看这些session都在等什么

select ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where event='enq: TX - row lock contention';

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
------------- -------------- --------------- -------------
        87556             57             395            88
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0

3:通过上面sql查找出来的对象编号找到对应的对象名称

SQL> select object_name from dba_objects where object_id in (87564);

OBJECT_NAME

QRTZ_LOCKS

4:通过对象名称找出该对象的对应属性,对象属性为TABLE

SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_name=‘QRTZ_LOCKS’;

OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE

SCHEDULE QRTZ_LOCKS 87564 87564 TABLE

5:通过正在等待的SID查看它们都在执行什么操作

SQL> select sid,sql_text from v s e s s i o n a , v session a,v sessiona,vsql b where sid in(4,12,41,212,232) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);

SID SQL_TEXT


4 UPDATE QRTZ_CRON_TRIGGERS SET CRON_EXPRESSION = :1 WHERE TRIGGER_NAME = :2 AND TRIGGER_GROUP = :3
12 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
41 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
212 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE
232 SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE

从上面的结果可以看出,SCHEDULE用户下的五个session同时在执行一条相同的sql语句,对应的对象则是QRTZ_LOCKS 这个表, 所以发生了锁,从而产生等待,通过和同事的交流,得知这个一个ETL程序要访问的表,里面只有五条数据,但是却要时时调度。

6:下面我们去找一下对应sid产生的锁

SQL> select SID,TY,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from V$lock where block=1 or request<>0;
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK


     41  TX     524293      51153          0          6       3846             0
     12  TX     524293      51153          0          6       4190             0
     232 TX     524293      51153          0          6       4626             0
     212 TX     524293      51153          0          6       4749             0
      4  TX     196638      55836          0          6       4755              1
     44  TX     196638      55836          6          0       4765              1

由此可以查看,BLOCK=1的sid是该等待事件的根源,其他session则等待该锁被释放。

解决方法:

1:通过v$session找到BLOCK=1的用户,告知用户提交事务
2:通过sid找到pid,kill掉该进程
3:更改sql语句,SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE no wait
加nowait的意思是得到或者得不到,不会等待

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值