oracle分布式事务总结-转载

基本概念

Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点。

Global Coordinator:分布事务的发起者,负责协调这个分布事务。

Commit Point Site:在分布事务中,首先执行COMMIT或ROLLBACK操作的站点。一般情况下,应该把存储关键数据的站点作为Commit Point Site。因为Commit Point Site和其它站点不一样,从来不会进入prepared状态,所以不会存在IN-DOUBT事务。

可以设置初始化参数COMMIT_POINT_STRENGTH,在分布式事务中,会根据这 个值的大小来确定Commit Point Site,分布事物的状态信息也存在该数据库中。一般将关键的数据库作为commit point site ,commit_point_strength值较高的数据库为commit point site,在分布事物中最先提交

分布式提交的3个阶段

分布事物的两阶段提交分三个过程:

1. 准备阶段(PREPARE PHASE)

·本地数据库Global Coordinator向其它数据库发出COMMIT通知

·比较所有数据库的SCN号,将最高的SCN号作为分布事物的全局SCN号

·所有数据库写在线日志

·对分布事物修改的表加分布锁,防止被读写

·各数据库向Global Coordinator发出已经准备好的通知

所有参与分布事物的数据库必须经过上述准备,才能进入下一阶段。

2. 提交阶段(COMMIT PHASE)

·本地数据库Global Coordinator通知commit point site首先提交。commit point site提交后,释放其占有的资源,通知Global Coordinator完成提交

·本地数据库Global Coordinator通知其它数据库提交

·提交节点在日志中追加一条信息,表示分布事物已经完成提交,并通知Global Coordinator。此时所有数据库的数据保持了一致性。

3. 注销阶段(FORGET PHASE)

·本地数据库Global Coordinator通知commit point site所有数据库已经完成提交

·commit point site清除分布事物的记录和状态信息,并通知Global Coordinator

·Global Coordinator清除本地分布事物的记录和状态信息

此时分布事物的两阶段提交全部完成。

如果两阶段提交完成之前,数据库或网络出现异常,应用就会报错,分布事物处于IN_DOUBT状态。一旦数据库或网络恢复正常,系统(RECO PROCESS)会自动处理IN_DOUBT状态的分布事物。有些情况需要管理员手工处理IN_DOUBT状态的分布事物:

·IN_DOUBT状态的分布事物,将关键表锁住,造成应用不能正常工作

两个重要的视图

DBA_2PC_PENDING:列出所有的悬而未决的事务﹐此视图在末填入悬而未决的事务之前是空的﹐解决这后也被清空。


列名

说明

LOCAL_TRAN_ID

本地事务标识﹐格式为integer.integer.ingeger。

当一个连接的local_tran_id和global_tran_id相同时﹐那么该节点是该事务的全局协调器。


GLOBAL_TRAN_ID

全局事务标识,格式为﹕global_db_name.db_hex_id.local_tran_id,其中db_hex_id是用来标识数据库八字符的十六进制数﹐公共事各id在分布式事务的每个节点都是相同的。

STATE

下图表进行说明

MIXED

“YES”意味着一部分事务已经在一个节点上提交﹐而在另一个节点上被回滚。

TRAN_COMMENT

事务的注释﹐或者如果使用了事务命名﹐当事各被提交时﹐事务的名字就会出现在此处

Host

主机名

Commit#

已提交的事务的全局提交数

DBA_2PC_PENDING的STATE列的说明


列值

说明

Connecting

通常情况下﹐只有全局协调器和本地协调器才使用这个条目﹐节点在能够决定它是否能够准备好之前﹐要收集来自于其它数据库服务的信息。

Prepared

节点已准好﹐可能或者也可能没有将已准备好的消息通知本地协调器﹐但此时﹐该节点还没有接收到提交的请求﹐仍保持着准许备好的状态﹐控制着提交事务所必需的任何本地资源。

Commited

节点(任何类型)已经提交了事务﹐但该事务所包含的其它节点可能并没有提交﹐也就是该事务在一个个或多个其它节点上仍然是悬而未决 。

Forced commit

DBA进行判断后﹐可以强行提交未决的事务﹐如果一个事务由DBA在本地节点进行手动提交时﹐产生此项目

Forced abor(rollback)

