分佈式事務故障處理暨ORA-24756: transaction does not exist處理
ORA-24756处理
看到警告日誌一直報ORA-24756錯誤
Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc:
ORA-24756: transaction does not exist
但是去找trace文件的時候卻沒有
想到了事務的問題,查dba_2pc_pending
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | commited |
通过该视图我去到远端的数据库查询该是视图
| select local_tran_id,state from dba_2pc_pending; |
| no rows selected. |
我嘗試
commit force '6.22.290635' 卻發現被hang住了,其实此时不需要commit force了,此时是分布式事务的第三个阶段即forget phase发生错误,需要做的是在本地清除分布式事务信息。
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635');
再kill了那个commit force动作。再去查询dba_2pc_pending的时候就找不到这个事务了。
分佈式事務总结
分布式事务,简单来说,是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过dblink update远程数据库的一行记录,如果在执行过程中网络异常,或者其他事件导致本地数据库无法得知远程数据库的执行情况,此时就会发生in doubt的报错。此时需要dba介入,且需要分多种情况进行处理。
分布式事务在commit提交时候,会经历3个阶段:
1.PREPARE PHASE:
1.1 决定哪个数据库为commit point site。(注,参数文件中commit_point_strength值[默认值为1]高的那个数据库为commit point site)
1.2 全局协调者(Global Coordinator)要求所有的点(除commit point site外)做好commit或者rollback的准备。此时,对分布式事务的表加锁。
1.3 所有分布式事务的节点将它的scn告知全局协调者。
1.4 全局协调者取各个点的最大的scn作为分布式事务的scn。(eygle在这篇文章中也测试过)
至此,所有的点都完成了准备工作,我们开始进入COMMIT PHASE阶段,此时除commit point site点外所有点的事务均为in doubt状态,直到COMMIT PHASE阶段结束。
如果数据库在此阶段出现问题,我们查询(假设远程数据库为commit point site,且本地数据库为Global Coordinator):
Scenario 1 collecting:
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | collecting |
remote DB
| select local_tran_id,state from dba_2pc_pending; |
| no rows selected. |
即表示本地数据库要求做好commit或者rollback准备,现在正在收集其他点的数据库返回信息,但是远程数据库状态未知(in doubt),我们需要手动的将本地的Global Coordinator信息清除掉:
|
SQL> exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635'); PL/SQL procedure successfully completed. |
Scenario2:prepared
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | prepared |
remote DB
| select local_tran_id,state from dba_2pc_pending; |
| no rows selected. |
即表示本地Global Coordinator已做好准备,已将分布式锁放到各个事务表上,但远程数据库的状态再次未知(in doubt),我们需要手动的将本地的transaction rollback掉,并且清除分布式事务信息:
| rollback force '6.22.290635'; |
|
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635'); |
2.COMMIT PHASE:
2.1 Global Coordinator将最大scn传到commit point site,要求其commit。
2.2 commit point尝试commit或者rollback。分布式事务锁释放。
2.3 commit point通知Global Coordinator已经commit。
2.4 Global Coordinator通知分布式事务的所有点进行commit。
Scenario 1 local prepared ,remote commited
| local: |
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | prepared |
| remote DB: |
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 1.92.66874 | commited |
即表示远程数据库可能已经commit,但是本地数据库未知远程数据库的状态,还是处于prepared状态。我们需要如下处理:
| local: |
| commit force '6.22.290635'; exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635'); |
| remote DB: |
|
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.92.66874'); |
Scenario2 local commited,remote commited
| local: |
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | commited |
| remote DB: |
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 1.92.66874 | commited |
即表示本地和远程数据库均完成commit,但未清除分布式事务信息,我们需要如下处理:
| local: |
|
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635'); |
| remote DB: |
|
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.92.66874'); |
3.FORGET PHASE:
3.1 参与的点通知commit point site他们已经完成commit,commit point site就能忘记(forget)这个事务。
3.2 commit point site在远程数据库上清除分布式事务信息。
3.3 commit point site通知Global Coordinator可以清除本地的分布式事务信息。
3.4 Global Coordinator清除分布式事务信息。
local:
| select local_tran_id,state from dba_2pc_pending; |
| LOCAL_TRAN_ID | STATE |
| 6.22.290635 | commited |
remote DB
| select local_tran_id,state from dba_2pc_pending; |
| no rows selected. |
即表示远端已完成commit,通知Global Coordinator清除分布式事务信息,但是本地没有收到该信息,我们改如下处理:
| local |
|
exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('6.22.290635'); |
总结分佈式事務的狀態依次如下:
| phase | local_state | remote_state | action |
| prepare | collecting prepared |
/ / |
本地DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY 本地rollback force后PURGE_LOST_DB_ENTRY |
| commit | prepared commited |
commited commited |
本地commit force后本地和遠程均PURGE 本地和遠程均PURGE_LOST_DB_ENTRY |
| forget | commited | / | 本地PURGE_LOST_DB_ENTRY |
本文转载自http://www.oracleblog.org/working-case/how-to-deal-with-distributed-transaction/的博客
分佈式事務故障處理暨ORA-24756: transaction does not exist處理的更多相关文章
- WCF分佈式事務支持
WCF分佈式事務對Binding有要求,不支持BasicHttpBinding,BasicHttpContextBinding,NetPeerTcpBinding 要支持分佈式事務,需要進行以下配置: ...
- spring boot sharding-jdbc实现分佈式读写分离和分库分表的实现
分布式读写分离和分库分表采用sharding-jdbc实现. sharding-jdbc是当当网推出的一款读写分离实现插件,其他的还有mycat,或者纯粹的Aop代码控制实现. 接下面用spring ...
- 比較C struct 與 C# unsafe struct内存分佈
昨晚在群裏無意間看到一個朋友有一個需求.他是在C裏面將兩個結構體(HeadStruct,BodyStruct)的内存數據直接通過socket send發給C#寫的服務端來處理.當然他之前所使用的需求基 ...
- [心得] SQL Server Partition(表分區) 資料分佈探討
最近在群裡有個朋友問了個問題是這樣的 用户表有一千多万行,主键是用户ID,我做了分区.但经常查询时,其它的表根据用户ID来关联,这样跨区查询,reads非常高.有什么好的处理办法?不分区的话,索引维护 ...
- mysql分库分表那些事
为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...
- C# 數據事務操作
public sealed class SQLFunc { #region Methods #region OpenConnection /// <summary>指定包含連接字串的字串 ...
- 【转】redis实现的分布式锁
参考: 1. https://www.bbsmax.com/A/WpdKpM1zVQ/ 2.https://www.oschina.net/translate/redis-distlock
- spring事務
spring事物 spring事物其实就是对数据库事物的一种支持,没有数据库事物的话,spring本身是不能提供事物支持的: 在最开始使用原始的jdbc连接数据库进行炒操作是, 获取连接后可以使用co ...
- VMware虛擬化技術實作問答
http://www.netadmin.com.tw/article_content.aspx?sn=1202130002&ns=1203280001&jump=3 Q4:啟用VMwa ...
随机推荐
- 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法
MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...
- PowerDesigner V16.5 安装文件
之前在网上找个假的,只能看,不能创建自己的DB; 或者 不能破解的,比较伤脑筋. 偶在这里提供一个 可长期使用的版本. PowerDesigner165_破解文件.rar 链接:http://p ...
- pycharm 中 pep8 检查开启.
pycharm pep8检查的开启,默认是暗黄色,我这里为了醒目给改成了黄色.
- poj 1562
这道题主要注意输入的问题,以及对周围搜索时的注意,要使用递归,多次调用,附上一组数据 11 20*@*@*@@@**@*@**@@@*****@*@*@*@*@****@**@*@*@*@*@*@*@ ...
- vm10.0key
5F4EV-4Z0DP-XZHN9-0L95H-02V17
- 学习Selenium2Library的好例子
最近好几个人问我有没有好的例子可以帮助学习Selenium2Library怎么用.对于公司同事,可以把脚本直接给过去,其他人则不行了.所以一直想做一个好的学习样例,这个样例应该有如下特性: 能够非常好 ...
- NGUI 图片变灰
效果图 1.先准备好一个变灰shader.代码如下 Shader "Custom/Gray" { Properties { _MainTex ("Base (RGB), ...
- ThinkPHP增加数据库字段后插入数据为空的解决办法
今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...
- Delphi xe5 手机开发经验(新手级别)
Delphi xe5 手机开发经验(新手级别) http://diybbs.zol.com.cn/1/34037_699.html http://www.delphitop.com/html/jiqi ...
- Match:Period(POJ 1961)
Period 题目大意:给定一个字符串,要你找到前缀重复了多少次 思路,就是kmp的next数组的简单应用,不要修正next的距离就好了,直接就可以跳转了 PS:喝了点酒用递归实现除法和取余了...结 ...