Tag Archives: ora-60

设置全局死锁优先级

测试控制全局死锁的隐含参数_lm_dd_interval时,突然想到这个问题。 RAC全局死锁检测时间:https://yangtingkun.net/?p=955 Oracle的死锁判断是没有优先级的,也就是说,当两个或多个会话发生死锁的时候,无法指定牺牲哪个会话,而是由Oracle随机决定。 不过对于RAC环境而言,死锁的检查不在是内部的随机实现,Oracle通过隐含参数_lm_dd_interval来控制死锁的检测时间。更重要的是,对于RAC环境而言,Oracle允许不同实例设置不同的值。而不同实例的检测死锁间隔不同,就意味着优先级的出现。 如果实例1上设置该值为默认值60秒,而实例2设置为30秒,那么当发生死锁后,永远是实例2上先检测到死锁,也就是说,实例2上会话会被牺牲掉。 这是两个实例上设置该参数相同的情况,两个会话分别连接到两个实例,产生死锁。实例1上的会话1: SQL> SELECT name FROM v$database; NAME ——— ORCL SQL> SELECT instance_number, instance_name FROM v$instance; INSTANCE_NUMBER INSTANCE_NAME ————— —————- 1 orcl1 SQL> SET sqlp ‘I1S1> ‘ I1S1> SHOW parameter _lm NAME TYPE VALUE ———————————— ———– … Continue reading

Posted in ORACLE | Tagged , , , | Leave a comment

RAC全局死锁检测时间

对于单实例数据库而言,死锁的检测在秒级完成,而RAC环境则死锁的检测时间默认达到了1分钟。 对于单实例环境如果出现了死锁,那么马上其中一个进程就被中止,用户可以快速的得到错误返回。而对于RAC而言,死锁的检测并不是实时完成,而是需要60秒左右的时间。 会话1执行: SQL> CREATE TABLE t_deadlock (id NUMBER PRIMARY KEY, name varchar2(30)); TABLE created. Elapsed: 00:00:00.12 SQL> INSERT INTO t_deadlock VALUES (1, ‘a’); 1 ROW created. Elapsed: 00:00:00.00 SQL> INSERT INTO t_deadlock VALUES (2, ‘b’); 1 ROW created. Elapsed: … Continue reading

Posted in ORACLE | Tagged , , , , | 1 Comment

利用触发器解决更新主键冲突的问题

有朋友问我能否用触发器实现更新数据时,如果发现主键已经存在,则将冲突的主键更新为当前记录之前的主键值。 简单的说,如果表中存在主键为1和2的记录,如果一条UPDATE语句将1更新为2,那么想要实现的功能是为了确保这个UPDATE可以执行成功,在后台自动将ID为2的记录更新为1。 这个功能应该可以实现,但是直接在触发器中肯定无法实现,因为这是一个标准的变异表问题。而且即使是采用自治事务的方式,也需要小心,因为要修改原有的记录就必须通过UPDATE实现,而这个UPDATE又会导致触发器的触发,如果处理不当,就会导致循环触发。 SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30), CONSTRAINT PK_T PRIMARY KEY (ID)); TABLE created. SQL> CREATE OR REPLACE PROCEDURE P_UPDATE_T (P_NEW NUMBER, P_OLD NUMBER) AS 2 BEGIN 3 FOR I IN (SELECT ID FROM T WHERE … Continue reading

Posted in ORACLE | Tagged , , , , | Leave a comment

单一会话引发的死锁

客户环境中出现了ORA-60死锁错误,检查日志发现,持有锁和等待锁的是同一个会话。 一般来说构成死锁至少需要两个会话,而当前的问题是一个会话引发的: Wed Nov 23 10:19:46 2011 ORA-00060: Deadlock detected. More info IN file /oracle/admin/db1/udump/db1_ora_3408686.trc.Wed Nov 23 10:19:46 2011 ORA-00060: Deadlock detected. More info in file /oracle/admin/db1/udump/db1_ora_3408686.trc. 对应的详细信息: *** 2011-10-29 10:11:28.970 *** SERVICE NAME:(db1) 2011-10-29 10:11:28.960 *** SESSION ID:(5562.45) 2011-10-29 … Continue reading

Posted in ORACLE | Tagged , | Leave a comment

外键缺少索引引发的死锁

客户的10.2.0.4 RAC for AIX环境频繁出现ORA-60死锁问题,导致应用程序无法顺利执行。 经过一系列的诊断,发现最终问题是由于外键上没有建立索引所致,由于程序在主子表上删除数据,缺少索引导致行级锁升级为表级锁,最终导致大量的锁等待和死锁。 下面通过一个例子简单模拟一下问题: SQL> CREATE TABLE t_p (id NUMBER PRIMARY KEY, name varchar2(30)); TABLE created. SQL> CREATE TABLE t_f (fid NUMBER, f_name varchar2(30), FOREIGN KEY (fid) REFERENCES t_p); TABLE created. SQL> INSERT INTO t_p VALUES (1, ‘a’); … Continue reading

Posted in ORACLE | Tagged , , , | Leave a comment