`

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在分布式事务的每个节点都是相同的。

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

TRAN_COMMENT

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

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

DBA_2PC_PENDING的STATE列的说明

Connecting

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

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

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

Forced commit

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

Forced abor(rollback)

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

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

 

LOCAL_TRAN_ID

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

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

Collecting

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

Committed

Committed

Committed

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

Forced

Commit

Committed

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

Forced rollback

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

Forced commit

Committed

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

Forced 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

[oracle@db2 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

Note:100664.1

Note:274321.1

Note:126069.1

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

分享到:
评论

相关推荐

    分布式事务相关资料及软件

    "分布式事务相关资料及软件"这个标题暗示了我们将会探讨分布式事务的基础理论,以及一种名为Seata的开源分布式事务解决方案。 分布式事务是为了在分布式系统环境下保证数据的一致性和完整性而设计的一种事务处理...

    基于RabbitMQ消息队列的分布式事务解决方案

    此外,分布式事务的理论基础包括CAP理论(选择一致性、可用性或分区容错性)、BASE理论(基本可用、软状态、最终一致性)以及如2PC、3PC、Paxos、Raft等一致性协议。 总之,RabbitMQ提供了有效的工具来解决分布式...

    oracle深入 chm oracle深入

    在分布式系统方面,Oracle支持分布式数据库系统,通过分布式事务处理和全局唯一标识符(GUID)实现跨多个数据库节点的数据一致性。分布式数据库系统可以提高可用性和性能,同时降低地理位置对数据访问的影响。 ...

    ORACLE数据库理论及应用.pptx

    8. **分布式数据库**:Oracle支持分布式数据库系统,通过数据库链接实现跨站点的数据共享和事务处理,适应分布式环境的需求。 9. **Web数据库和对象数据库**:Oracle 9i引入了对Web数据库的支持,允许通过Web编程...

    基于Oracle的同位素分布式管理系统的设计与应用.pdf

    通过这种方式,论文提供了一套完整的解决方案,不仅理论分析了分布式数据库设计的关键点,还给出了实践应用的案例,具有较高的参考价值。 总之,《基于Oracle的同位素分布式管理系统的设计与应用》深入探讨了如何...

    分布式数据库技术及发展趋势研究.docx

    而分布式事务数据库主要解决分布式事务的问题。 分布式数据库技术在高效组织、存储、管理数据方面发挥着重要作用,并且随着大数据技术和云计算技术的发展,分布式数据库技术将继续发挥着更大的作用。

    oracle教学ppt全套

    在高可用性和分布式系统方面,Oracle提供集群技术(如RAC,实时应用集群)和分布式数据库系统(如分布式事务处理)。这些高级主题可能在PPT的高级部分进行讲解,适合有一定基础的学习者。 最后,数据库的维护和升级...

    Oracle开发手册

    8. **分布式数据库**:Oracle支持分布式数据库系统,手册可能会讲解如何配置和管理分布式环境,包括分布式事务处理和数据复制。 9. **Oracle的新特性**:随着Oracle版本的更新,新特性如自动内存管理、Automatic ...

    Oracle数据库应用题库

    理解分布式事务处理、复制和数据网格的概念将有助于处理大规模的分布式环境。 十、数据库云服务 Oracle Cloud提供了各种数据库服务,如Autonomous Database,它自动化了数据库的运维任务。了解如何在云端部署和管理...

    ORACLE课程设计案例精编

    9. **分布式数据库**:Oracle的分布式数据库功能允许跨越多个物理位置的数据集成,如数据库链接、分布式事务处理等。 10. **Oracle云服务**:随着云计算的发展,Oracle也提供了云数据库服务,如Oracle Autonomous ...

    Oracle(CHM).zip

    8. **分布式数据库**:讲述Oracle的分布式特性,如分布式事务、全局名字、数据复制等。 9. **安全性**:讲解Oracle的安全机制,如审计、角色权限、加密技术等,以及如何防范SQL注入和权限滥用等安全问题。 10. **...

    Oracle知识大全PPT合集

    - 分布式数据库的概念和Oracle的分布式特性,如分布式事务处理。 7. **高可用性与灾难恢复**: - RAC(Real Application Clusters):多节点数据库集群的实现和维护。 - Data Guard:数据库镜像和备用数据库的...

    MLDN魔乐科技JAVA培训_Oracle课堂13_事务处理.rar

    此外,Oracle还支持分布式事务,允许跨越多个数据库实例的操作作为单个事务处理。 通过"MLDN魔乐科技JAVA培训_Oracle课堂13_事务处理.wmv"这个视频课程,学习者可以深入学习如何在Java应用程序中有效地使用JDBC进行...

    Oracle Concepts Oracle概念(10g R2)(中英文对照文档)

    19. **分布式数据库**:探讨了分布式数据库系统的设计和实现,包括分布式事务和分布式查询。 20. **故障诊断和监控**:提供了诊断工具和方法,如跟踪文件、警告日志和AWR报告,以及如何监控数据库健康状态。 以上...

    精通Oracle强烈推荐

    - **Advanced Queuing (AQ)**:提供了强大的消息队列功能,支持异步数据处理和分布式事务。 - **XML支持**:增强了对XML数据类型的支持,便于XML文档的存储和检索。 - **PL/SQL增强**:增加了许多新的语言特性,...

    Oracle语法大全

    在分布式系统中,Oracle支持全局命名、分布式事务和复制技术,使得跨地域的数据共享和同步成为可能。 以上只是Oracle语法大全中的部分关键知识点,实际学习中还需要结合具体场景和实践进行深入研究。通过《Oracle...

    国产数据库技术架构算法的方法论HotDBP.pdf

    本文件"国产数据库技术架构算法的方法论HotDBP.pdf"深入探讨了国产分布式事务数据库的核心技术和验证方法,旨在推动技术创新并变革传统理论。 首先,文件提到的分布式事务数据库技术架构包括内置数据分片键的优势与...

    oracle教学课件

    10. **分布式数据库**:讲解Oracle的分布式特性,如分布式事务、全局表、分布式查询等。 11. **Oracle架构**:详解Oracle数据库的物理和逻辑结构,包括SGA(System Global Area)、PGA(Program Global Area)以及...

    达内,tarena,oracle笔记,oraclePPT课件,达内oracle笔记

    此外,Oracle数据库支持分布式数据库系统,允许在不同地理位置的数据进行无缝集成。 7. **Oracle PPT课件**:PPT课件通常以图文并茂的方式呈现,便于理解和记忆。它们可能包含关键概念的总结、示例演示、流程图以及...

Global site tag (gtag.js) - Google Analytics