目录📚 前言我们在使用 oracle 数据库时,有时候会碰到需要使用分布式事务,并且会碰到一些报错! ☀️ 分布式事务当需要在多个Oracle数据库之间进行数据一致性操作时,就会用到分布式事务。 例如: insert into T_log@remote_db; --远程数据库插入insert into T_local; --本地数据库插入commit; 分布在本地和远程两个db的事务同时操作,这就构成了一个分布式事务。 分布式事务采用 在这种机制下,事务处理过程分为三个阶段:
各关联节点此时会做三个事情:刷新redo信息到redo log中;将持有的锁转换为悬疑事务锁;取各节点中最大的SCN号进行同步! ⭐️ 常见错误以下是三种常见的分布式事务问题场景:
通过报错会有提示,例如: ORA-01591: lock held by in-doubt distributed transaction 10.20.360 这个10.20.360就是我们需要检查分布式事务ID! 由于分布式事务涉及到多个数据库之间进行操作,偶尔会遇到一些异常情况(例如系统或网络中断)导致上述三个阶段出现异常,这就在一个或多个节点上,产生不完整的“悬疑分布式事务”。 大多数情况下,出现这种问题,Oracle 会由 Reco 进程进行自动修复,Oracle 数据库会在
但有些情况下(例如节点无法正常访问或事务表中记录的数据不完整),Reco 进程不能正常完成这个工作,就会抛出异常。 对于分布式事务,对应的异常代码区间是 例如: ORA-02054: transaction in-doubt The transaction is neither committed or rolled back locally, and we have lost communication with the global coordinator. 此时往往需要手工处理进行干预。 常用的 2pc_clean 命令如下: select 'rollback force '||''''||local_tran_id||''''||';' "RollBack" from dba_2pc_pending where state='prepared';select 'exec dbms_transaction.purge_lost_db_entry('||''''||local_tran_id||''''||');' "Purge" from dba_2pc_pending;select 'rollback force ''' || LOCAL_TRAN_ID || ''';' || chr(10) ||'execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(''' || LOCAL_TRAN_ID || ''');' || chr(10) || 'commit;' from DBA_2PC_PENDING; 本次分享到此结束啦~ 如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。 |
|
来自: LuciferLiu > 《待分类》