DBA进行判断后﹐可以强行回滚未决的事务﹐如果一个事务由DBA在本地节点进行手动回滚时﹐产生此项目

DBA_2PC_NEIGHBORS:列出所有获得的(从远程客户)和送出的(给远程服务器)悬而未决的事务﹐也表示该本地节点是不是事务的提交点站点。


LOCAL_TRAN_ID

同上

IN_OUT

获得事务为IN﹐送出事务为OUT

Database

对获得事务来说指本地节点信息的客户数据库的名称﹔对送出的事务来说指用于访问远程服务器上信息的数据库链接的名称

DBuser_owner

对获得事务来说指远程数据库链接用于连接的本地账户﹔对于送出事务来说指该数据库链接的拥有者。

INTERFACE

‘C’代表提交信息﹐’N’表示已准备好状态的一条消息或是一条请求只读提交的请求。

当’IN_OUT’为OUT时﹐’C’表示该连接的远程的站点是提交点站点,并且知道是提交还是中断。’N’表示本地节点正在通知远程节点﹐说它已准备好。

当’IN_OUT’为IN时﹐‘C’表示本地节点或送出的远程的一个数据库是提交点站点﹐’N’表示本地节点正在通知远程节点﹐说它已准备好。

处理悬挂事务的一般步骤

1、  检查alert文件,发现类似下面error:

ORA-1591 "lock held by in-doubt distributed transaction %s"

ORA-2062 "distributed recovery received dbid x, expected y"

ORA-2068 "following severe error from %s%s"

2、  确认网络是否正常、dblink是否valid、v$dblink和gv$dblink中查询当前是否在使用分布式事务。

3、  查询视图dba_2pc_pending,查询悬挂事务信息:

SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID, STATE, MIXED, HOST, COMMIT#

FROM DBA_2PC_PENDING

WHERE LOCAL_TRAN_ID = ‘??.‘;

如果没有记录,说明RECO进程已经自动处理了该事务。

4、  在所有节点上查询视图dba_2pc_neighbors

5、  得到所有节点的COMMIT_POINT_STRENGTH值,值最大的为commit point site,即最早提交的点,如果悬挂事务发生在commit point site,则它的state决定了整个分布式事务的状态。悬挂事务是否应该commit force或者是rollback force,由此节点决定。

6、  检查dba_2pc_pending的state列,如果是commited,意味着本地数据库提交已经成功。其他节点需要根据本地事务号和最大的commit#进行强制提交。用法如下:

SVRMGR> COMMIT FORCE ‘your local transactionID on this node‘, ‘highest SCN from already committed site‘;

SVRMGR> COMMIT FORCE ‘1.13.5197‘, ‘88123887‘;

7、  如果commit point site的state为commited外的其他状态,则表明commit point site 没有提交成功,分布式事务需要强制回滚。这里不再需要所有节点的最大commit#。用法如下:

SVRMGR> ROLLBACK FORCE ‘your local transactionID on this node‘;

SVRMGR> ROLLBACK FORCE ‘1.13.5197‘;

8、  清除dba_2pc_pending和dba_2pc_neighbers的相关记录。一般分布式事务自动恢复后,视图内容会自动清除,如果是手工提交的事务,则需要用dbms_transaction包手工清除,清除规则如下表所示:

确定何时能使用DBMS_TRANSACTION


State列

全局事务状态

本地事务状态

通常的动作

可选择的动作

Collecting

Rollback

Rollback


Purge_lost_db_entry(只有当自动回复不能解决事务时)

Committed

Committed

Committed


Purge_lost_db_entry(只有当自动回复不能解决事务时)

Prepared

Unknown

Prepared


强行提交或回滚

Forced

Commit


Unknown

Committed


Purge_lost_db_entry(只有当自动回复不能解决事务时)

Forced rollback

Unknown

Rollback


Purge_lost_db_entry(只有当自动回复不能解决事务时)

Forced commit

Mixed

Committed

手动删除不一致性﹐然后使用purge_mixed

 

Forced rollback

Mixed

Rollback

手动删除不一致性﹐然后使用purge_mixed

 

测试记录

¡        设置db1的commit_point_strength为1,db2的commit_point_strength为2,db2为commit point site。

¡        db1、db2上执行100次insert循环,每次循环用分布式事务插入db1和db2中的测试表。中间reboot db2服务器。此时db1对测试表的查询出现以下错误:

SQL> select count(1) from temp.my_table;

select count(1) from temp.my_table

*

ERROR at line 1:

ORA-01591: lock held by in-doubt distributed transaction 7.30.7415

[[email protected] bdump]$ tail -f alert_ntespay.log

Tue Mar  4 14:14:28 2008

DISTRIB TRAN 1234.4F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

is local tran 7.30.7415 (hex=07.1e.1cf7)

insert pending prepared tran, scn=934346533 (hex=0.37b0ff25)

db1中分布式事务相关的2个视图内容如下:

select a.* from dba_2pc_pending a where LOCAL_TRAN_ID=‘7.30.7415‘;

LOCAL_TRAN_ID    GLOBAL_TRAN_ID STATE       MIXED     ADVICE    TRAN_COMMENT  FAIL_TIME       FORCE_TIME         RETRY_TIME   OS_USER  OS_TERMINAL         HOST        DB_USER COMMIT#

1       7.30.7415         4660.4F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  prepared    no                        2008-3-4 14:14:28                 2008-3-4 14:22:56        zhenxingzhai       ZHAIZHENXING         NETEASE\ZHAIZHENXING               934346533

其中,

state有以下几种状态:

Collecting, prepared, committed, forced commit, or forced rollback

mixed表示是否部分提交,部分回滚

advice:

C

for commit,

R

for rollback, else

NULL

select a.* from dba_2pc_neighbors a where LOCAL_TRAN_ID=‘7.30.7415‘;

LOCAL_TRAN_ID    IN_OUT    DATABASE       DBUSER_OWNER     INTERFACE      DBID         SESS#        BRANCH

1       7.30.7415   in      NULLjavaxa.oracle.com        TEMP       N      javaxa_orcl 1         01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

此视图说明了数据源1的输入连接信息。因为数据源2不是通过dblink连接的,以此没有出现它的记录。

¡        db2重启后查询my_tab:

SQL> select count(1) from my_tab;

COUNT(1)

----------

75

¡        因为db2中dba_2pc_pending和dba_2pc_neighbers中没有记录,并且db2为commit point site,没有记录意味着没有进行任何操作,所以db1应该和db2一样,进行强制rollback。

SQL> conn / as sysdba

Connected.

SQL> rollback force ‘7.30.7415‘;

Rollback complete.

SQL> select count(12) from temp.my_table;

COUNT(12)

----------

75

db1的alert日志中显示了可疑事务的回滚过程:

Tue Mar  4 15:14:31 2008

DISTRIB TRAN 1234.4F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

is local tran 7.30.7415 (hex=07.1e.1cf7)

change pending prepared tran, scn=934346533 (hex=0.37b0ff25)

to     pending forced rollback tran, scn=934346533 (hex=0.37b0ff25)

¡        回滚后,两个视图中的状态更改为如下:

select a.* from dba_2pc_pending a where LOCAL_TRAN_ID=‘9.33.5992‘;

LOCAL_TRAN_ID    GLOBAL_TRAN_ID STATE       MIXED     ADVICE    TRAN_COMMENT  FAIL_TIME       FORCE_TIME         RETRY_TIME   OS_USER  OS_TERMINAL         HOST        DB_USER COMMIT#

1       7.30.7415         4660.4F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000  forced rollback  no                        2008-3-4 14:14:28        2008-3-4 15:14:31        2008-3-4 15:20:07        zhenxingzhai         ZHAIZHENXING      NETEASE\ZHAIZHENXING               934346533

select a.* from dba_2pc_neighbors a where LOCAL_TRAN_ID=‘9.33.5992‘;

LOCAL_TRAN_ID    IN_OUT    DATABASE       DBUSER_OWNER     INTERFACE      DBID         SESS#        BRANCH

1       7.30.7415   in      NULLjavaxa.oracle.com        TEMP       N      javaxa_orcl 1         01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

¡        去除dba_2pc_pending和dba_2pc_ neighbors中的记录:

(1) Disable分布式恢复

SQL> ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;

System altered.

(2)Puege(清空)in-doubt transaction entry:

SQL> exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘7.30.7415‘);

PL/SQL procedure successfully completed.

