程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORA-02049:超時:分布式事務處理等待鎖模擬

ORA-02049:超時:分布式事務處理等待鎖模擬

編輯:Oracle教程

ORA-02049:超時:分布式事務處理等待鎖模擬


現場報這個錯,我想模擬一下,看是什麼問題。

在數據庫B上建表:

create table TEST
(
A NUMBER,
B DATE
);
insert into test (A, B) values (2, to_date('16-04-2015 16:38:26', 'dd-mm-yyyy hh24:mi:ss'));
insert into test (A, B) values (1, to_date('24-03-2015 16:32:36', 'dd-mm-yyyy hh24:mi:ss'));
insert into test (A, B) values (2, to_date('16-04-2015 16:35:19', 'dd-mm-yyyy hh24:mi:ss'));
insert into test (A, B) values (2, to_date('16-04-2015 16:35:19', 'dd-mm-yyyy hh24:mi:ss'));
commit;


在數據庫A上:
drop database link to_B;
create database link to_B
connect to B_user identified by B_password
using '(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.15.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)';

在數據庫B上執行update不提交:
SQL> update test set b = sysdate where A =2;

在數據庫A上:
SQL> show parameter distributed_lock_timeout;
NAME TYPE VALUE
------------------------------------ ----------- -------
distributed_lock_timeout integer 60

SQL> update test@to_B set b = sysdate where A =2;
update test@to_B set b = sysdate where A =2
*

第 1 行出現錯誤:
ORA-02049: 超時: 分布式事務處理等待鎖

ORA-02063: 緊接著 line (起自 TO_B)

等待60s後就報超時,就是distributed_lock_timeout設置的值

解決方案:數據庫B上的事務盡快提交,或者數據庫B上的SQL(update or delete or merge)太慢,需要調優。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved