oracle中ora-02049,ORA-02049 ‘timeout: distributed transaction waiting for lock’ 解决

博客讨论了Oracle数据库中出现ORA-02049错误的情况,该错误是由于分布式事务等待锁超时导致的。内容详细展示了错误发生的SQL操作,并提供了问题的解决思路,包括优化代码设计以减少并发修改相同数据,以及调整distributed_lock_timeout参数来增加事务等待时间。此外,还提及了主键约束在防止此类问题中的作用。
摘要由CSDN通过智能技术生成

ORA-02049 ‘timeout: distributed transaction waiting for lock’

ORA-02049是一个分布式事务等待超时的异常,当一个session 持有一个行级锁,另一个分布式事务比如通过dblink也想修改相同行的数据,就会产生 tx队列等待,当等待时间超过了系统参数distributed_lock_timeout的值时,就产生了这个错误,任何通过通过DBLINK的操作都是分布式事物。

下面还原一下这个错误

SQL> create table testdl(id int);

Table created.

SQL> insert into testdl values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into testdl values(2);

1 row created.

SQL> commit;

Commit complete.

【session1】

sys@NCME>select * from testdl@dl_1913;

ID

----------

1

2

sys@NCME>update testdl@dl_1913 set id=10 where id=1;

1 row updated.

【session2】

sys@NCME>update testdl@dl_1913 set id=20 where id=2;

1 row updated.

sys@NCME>commit;

Commit complete.

sys@NCME>update testdl@dl_1913 set id=100 where id=1;

update testdl@dl_1913 set id=100 where id=1

*

ERROR at line 1:

ORA-02049: timeout: distributed transaction waiting for lock

ORA-02063: preceding line from DL_1913

----------------

SQL> alter table testdl modify id primary key;

Table altered.

【session1】

sys@NCME>insert into testdl@dl_1913 values (3);

1 row created.

【session2】

sys@NCME>insert into testdl@dl_1913 values (3);

insert into testdl@dl_1913 values (3)

*

ERROR at line 1:

ORA-02049: timeout: distributed transaction waiting for lock

ORA-02063: preceding line from DL_1913

sys@NCME>show parameter distributed_lock

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

distributed_lock_timeout integer 60

解决问题的思路

首先还是应用程序的代码设计,减少多个session同时修改相同数据,减小事务,或在代码中加try do something cache exception ,when exception is ORA-02049 retry.

其次就是增加distributed_lock_timeout参数的值,增加事务等待时间

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值