ORA-02055: distributed update operation failed; rollback required

最近同事遇到一个奇怪的问题求助,以下奉上国外大神的问题重现及解决方法

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

ORA-02055: distributed update operation failed; rollback required

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

You call a remote procedure or package over a database link.

Now, on the other side (the remote side), there was an error encountered, but there were already some statements executed successfully.

Now you will need to perform a rollback before you can do a select on the calling side, or you will get this error.

原因:通过数据库链接调用远程存储过程或包。然而,执行过程中远程数据库有报错,但是部分语句已成功执行

措施:在调用端可以查询之前,需要执行回滚操作,否则将获得以上错误提示。

问题重现:

-- First we create some test users

SQL> drop user test1 cascade;

User dropped.

SQL> drop user test2 cascade;

SQL> create user test1 identified by test1;

User created.

SQL> create user test2 identified by test2;

User created.

SQL> grant create session, create table, create trigger, create procedure, create database link to test1, test2;

Grant succeeded.

SQL> alter user test1 quota unlimited on system;

User altered.

SQL> alter user test2 quota unlimited on system;

User altered.

Now we connect to test 2 (remote user) and create a table

SQL> conn test2/test2@XE
Connected.

SQL> create table test2_tab(n number);

Table created.

SQL> insert into test2_tab values(1);

1 row created.

SQL> commit;

Commit complete.

In order to demonstrate this error, we create a trigger on the newly created table, but make sure the trigger fails. In our case, we assign a character to a number field:

create or replace trigger test2_tab_bir
before insert on test2_tab
for each row
begin
  :new.n := 'a';
end;
/

Trigger created.

Connect to test1, create database link

SQL>  conn test1/test1@XE
Connected.
SQL>

SQL> create database link test2 connect to test2 identified by test2 using 'XE';

Database link created.

Now we will create a procedure which will first do a successful dml, after that a dml that fails due to the incorrect trigger:

create or replace procedure p is
begin
  -- first do a statement that executes ok
  update test2_tab@test2 set n=2;
  -- next statement will fail because of the invalid trigger
  insert into test2_tab@test2 values(1);
end;
/

Procedure created.

Call the procedure, it will fail:

SQL> exec p
BEGIN p; END;

*
ERROR at line 1:
ORA-02055: distributed update operation failed; rollback required
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "TEST2.TEST2_TAB_BIR", line 2
ORA-04088: error during execution of trigger 'TEST2.TEST2_TAB_BIR'
ORA-02063: preceding 3 lines from TEST2
ORA-06512: at "TEST1.P", line 4
ORA-06512: at line 1

Now we have a failed distributed transaction, you need to rollback, else you will get the error when selecting ANY table/view

SQL> select sysdate from dual;
select sysdate from dual
                    *
ERROR at line 1:
ORA-02067: transaction or savepoint rollback required

-- also happens when oracle itself calls another select recursively (notice the ORA-00604)

SQL> select * from user_2pc_pending;
select * from user_2pc_pending
              *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-02067: transaction or savepoint rollback required

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

Present  By  Dylan.


当事务被标记为rollback-only时,它意味着该事务将被回滚而不会提交。这种标记通常是由于出现了一个致命的错误或异常,导致事务无法继续执行或数据不一致。事务管理框架(Spring等)会检测到该标记,并在事务结束时执行回滚操作。 引用中的异常提示了事务被标记为rollback-only,这意味着在事务执行过程中发生了一个异常或错误,导致事务被强制回滚。而引用和中提到的方法是处理该异常的方式之一,即重新启动一个独立的事务来处理异常情况。 为了将该异常记录到数据库,可以在处理异常的代码中将异常信息保存到数据库中。可以使用数据库的操作方法将异常信息插入到相应的表中,以便后续分析和处理。 总结来说,当事务被标记为rollback-only时,意味着该事务将被回滚而不会提交。可以通过重新启动一个独立的事务来处理异常,并将异常信息记录到数据库中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [COS——R.log](https://download.csdn.net/download/ktc7000/4424623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Transaction marked as rollback-only异常](https://blog.csdn.net/u011196623/article/details/82826133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值