暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle-ORA-01591 分布式事务问题

原创 lizhao01 2022-05-29
1058

昨天遇到一个朋友的系统报分布式事务问题。这是由于当使用db link + trigger的方式向远端库同步数据出现的问题,导致分布式事务出问题。
报错信息

ORA-01519 lock held by in-doubt distributed transaction 11.22.2405283
复制

如果分布式事务存在的话,其实可以根据状态进行清空:

select local_tran_id,state from dba_2pc_pending;  LOCAL_TRAN_ID      STATE ---------------------- ---------------- 11.22.2405283           prepared 如果状态是prepared状态,可以看远端库的分布式事务情况,如果目标库是commited那么需要强制commited本地库。如果没有commit,那么可以都rollback它。 最简单的解决方法: 本地库强制提交 commit force '11.22.2405283'; 本地库、目标库清理分布式事务信息 execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('11.22.2405283');
复制

但是事情没有那么简单。朋友啥也没干,上来就把基表给清理了-_-、

select * from dba_2pc_pending; delete from sys.dba_2pc_pending s where s.local_tran_id='11.22.2405283'; delete from sys.pending_sessions$ ; delete from sys.pending_sub_sessions$ ; commit; 清理的真很干净-_-、
复制

好家伙抓瞎了,还没有历史记录,还好网上有大神写过解决方案:

这个方法就是造一个假的事务,骗过数据库,强制清理分布式事务状态,方法不错,而且救命了。 alter system disable distributed recovery; insert into pending_trans$ ( LOCAL_TRAN_ID, GLOBAL_TRAN_FMT, GLOBAL_ORACLE_ID, STATE, STATUS, SESSION_VECTOR, RECO_VECTOR, TYPE#, FAIL_TIME, RECO_TIME) values( '11.22.2405283', /* <== 此处为你的local tran id */ 306206, /* */ 'XXXXXXX.12345.1.2.3', /* 这些值不必更改, */ 'prepared','P', /* 是静态参数,可以直接 */ hextoraw( '00000001' ), /* 在这个sql中使用 */ hextoraw( '00000000' ), /* */ 0, sysdate, sysdate ); insert into pending_sessions$ values( '11.22.2405283', /* <==此处为你的local tran id */ 1, hextoraw('05004F003A1500000104'), 'C', 0, 30258592, '', 146 ); commit; commit force '11.22.2405283'; execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('11.22.2405283');
复制

不过当看到Oracle的分布式事务,让我联想起了现在的分布式数据库:
看官当STATE字段有五种状态:
Collecting,prepared,commited,forced commit, or force rollback.
prepared --> commited 不就是现在分布式数据库推崇的两阶段提交么,Oracle早就开始玩技术,而且分布式事务可见会遇到很多不稳定的情况,那么分布式事务的回滚,清理,也需要重点处理的环节。

image.png

参考

https://blog.csdn.net/Hehuyi_In/article/details/89494415

最后修改时间:2022-05-29 12:08:17
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论