(3)commit;

(4)然后enable 分布式恢复:

SQL> ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY;

分布式事务相关资料

Note:1012842.102

ORA-2019 ORA-2058 ORA-2068 ORA-2050: Failed Distributed Transactions

Note:100664.1

How to Troubleshoot Distributed Transactions

Note:274321.1

While Trying to Commit or Rollback a Pending Transaction Getting Errors ORA-02058,ORA-01453,ORA-06512

Note:126069.1

Manually Resolving In-Doubt Transactions: Different Scenarios

[url]http://www.itk.ilstu.edu/docs/Oracle/server.101/b10739/ds_txns.htm#i1007721[/url]

本文出自 “帅小伙的博客” 博客,请务必保留此出处http://zhaizhenxing.blog.51cto.com/643480/134750

时间: 2024-12-17 10:31:55

oracle分布式事务总结-转载的相关文章

浅述Oracle分布式事务概念

着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说,分布式数据库就是通过多个相互连接的数据库节点(注意不是Instance),来支持前端系统数据访问需要的数据库组织结构.各个节点之间相互独立.自我管理(site autonomy).分布式数据库系统追求的主要目标包括:可用性(availability).准确性(accuray).一致性(concur

分布式事务解决方案(转载+整理)

导读:以下资料均来自网络,本人负责整理 1.使用消息队列来避免分布式事务 比如在北京很有名的姚记炒肝点了炒肝并付了钱后,他们并不会直接把你点的炒肝给你,而是给你一张小票,然后让你拿着小票到出货区排队去取.为什么他们要将付钱和取货两个动作分开呢?原因很多,其中一个很重要的原因是为了使他们接待能力增强(并发量更高). 还是回到我们的问题,只要这张小票在,你最终是能拿到炒肝的.同理转账服务也是如此,当支付宝账户扣除1万后,我们只要生成一个凭证(消息)即可,这个凭证(消息)上写着“让余额宝账户增加 1万

k神吹水之 聊聊分布式事务 转载

事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉.就要么生,要么死.没有半死不死的中间不可预期状态. 参考下薛定谔的猫. 事务是为了保障业务数据的完整性和准确性的. 分布式事务,常见的两个处理办法就是两段式提交和补偿. 两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了. 补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状

分布式事务解决方案(转载)

目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开源框架能够解决的,更多的还是看业务场景,根据场景来给出解决方案.根据笔者最近几年的了解,总结了几个点,更多的应用系统在编码的时候,更加关注数据的一致性,这样系统才是健壮的. 一.基础理论 目前关于事务的几大理论包括:ACID事务特性,CAP分布式理论,以及BASE等.ACID在数据库事务中体现,CA

使用Atomikos Transactions Essentials实现多数据源JTA分布式事务--转载

原文:http://www.ite/topic/122700 9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XADatasource支持,如果使用了支持XADatasouce版本,可以参考2楼补充. 最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring+ibatis.因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现

【故障处理】分布式事务ORA-01591错误解决

[故障处理]分布式事务ORA-01591错误解决 1  BLOG文档结构图       2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 分布式事务的简单概念         ② ORA-01591错误解决   Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(x

深入理解分布式事务

本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 我在上一期介绍了spring的事务原理(详情见<深入理解spring事务原理>),spring事务本质是单机下的事务,是由数据库本身保证的.今天,我将介绍一种比较复杂的事务:分布式事务. 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同

X/Open DTP——分布式事务模型

转载:http://www.cnblogs.com/aigongsi/archive/2012/10/11/2718313.html 这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来. 在上一节事务的编程模型里面,主要说明了三种编程模型,一般情况下,我们都接触的是单一资源的事务,也就是单独对一个数据库进行操作.如果需要跨多个资源保证事务一致性 举个例子:在ATM机取钱的时候

快速理解 Omid: Yahoo在HBase上的分布式事务方案

作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 是什么 简单的说,OMID就是Yahoo构建在HBase上的一个分布式事务解决方案,用来拓展HBase所不支持跨行跨表级别的事务.其定位目标是OLTP类型的事务.类似的系统也有不少,他们或多或少都借鉴了谷歌的Percolator的思想,而omid则有较大的区别,具体区别在哪,下文详细分析. 以下关于Omid的理解主要参考Omid