昨天遇到一个朋友的系统报分布式事务问题。这是由于当使用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早就开始玩技术,而且分布式事务可见会遇到很多不稳定的情况,那么分布式事务的回滚,清理,也需要重点处理的环节。
参考
最后修改时间:2022-05-29 12:08:17
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1481次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
900次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
548次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
501次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
429次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
377次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
322次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
311次阅读
2025-04-08 09:12:48
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
270次阅读
2025-03-19 14:41:51
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
268次阅读
2025-03-24 09:42:53