DBMS_TRANSACTION包为事务管理提供的一些过程和函数以及对分布事务的一些理解并为悬挂事务提供了处理方法。
对于事务处理涉及到的table或view为﹕
pending_trans$(是dba_2pc_pending的基本)
pending_sessions$
pending_sub_sessions$
v$transaction_enqueue
v$transaction
dba_2pc_pending
dba_2pc_neighbors(它和DBA_2PC_PENDING中包含了尚未解决的分布事务)
如果没有提交或回滚而正常退出SQL*PLUS会话﹐则SQL*PLUS会提交该事务﹐如果结束Pro*C程序﹐则会回滚。
DBMS_TRANSACTION包为事务管理提供了一些过程和函数,并为悬挂事务提供了处理方法。
READ_ONLY
READ_WRITE
USE_ROLLBACK_SEGMENT
以上三个过程分别等价目于SQL的SET TRANSCATION READ ONLY﹑SET TRANSCATION READ WRITE﹑SET TRANSCATION USE ROLLBACK SEGMENT rb_name命令。每个命令都必须在事务中作为第一个语句来执行。
ADVISE_ROLLBACK (对应dba_2pc_pending中advice字段的值’R’)
ADVISE_COMMIT (对应dba_2pc_pending中advice字段的值’C’)
ADVISE_NOTHING (对应dba_2pc_pending中advice字段的值为NULL)
以上三个分别等价于SQL的ALTER SESSIO ADVISE COMMIT﹐ALTER SESSIO ADVISE ROLLBACK和ALTER SESSION ADVISE NOTHING命令。它们可用来发送分布事务的建议﹐所发关的这些建议将在事务不确定时出现在远程数据库的dba_2pc_pending数据字典视图的advice字段中。
对于分布式事务来说,使用两阶段分布式提交(2PC)协议来完成﹐是先在各数据库分别commit,然后确认所有都commit成功后再对全局事务commit
若本地事务commit成功,但是失去了远程数据库的消息,则不知道远程是成功了还是失败了
这个时候人为的可以去核实两边数据库的状态从而决定是提交还是回滚
但是数据库失去远程数据库的消息,处于一个悬置状态。什幺时候决定是 pendding状态,数据库本身不会主动去探测远程数据库的活动状况,而是由os去检查网络的活动性情况决定连接是否还正常,发现不正常才返回本地数据库故障信息。这个时候应该才放入pendding状态表中。
smon本身应该不会去探测远程数据库状态,而是检查本地os的检查的远程状况。
使用ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY,可以使Oracle不再自动解决分布事务,即使网络恢复连接或者CRASH的数据库重新启动。ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY恢复自动解决分布事务。
COMMIT_COMMENT COMMIT_FORCE COMMIT
以上三个分别与SQL命令COMMIT COMMENT cmnt﹐COMMIT FORCE xid,scn和COMMIT等价,其中OMMIT COMMENT cmnt﹐COMMIT FORCE xid,scn是用于分布事务的﹐若未指定scn﹐则该事务使用当前的scn提交。 SAVEPOINT ROLLBACK ROLLBACK_SAVEPOINT ROLLBACK_FORCE
以上四个过程分别与SQL命令的SAVEPOINT savept﹐ROLLBACK,ROLLBACK TO SAVEPOINT savept和ROLLBACK FORCE xid等价﹐其中xid是本地或全局事务的ID。ROLLBACK_FORCE可用在分布事务处理中。
对于悬挂事务或出现ORA-01591错误﹐可以使用commit force和rollback force来解决。
BEGIN_DISCRETE_TRANSACTION
该过程可用来对现行事务做非连续标志
PURGE_MIXED
该过程可以用来清理混合事务﹐所谓混合事务是指在某些站点已提交而在另外一些站点却重新开始的分布事务。应把其参数xid设置到存储在dba_2pc_pending的列local_tran_id中。
PURGE_LOST_DB_ENTRY
如果在执行第二遍提议命令的处理过程中出现了失败﹐并且远程数据库已被破坏或进行了重建﹐则表dba_2pc_pending中的目录就不能自动地实现。过程PURGE_LOST_DB_ENTRY允许事务从本地站点中删除。参数xid是待删除的事务 上面两个过程﹐Oracle9i中,必须处于UNDO_MANAGEMENT=MANUAL的模式
LOCAL_TRANSACTION_ID
该函数为当前会话返回唯一的标识符。如果当前事务不存在的话﹐则返回空。返回的标识符对本地事务来说是唯一的。如果参数create_transcation为真值﹐则在该事务不存在的条件下创建该事务
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
---------------------------
2.39.2326
2.39.2326等于v$transaction中的XIDUSN. XIDSLOT. XIDSQN
其中XIDUSN为Undo segment number﹐XIDSLOT为Slot number﹐XIDSQN为Sequence number
STEP_ID 该函数返回对当前事务的DML操作进行排序的唯一的正整数。返回的值对当前的事务来说是唯一的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/33600/viewspace-266388/ ,如需转载,请注明出处,否则将追究法律责任。