v$lock视图是Oracle中经典的锁检测接口之一,该视图列出了当前实例中被持有的锁信息;其中TYPE列指出了该持有锁的类型,比较常见的TX锁即事务队列锁(Transaction enqueue)和TM锁即DML enqueue锁(俗称表锁);一般某个会话在其事务(transaction)结束前总是持有一个TX锁,并一个或多个TM ROW-X(SX)锁 (一个事务中可能对多个表或对象进行了更新). 但偶尔我们会发现某个会话持有一个TX锁,却没有对应的TM锁的情况. 第一次接触到该问题,可能会觉得有些不可思议,但这种情况却的确存在:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where type  in ('TM','TX');

       SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------- -- ---------- ---------- ---------- ---------- ---------- ----------
      2090 TM     112504          0          3          0          0          2
      2090 TM      47529          0          3          0          0          2
      2090 TM      47530          0          3          0          0          2
      2090 TM      57497          0          3          0          0          2
      2090 TM     109826          0          3          0          0          2
      1137 TM      46920          0          3          0        891          2
      2090 TM      49919          0          3          0          0          2
      1501 TX    3538968     635593          6          0     273274          2
       586 TX    8650772     560279          6          0      88978          2
      1112 TX    7929874     781313          6          0       1291          2
       970 TX    4128815     688150          6          0     238769          2
      2175 TX    2555916     738283          6          0     273630          2
      2016 TX    1966099     673442          6          0       6164          2
      1933 TX    1769516     589203          6          0     792823          2
      2206 TX   13434902     679577          6          0     237904          2
       943 TX   16384041     282250          6          0      27004          2
      1207 TX    7077931     494826          6          0     587548          2
       374 TX   14286860     599261          6          0     279997          2
      2404 TX    4325408     713583          6          0          0          2
      2145 TX    9109533     592942          6          0      26868          2
      2296 TX    1835016     631599          6          0      78593          2
      1967 TX   14876690     484837          6          0     288239          2
      3276 TX    1572869     721894          6          0        115          2
      3232 TX    4915206     704681          6          0     332428          2
      1374 TX   14417924     546699          6          0        263          2
       635 TX    3473435     799864          6          0          4          2
      1179 TX   10289168     644315          6          0       8679          2
      3034 TX   14221320     556459          6          0      23417          2
      1403 TX    6553606     666507          6          0       7949          2
      2872 TX     131116     637111          6          0     112979          2
      1316 TX    8519697     598740          6          0          5          2
      1264 TX   11534348     794295          6          0       3062          2
      1793 TX    5505026     613635          6          0        114          2
      2689 TX   10878991     511962          6          0     792824          2
       743 TX     393235     630546          6          0        721          2
      2744 TX    4784159     615312          6          0      20424          2
      1959 TX    2424878     763163          6          0     201334          2
      1468 TX    2293801     918876          6          0          1          2
      1980 TX      65555     776770          6          0       6463          2
      2038 TX    9699339     600600          6          0          1          2
      1551 TX    3080213     560800          6          0     587549          2
      2835 TX    7733272     885787          6          0        173          2
      2246 TX   11665419     657752          6          0      17988          2
      1229 TX   11010083     528844          6          0     792824          2
      1476 TX   12320806     581063          6          0     792823          2
      3254 TX   10813472     551889          6          0       9643          2
      1794 TX    3014673     556138          6          0         21          2
      1682 TX    6291465     661166          6          0      10960          2
       998 TX    3670027     717078          6          0        114          2
      2989 TX    2031638     672709          6          0       1233          2
      2090 TX   13107209     436774          6          0          1          2
      3203 TX    5373978     731263          6          0       4982          2
      1676 TX   13172747     565610          6          0     273811          2
      2096 TX    1900577     665848          6          0       6464          2
      1563 TX    6357010     556097          6          0     587549          2
      1899 TX    2621459     746534          6          0     279634          2
      1722 TX    9764875     567516          6          0      14502          2
      2907 TX    8585236     553757          6          0     225941          2
      2386 TX    6225966     675153          6          0        855          2
      2238 TX   12189735     554114          6          0       6121          2
      1118 TX   15663139     468328          6          0     237037          2
      2280 TX    8716326     593341          6          0     792824          2
      2222 TX     524309     678972          6          0          1          2
      1230 TX   15794181     512612          6          0     792823          2
      2593 TX   16711683     230810          6          0     201661          2
      2261 TX    4849676     681767          6          0      18159          2
      1069 TX   12451855     465400          6          0     587549          2
      1203 TX    8388613     602148          6          0     587549          2
      2829 TX     589835     571720          6          0       5143          2
       988 TX    3997708     645741          6          0      28958          2
      1771 TX   13631511     521392          6          0          2          2
      2601 TX    1638423     605864          6          0          5          2
      2319 TX     655374     738909          6          0          3          2
      2963 TX    2097153     637674          6          0       7640          2
      3146 TX   11599895     699476          6          0       9561          2
       377 TX    9043977     638698          6          0     181366          2
      3166 TX    2490407     904504          6          0       6688          2
       555 TX    7012358     590789          6          0     112970          2
      3226 TX    5898270     519207          6          0     792823          2
      1103 TX    9240589     672736          6          0      18184          2
      3195 TX   10158108     504545          6          0       2576          2
      2715 TX   15925274     428945          6          0     201522          2
      2558 TX    1703943     643492          6          0       3047          2
      3021 TX   12386346     494943          6          0     587549          2
      2264 TX    1441795     692086          6          0        149          2
      2416 TX    6946836     655343          6          0     261655          2
      1397 TX   12517393     588260          6          0    1010345          2
      1439 TX   16318509     299824          6          0       5011          2
       869 TX    9437186     513497          6          0          2          2
      2535 TX   15597580     456805          6          0     182254          2
      2130 TX    4521998     674031          6          0     204313          2
      2708 TX    7405570     536059          6          0       5836          2
      2259 TX   15204353     467190          6          0     792823          2
       429 TX   10485792     738387          6          0     278846          2
      2031 TX    8912896     683349          6          0     273565          2
       559 TX   10092545     566706          6          0     587548          2
      3067 TX   13369376     673321          6          0          5          2
      2290 TX   15990804     472707          6          0     792823          2
      3208 TX    5439521     627538          6          0     156833          2
       563 TX    7798805     741212          6          0      18417          2
      2556 TX    5570567     483016          6          0     587549          2
      1443 TX   13828137     590212          6          0     273603          2
      1594 TX    9633796     613365          6          0     179342          2
       500 TX    2162700     615179          6          0       3505          2
      1458 TX    2752543     636530          6          0     587549          2
      2294 TX   14811182     545859          6          0          1          2
      2647 TX     262173     631006          6          0        376          2
      2770 TX    8847365     665512          6          0         18          2
      1881 TX    6815766     505031          6          0      17989          2
      1733 TX    2228250     744841          6          0      89732          2
      3253 TX   12124195     661906          6          0       4917          2
      1171 TX    4390934     688053          6          0        952          2
       575 TX    2359297     792394          6          0        932          2
      1952 TX    7995429     778698          6          0       7377          2
      1073 TX   10420261     676462          6          0         21          2
      2976 TX   14483498     557853          6          0     332223          2
       310 TX    8126473     611980          6          0     196341          2
      2624 TX   12779564     585073          6          0     177140          2
      1400 TX    8454154     548105          6          0          1          2
      2541 TX    3342373     612450          6          0     154890          2
       882 TX   11796503     502190          6          0       5987          2
      1475 TX     327695     668278          6          0          0          2
      1694 TX    7864342     655797          6          0     587549          2
      1882 TX    6422539     647676          6          0      16739          2
      3133 TX   13697064     591601          6          0          4          2
       637 TX   12845067     554594          6          0        976          2
       809 TX   11730960     737397          6          0         13          2
      2799 TX    3604491     762060          6          0          4          2
      1634 TX    8978449     564400          6          0          3          2
       601 TX   15532043     430716          6          0     792823          2
      2739 TX    9830436     585243          6          0       5955          2
      1110 TX   12713992     705911          6          0       5057          2
      1738 TX   16187423     344322          6          0     202512          2
      3040 TX    9502753     586506          6          0      12690          2
      1796 TX    7602221     697164          6          0     254457          2
      1149 TX    7143454     442359          6          0        999          2
      2940 TX   14352418     620297          6          0     204583          2

137 rows selected.

most tx lock ,no corresponding tm locks.
i have confirmed that there are no table lock disabled tables in database.

SQL> select   * from dba_tables where table_lock!='ENABLED';

no rows selected

以上演示其实已经列出了引起该种现象的一种可能性,即某些表上是"disable table lock"的,即该表上不会出现任何类型的TM锁,这也就意味着该表在"Enable table lock"之前不能进行任何DDL修改;关于"disable table lock"的论述可以参见Steve Adams的<oracle8i internal services一书。 我在这里再列出几种可能的原因,权作抛砖引玉: 1. 事务中包括远程DML操作,最有可能的一种情况。 2. Remote select statement through dblink can also generate tx lock.远程select也会在本地产生TX锁. 3. 事务中使用savepoint :

SQL> drop table tv;

表已删除。

SQL> create table tv (t1 int);

表已创建。

SQL> savepoint a;

保存点已创建。

SQL> insert into tv values(1);

已创建 1 行。

SQL> rollback to a;

回退已完成。
SQL> select sid,type,lmode from v$lock where sid=(select distinct sid from v$my
tat) and type in ('TM','TX');

       SID TY      LMODE
---------- -- ----------
       125 TX          6
SQL> commit;

提交完成。
SQL> select sid,type,lmode from v$lock where sid=(select distinct sid from v$mys
tat) and type in ('TM','TX');

未选定行
4.使用dbms_transaction包的相关函数,如:
SQL> select sid,type,lmode from v$lock where sid =(select distinct sid from v$mystat) and type in ('TX','TM');
no rows selected
SQL> exec dbms_output.put_line( dbms_transaction.local_transaction_id(true) );

PL/SQL procedure successfully completed.

SQL> select sid,type,lmode from v$lock where sid =(select distinct sid from v$mystat) and type in ('TX','TM');

       SID TY      LMODE
---------- -- ----------
       159 TX          6
5. 事务中所涉及到的表启用了"disable table lock",如:
SQL> desc apps.tv;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 T1                                                 NUMBER(38)

SQL> alter table apps.tv disable table lock;

Table altered.

SQL> insert into apps.tv values(2);

1 row created.

SQL> select sid,type,lmode from v$lock where sid =(select distinct sid from v$mystat) and type in ('TX','TM');

       SID TY      LMODE
---------- -- ----------
       159 TX          6
亦或者DML_LOCKS设置为0(DML_LOCKS参数设置为0,在9i以上版本会引起诸多问题,一般仅在测试或研究时修改该参数).

以下列出Metalink上,关于介绍如何troubleshooting 分布式事务的文档:

Script to report information about distributed transactions.

Product Name, Product Version Oracle Server, 7.3.x to 11.1 Platform Platform Independent Date Created 12-OCT-1999

Instructions

Execution Environment: SQL, SQL*Plus

Access Privileges: Must be run by SYS , or a user with privileges to select from x$k2gte , x$ktcxb , x$ksuse , and v$session_wait .

Usage: sqlplus /nolog SQL> connect sys/ SQL> @distri SQL> @distri_details

Instructions:

Copy the first query into a file named distri.sql. Execute the script from sqlplus connected to sys. If further information needs to be collected then copy the second query to a file named distri_details.sql and run it while connected as sys.

PROOFREAD THIS SCRIPT BEFORE USING IT! Due to differences in the way text editors, e-mail packages, and operating systems handle text formatting (spaces, tabs, and carriage returns), this script may not be in an executable state when you first receive it. Check over the script to ensure that errors of this type are corrected.

Description

This script includes two queries to show information about active distributed transactions. The structure of x$k2gte is slightly modified with Oracle8, so Oracle7 users should use the commented lines of the queries.

o First Query : distri.sql Is intended to show , for each active distributed transaction :

GTXID = Global Transaction ID LSESSION= Local Session , this is the session in your local database (ie: the database where you are connected and running this script) S = Status of the LSESSION, it has 1 letter with this meaning :

First ----------------- I (inactive) A (active) C (cached) S (sniped) K (killed)

WAITING = what LSESSION is waiting for

ORIGIN = Machine-PID , Machine where the Client Tool is running, PID is the Operating System Process Id of Client Process

You would want to run this SELECT to have a quick look at the active distributed transactions.

o Second Query : distri_details.sql Is intended to show more details about the active distributed transactions. See the "Sample Output" below to get details.

You would want to run this SELECT when you need to see all the information about a particular distributed transaction .

References

Note:62354.1 TX Transaction locks - Example wait scenarios

Script

REM distri.sql column origin format a13 column GTXID format a35 column LSESSION format a10 column s format a1 column waiting format a15 Select /*+ ORDERED */ substr(s.ksusemnm,1,10)||'-'|| substr(s.ksusepid,1,10) "ORIGIN", substr(g.K2GTITID_ORA,1,35) "GTXID", substr(s.indx,1,4)||'.'|| substr(s.ksuseser,1,5) "LSESSION" , substr(decode(bitand(ksuseidl,11), 1,'ACTIVE', 0, decode(bitand(ksuseflg,4096),0,'INACTIVE','CACHED'), 2,'SNIPED', 3,'SNIPED', 'KILLED'),1,1) "S", substr(event,1,10) "WAITING" from x$k2gte g, x$ktcxb t, x$ksuse s, v$session_wait w -- where g.K2GTeXCB =t.ktcxbxba <= use this if running in Oracle7 where g.K2GTDXCB =t.ktcxbxba -- comment out if running in Oracle8 or later and g.K2GTDSES=t.ktcxbses and s.addr=g.K2GTDSES and w.sid=s.indx;

REM distri_details.sql set headin off select /*+ ORDERED */ '----------------------------------------'||' Curent Time : '|| substr(to_char(sysdate,'dd-Mon-YYYY HH24.MI.SS'),1,22) ||' '||'GTXID='||substr(g.K2GTITID_EXT,1,10) ||' '||'Ascii GTXID='||g.K2GTITID_ORA ||' '||'Branch= '||g.K2GTIBID ||' Client Process ID is '|| substr(s.ksusepid,1,10)||' running in machine : '||substr(s.ksusemnm,1,80)||' Local TX Id ='||substr(t.KXIDUSN||'.'||t.kXIDSLT||'.'||t.kXIDSQN,1,10) ||' Local Session SID.SERIAL ='||substr(s.indx,1,4)||'.'|| s.ksuseser ||' is : '||decode(bitand(ksuseidl,11),1,'ACTIVE',0, decode(bitand(ksuseflg,4096),0,'INACTIVE','CACHED'), 2,'SNIPED',3,'SNIPED', 'KILLED') || ' and '|| substr(STATE,1,9)|| ' since '|| to_char(SECONDS_IN_WAIT,'9999')||' seconds' ||' Wait Event is :'||' '|| substr(event,1,30)||' '||p1text||'='||p1 ||','||p2text||'='||p2 ||','||p3text||'='||p3 ||' Waited '||to_char(SEQ#,'99999')||' times '||' Server for this session:' ||decode(s.ksspatyp,1,'Dedicated Server', 2,'Shared Server',3, 'PSE','None') "Server" from x$k2gte g, x$ktcxb t, x$ksuse s, v$session_wait w -- where g.K2GTeXCB =t.ktcxbxba <= use this if running Oracle7 where g.K2GTDXCB =t.ktcxbxba -- comment out if running Oracle8 or later and g.K2GTDSES=t.ktcxbses and s.addr=g.K2GTDSES and w.sid=s.indx; set headin on -- end script

Sample Output

For all the samples, we have 2 machines :

esibm1 with a database V73_0.WORLD and esosf2 with a database V734.WORLD

In esibm1 we have a public database link V734 using 'V734.WORLD'; and in esosf2 we have a public database link V73_0 using 'V73_0.WORLD';

Sample-1 : ~~~~~~~~~~

-in esibm1: sqlplus scott/tiger

select * from dual@V734 for update ;

-in esibm1: sqlplus sys/manager @distri

ORIGIN

GTXID

LSESSION

S

WAITING

esibm1-23658

V73_0.WORLD.ea8e383e.2.45.4446

9.267

I

SQL*Net-m

ORIGIN= esibm1-23658 , this means the Client - sqlplus in this case - is running in machine esibm1 and it is the process with PID= 23658

GTXID = V73_0.WORLD.ea8e383e.2.45.4446 is the Global Transaction Identifier, it identifies the database where the distributed transaction started, it is the database where the Client is directly connected. V73_0 = db_name WORLD = db_domain ea8e383e = reverse Db Id ( DataBase ID, it is calculated when you create ^^^^^^^^ the database, you can see this DB Id in a dump of Control File, for example, for V73_0 it is :

DUMP OF CONTROL FILES, Seq # 7205 = 0x1c25 FILE HEADER: Software vsn=120586240=0x7300000, Compatibility Vsn=120586240=0x7300000 Db Id=3817072814=0xe383e8ae, Db Name='V73_0' ^^^^^^^^^^ 2.45.4446 = Local Transaction ID in esibm1 , This session ( LSESSION) will keep an eXclusive lock on a local enqueue "TX-2.45-4446" See Note-62354.1

LSESSION = 9.267 , this is the V$SESSION.ID and V$SESSION.SERIAL# of the session you are using in V73_0 database in esibm1. ( you can see all session details in esibm1 with : select * from v$session where sid=9 and serial#=267 ; )

S = I , this is the State, it is I for Inactive .

WAITING , this is what this LSESSION is waiting for, in this case it is waiting for 'SQL*Net message from client' , it is the standard wait when we are waiting for Client to give us work to do .

-in esosf2 : sqlplus sys/manager @distri

ORIGIN

GTID

LSESSION

S

WAITING

esibm1-23658

V73_0.WORLD.ea8e383e.2.45.4446

11.1013

I

SQL*Net m

LSESSION = 11.1013 , this is the V$SESSION.ID and V$SESSION.SERIAL# of the session you are using in V734 database in esosf2. ( you can see all session details with select * from v$session where sid=11 and serial#=1013 ; )

Sample-2 ~~~~~~~~~ -in esosf2 : sqlplus scott/tiger select * from dept for update ;

-in esibm1 : sqlplus scott/tiger select * from dept@V734 for update . In this case, the distributed transaction will have to wait because it tries to lock dept's rows which are locked by other transaction. We use the SELECT distri_details.sql to show what happens :

- in esibm1 : sqlplus sys/manager@distri_details

This shows the session in the database where the Client is directly connected, it is using a dblink, and it is waiting a message from dblink.

---------------------------------------- Curent Time : 06-Jun-2000 12.50.34 GTXID=5637335F30 Ascii GTXID=V73_0.WORLD.ea8e383e.2.21.4446 Branch= 0000 Client Process ID is 23658 running in machine : esibm1 Local TX Id =2.21.4446 Local Session SID.SERIAL =9.267 is : ACTIVE and WAITING since 0 seconds Wait Event is : SQL*Net message from dblink driver id=1446458164,#bytes=1,=0 Waited 207 times

Server for this session:Dedicated Server

- in esosf2 : sqlplus sys/manager @distri_details

This shows the session in the remote database, it is waiting to lock dept's rows ( waiting for an TX enqueue , see Note:62354.1 )

---------------------------------------- Curent Time : 06-Jun-2000 13.09.38 GTXID=5637335F30 Ascii GTXID=V73_0.WORLD.ea8e383e.2.21.4446 Branch= 020015005E1100000104 Client Process ID is 23658 running in machine : esibm1 Local TX Id =0.0.0 Local Session SID.SERIAL =11.1013 is : ACTIVE and WAITING since 6 seconds Wait Event is : enqueue name|mode=1415053318,id1=262158,id2=2611 Waited 122 times

Server for this session:Shared Server

Distributed Database, Transactions and Two Phase Commit [ID 13229.1]

What is the Distributed Database Option? ---------------------------------------- A distributed system is one in which both data and transaction processing are divided between one or more computers connected by a network, each computer playing a specific role in the system. This configuration has multiple databases, each of which is accessed directly by a single server and can be accessed indirectly by other instances through server/server cooperation. Distributed systems allow you to have data physically located at several sites, and each site can transparently access all of the data. Each node can be used for database processing, but the data is permanently partitioned among the nodes. Several smaller server machines can be cheaper and more flexible than one large, centrally located server. The key goals of a distributed database system are availability, accuracy, concurrency, and recoverability. The Client-Server Model and Distributed Systems ----------------------------------------------- The client-server model is basic to distributed systems. It is a response to the limitations presented by the traditional mainframe client-host model, in which a single mainframe provides shared data access to many dumb terminals. The client-server model is also a response to the local area network (LAN) model, in which many isolated systems access a file server that provides no processing power. Client-server architecture provides integration of data and services and allows clients to be isolated from inherent complexities, such as communication protocols. The simplicity of the client-server architecture allows clients to make requests that are routed to the appropriate server. These requests are made in the form of transactions. Client transactions are often SQL or PL/SQL procedures and functions that access individual databases and services. Distributed Database Characteristics ------------------------------------ This article describes the twelve specifications for the ideal distributed database management system and how ORACLE conforms to these specifications. Oracle's distributed architecture, comprising SQL*Net, Open Gateway and the Oracle Server, provides an effective solution to the challenge of sharing data in a networked environment. The Oracle Server's distributed architecture provides effective data sharing in a networked environment using both client-server and distributed database architectures. In a client-server environment, communication takes place between two processes that reside on different machines. The client executes the application or application tool and sends requests to the server for data. The received data is processed at the client machine. This is known as distributed processing. The ideal distributed system should look like a non-distributed system. Twelve specifications for the ideal distributed database were developed by C.J. Date. The Oracle Server supports most of the ideal distributed features. 1. Site Autonomy Site autonomy means that each server participating in a distributed database is administered independently from all other databases. The data is owned and managed locally. Local operations remain purely local. One site (node) in the distributed system does not depend on another site to function successfully. 2. No reliance on a central site All sites are treated as equals. Each site has its own data dictionary. 3. Continuous Operation Incorporating a new site has no effect on existing applications and does not disrupt service. 4. Location Independence Users can retrieve and update data independent of the site. 5. Fragmentation Independence Users can store parts of a table at different locations. Both horizontal and vertical partitioning of data is possible. 6. Replication Independence Stored copies of data can be located at multiple sites. Read-only snapshots and updatable snapshots provide read-only and updatable copies of tables, respectively. Symmetric Replication using triggers make readable and writable replication possible. 7. Distributed Query Processing Users can query a database residing on another node. The query is executed at the node where the data is located. 8. Distributed Transaction Management A transaction can update, insert or delete data from multiple databases. The two-phase commit mechanism in Oracle ensures the integrity of distributed transactions. Row level locking ensures a high level of data concurrency. 9. Hardware Independence Oracle runs on all major hardware platforms. 10. Operating System Independence A specific operating system is not required. Oracle runs under a variety of operating systems. 11. Network Independence The Oracle Server's SQL*Net supports most popular networking software. Network independence allows communication across homogeneous and heterogenous networks. Oracle's MultiProtocol Interchange enables applications to communicate with databases across multiple network protocols. 12. DBMS Independence DBMS Independence is the ability to integrate different databases. Open Gateway supports connections to non-Oracle databases. 13. Distributed Database Security The database supports all of the security features that are available with a non-distributed database environment for distributed database systems, including: Password authentication for users and roles Some types of external authentication for users and roles including: Kerberos version 5 for connected user links DCE for connected user links DISTRIBURTED TRANSACTIONS AND THE TWO PHASE COMMIT ================================================== Two phase commit only comes in play during a commit of a distributed transaction. The whole purpose is to maintain the integrity of the "global" database. In other words, two phase commit guarantees that everything will either commit or rollback. TRANSACTION TYPES: LOCAL TRANSACTION contains ONLY statements on the local node. REMOTE TRANSACTION contains one or more statements which ALL reference the same remote node. DISTRIBUTED TRANSACTION contains statements that modify data in two or more distinct nodes. * The only place where 2-PHASE COMMIT comes into play. TERMS: CLIENTS are nodes that references information from another database (C) server in a distributed transaction. SERVERS are nodes that are directly referenced in a distributed (S) transaction, or is requested to participate in a transaction because another node requires data from it. GLOBAL COORDINATOR is the node in which the distributed transaction (GC) originates. LOCAL COORDINATOR is the node that references data on other nodes to (LC) complete its part in the distributed transaction. COMMIT POINT SITE is the site with the highest commit point strength (CPS) "init.ora" parameter. It is usually the most critical site that can not afford collisions in case of an in-doubt transaction. SCN is the system commit number. SCN is essentially an internal database clock. This is a monotonically increasing an unique number for each transaction. COMMIT_POINT_STRENGTH is the init.ora parameter that determines the (CPstr) COMMIT POINT SITE. When you attempt to commit a distributed transaction, you will enter ORACLE'S TWO PHASE COMMIT MECHANISM. TWO-PHASE COMMIT: PREPARE PHASE: 1) Commit point site is determined. 2) Global coordinator asks all participating nodes (except commit point site) to promise to COMMIT or ROLLBACK the transaction regardless of failure). This information is propagated by the local coordinators. The servers have to be prepared before the local or global coordinators (except the commit point site). The local coordinator is responsible for asking dependant nodes to prepare. POSSIBLE RESPONSES FROM NODES: * PREPARED * ABORT * READ-ONLY NODES Locks obtained during the distributed transaction will continue to be held. Redo is flushed to the local redo logs. 3) Each node will pass back the SCN for his node. 4) Global Coordinator determines the max SCN. After all the nodes have prepared successfully, we enter the commit phase. All transactions except those found in the commit point site are "in-doubt" until the commit point phase completes successfully. COMMIT PHASE: 1) Global coordinator sends the max SCN to the commit point site and asks it to commit. 2) Commit Point Site will try to commit or everything is rolled back. The locks are released in the commit point site first. 3) If committed/rolled back, the Commit Point Site will inform the Global Coordinator which will commit/rolled back at that time. 4) The information will propogate down to its clients/local coordinators and they will commit/roll back and propagate the information down to their servers until there are no more servers. (note: READ ONLY nodes do not participate in 2-phase commit.) EXAMPLE: UPDATE EMP SET SAL= SAL * 1.10 WHERE DEPTNO=10; UPDATE EMP@HAWAII SET SAL = SAL*1.20 WHERE DEPNO=20; BEFORE UPDATE TRIGGER Fires and updates dept@newyork. another trigger fires and inserts dept_audit@paranoid. after update trigger fires and inserts into the global audit table, emp_audit@headquarters INSERT INTO VACATION_TIME SELECT * FROM DAYS_OFF@HOME COMMIT; (TWO-PHASE COMMIT BEGINS HERE) _______________ | | select days_off | HOME | SERVER /*READ-ONLY*/ |_____________| SCN=20000 | CPstr=250 | _______________ | | GC/LC/CLIENT update emp | LOCAL | SCN=100 |_____________| CPstr=125 / \ / \ ____________ _____________ update emp | | | | insert emp_audit SERVER/LC/CLIENT | HAWAII | | HQ | SERVER SCN=250 |___________| |____________| SCN =1000 CPstr=95 / CPstr=10 / / ------------ | | inserts dept_audit | PARANOID | SERVER |__________| SCN=50 CPstr=205 PREPARE PHASE: 1) COMMIT POINT SITE IS PARANOID The global coordinator will already know what the commit point strength of each node prior to the commit. Read-only nodes are not included. 2) All nodes except for PARANOID is asked to prepare. 3) HAWAII, the local coordinator, is responsible to ask her dependent nodes to prepare before she prepares. In this case, PARANOID is a commit point site; thus, it is ignored. 4) The highest SCN is sent to LOCAL node via the local coordinators. The highest SCN is 1000. 5) All nodes which PREPARED will flush entries of the transaction to the redo logs if not already done. If any of the nodes send an "ABORT" message back, then the transaction is rolled back at this time. Any failure after the PREPARE phase will result with "in-doubt" transactions. COMMIT PHASE: 1) PARANOID IS ASKED TO COMMIT OR ROLLBACK BY THE LOCAL (GC). 2) PARANOID commits at a SCN greater than 1000. a) Redo is flushed. b) Locks are released. c) outcome is relayed back to the LOCAL node (GC). Assume success: 3) AFter receiving the information, GC will commit at the same SCN and pass the information to its dependents. a) commit flushed to redo logs. b) data locks are released. c) GC will pass the information to HAWAII and HQ. (1) They, in turn, will commit and HAWAII will pass the information to PARANOID. If all is successful, every statement will commit with the same SCN and then RECO will delete the entries from "dba_2pc_pending" and "dba_2pc_neighbors" tables. Afterwards, the nodes will "forget" the transaction. Forget Phase 1) After the participating nodes notify the commit point site that they have committed, the commit point site can forget about the transaction. The following steps occur: 2) After receiving notice from the global coordinator that all nodes have committed, the commit point site erases status information about this transaction. 3)The commit point site informs the global coordinator that it has erased the status information. 4)The global coordinator erases its own information about the transaction. TWO-PHASE COMMIT QUIZ/ANSWERS ============================= 1) What is the difference between remote transaction and distributed transaction? REMOTE TRANSACTION contains one or more statements which ALL reference the same remote node. DISTRIBUTED TRANSACTION contains statements that modify data in two or more distinct nodes. * The only place where 2-PHASE COMMIT comes into play. 2) When does two-phase commit come in play? Two phase commit only comes in play during a commit of a distributed transaction. The whole purpose is to maintain the integrity of the "global" database. In other words, two phase commit guarantees that everything will either commit or rollback. 3) Define distributed database. An environment that includes multiple servers where users manipulate data as if there is one "global database". With the widening use of heterogeneous hardware environments and multiple database servers, it has become essential to maintain the integrity of this "global database". Of course, the distributed concept is usually transparent to the end user and the application programmers. Another defintion could be: A distributed database is a database that is not stored in its entirety at a single physical location. Rather, a distributed database is a database that is stored across a network of locations that are connected via communication links. A distributed database consists of a collection of sites or nodes connected together into a communication network. 4) When is a transaction considered "in-doubt"? After all the nodes have prepared successfully, we enter the commit phase. All transactions except those found in the commit point site are "in-doubt" until the commit point phase completes successfully. 5) Define the following terms: CLIENTS, DATABASE SERVERS, GLOBAL COORDINATOR, LOCAL COORDINATOR, COMMIT POINT SITE CLIENTS are nodes that references information from another database (C) server in a distributed transaction. SERVERS are nodes that are directly referenced in a distributed (S) transaction, or is requested to participate in a transaction because another node requires data from it. GLOBAL COORDINATOR is the node in which the distributed transaction (GC) originates. LOCAL COORDINATOR is the node that references data on other nodes to (LC) complete its part in the distributed transaction. COMMIT POINT SITE is the site with the highest commit point strength (CPS) init.ora parameter. It is usually the most critical site that can not afford collisions in case of an in-doubt transaction. SCN is the system commit number. SCN is essentially an internal database clock. This is a monotonically increasing an unique number for each transaction. COMMIT_POINT_STRENGTH is the init.ora parameter that determines the (CPstr) COMMIT POINT SITE. 6) Can the global coordinator be the commit point site as well? Yes, the only prerequisites are that the node is part of the distributed transaction (not read-only) and it has the highest commit point strength parameter. 7) What distinguishes the commit point site? COMMIT POINT SITE is the site with the highest commit point strength (CPS) "init.ora" parameter. It is usually the most critical site that can not afford collisions in case of an in-doubt transaction. 8) What does RECO do? RECO PROCESS * gets information from the "DBA_2PC_PENDING" and "DBA_2PC_NEIGHBORS" views. * executes as the global or local coordinator * tries to communicate wit other nodes in the in-doubt transaction If it cannot connect, it will continue to try at exponential intervals. * resolves in-doubt transactions if the connection is up. * uses the same DBLINK as the transaction * removes resolved transactions from the pending transaction table. 9) What happens during the PREPARE phase? Please be as detailed as possible? PREPARE PHASE: 1) Commit point site is determined. 2) Global coordinator asks all participating nodes (except commit point site) to promise to COMMIT or ROLLBACK the transaction regardless of failure). This information is propagated by the local coordinators. The servers have to be prepared before the local or global coordinators (except the commit point site). The local coordinator is responsible for asking dependant nodes to prepare. POSSIBLE RESPONSES FROM NODES: * PREPARED * ABORT * READ-ONLY NODES Locks obtained during the distributed transaction will continue to be held. Redo is flushed to the local redo logs. 3) Each node will pass back the SCN for his node. 4) Global Coordinator determines the max SCN. After all the nodes have prepared successfully, we enter the commit phase. All transactions except those found in the commit point site are "in-doubt" until the commit point phase completes successfully. 10) What happens during the COMMIT phase? Please be as detailed as possible? COMMIT PHASE: 1) Global coordinator sends the max SCN to the commit point site and asks it to commit. 2) Commit Point Site will try to commit or everything is rolled back. The locks are released in the commit point site first. 3) If committed/rolled back, the Commit Point Site will inform the Global Coordinator which will commit/rolled back at that time. 4) The information will propogate down to its clients/local coordinators and they will commit/roll back and propagate the information down to their servers until there are no more servers. (NOTE: READ ONLY nodes do not participate in 2-phase commit.) 11) What is SCN and how is it significant in two-phase commit? SCN is the system commit number. SCN is essentially an internal database clock. This is a monotonically increasing an unique number for each transaction. The entire distributed transaction will be committed at the same SCN. This will allow some type of consistency during distributed recovery. 12) Which two views are helpful during MANUAL distributed recovery? They are "dba_2pc_pending" and "dba_2pc_neighbors". 13) When does RECO remove the entries from those views? If all is successful, every statement will commit with the same SCN and then RECO will delete the entries from "dba_2pc_pending" and "dba_2pc_neighbors" tables. Afterwards, the nodes will "forget" the transaction. 14) List some cases where you may do MANUAL RECOVERY? A dba may do some manual recovery if there was a network or system or database crash and the "in-doubt" transactions are holding locks that are crucial to other applications. 15) How should you pick your COMMIT POINT SITE? COMMIT POINT SITE is the site with the highest commit point strength (CPS) "init.ora" parameter. It is usually the most critical site that can not afford collisions in case of a doubted transaction. You need to coordinate with the other dba adminstrators to make that decision. Use this command to wake RECO up after that:

How to Troubleshoot Distributed Transactions [ID 100664.1]

Applies to: Oracle Server - Enterprise Edition - Version: 8.1.5.0 to 10.2.0.1 Information in this document applies to any platform. Checked for relevance on 13-June-2008 by Faye Todd. Appearance updated, no changes to technical content 19-Feb-2007 Purpose You need to resolve a distributed transaction error because of errors received. But before you try to implement any other steps, please diagnose whether it is or it is not a REAL distributed transaction. Last Review Date June 13, 2008 Instructions for the Reader A Troubleshooting Guide is provided to assist in debugging a specific issue. When possible, diagnostic tools are included in the document to assist in troubleshooting. Troubleshooting Details Steps to Troubleshoot Distributed Transactions 1. Check the alert.log for errors, like: 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. Make sure that the network is up and all db_links are valid and operational. V$DBLINK AND GV$DBLINK show the db_links currently used by distributed transactions: SVRMGR> desc v$dblink Column Name Null? Type ------------------------------ -------- ---- DB_LINK VARCHAR2(128) OWNER_ID NUMBER LOGGED_ON VARCHAR2(3) HETEROGENEOUS VARCHAR2(3) PROTOCOL VARCHAR2(6) OPEN_CURSORS NUMBER IN_TRANSACTION VARCHAR2(3) UPDATE_SENT VARCHAR2(3) COMMIT_POINT_STRENGTH NUMBER SVRMGR> desc gv$dblink Column Name Null? Type ------------------------------ -------- ---- INST_ID NUMBER DB_LINK VARCHAR2(128) OWNER_ID NUMBER LOGGED_ON VARCHAR2(3) HETEROGENEOUS VARCHAR2(3) PROTOCOL VARCHAR2(6) OPEN_CURSORS NUMBER IN_TRANSACTION VARCHAR2(3) UPDATE_SENT VARCHAR2(3) COMMIT_POINT_STRENGTH NUMBER 3. Run the following query against DBA_2PC_PENDING: SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID, STATE, MIXED, HOST, COMMIT# FROM DBA_2PC_PENDING WHERE LOCAL_TRAN_ID = '??.'; [Insert code here LOCAL_TRAN_ID is the Local transactionID (number that is given when error is reported). If LOCAL_TRAN_ID = GLOBAL_TRAN_ID, it means that this site is the Global Coordinator, i.e. where the transaction originated from. You can also get LOCAL_TRAN_ID from the alert.log. 4. Run the following query against DBA_2PC_NEIGHBORS view on all Nodes: SELECT LOCAL_TRAN_ID, IN_OUT, DATABASE, INTERFACE FROM DBA_2PC_NEIGHBORS; 5. Get the values for COMMIT_POINT_STRENGTH init.ora parameter on all Nodes. If you are not aware of what other Nodes are participating in the distributed transaction, query the DBA_2PC_NEIGHBORS view. The Node with COMMIT_POINT_STRENGTH that has highest value in init.ora has to commit first. 6. Check the STATE column from DBA_2PC_PENDING. If STATE column states COMMIT, it means the local database has successfully committed. This also means you most likely do not have to force anything on that Node. Or if other Nodes have not committed and this particular Node happens to be a Global Coordinator - you need to note COMMIT# i.e. SCN number from DBA_2PC_PENDING view, as this is THE SCN# you will need to use if you need to perform COMMIT FORCE. 7. Take the GLOBAL_TRAN_ID and COMMIT# (SCN number from DBA_2PC_PENDING) and compare it to the value on the other nodes. On Nodes where there are no entries for this COMMIT# and transactionID in DBA_2PC_PENDING, RECO process has resolved the problem and we don't have to do anything. Note: RECO is always automatically started whenever Distributed Transactions are enabled. If you issue a UNIX command : ps - ef | grep -i reco and see RECO running, distributed transactions are correctly enabled. If you combine this output with values of the init.ora parameter DISTRIBUTED_TRANSACTONS (which should be higher than 0 for distributed environment), you may safely say that the customer is running in a distributed environment even if this particular customer has not set it up. 8. If the STATE (from DBA_2PC_PENDING view) is PREPARED, then this Node has not completed the transaction. Take GLOBAL_TRAN_ID (from DBA_2PC_PENDING) and COMMIT# (SCN number) and compare it to the value on the other nodes. You need to also check DBA_2PC_NEIGHBORS and see whether there are any other Nodes that reference the same transactionID in their DBA_2PC_PENDING. If you see it referenced, it means there are children and they need to be resolved (either committed or rollback) as well. Please take 'children' i.e. Nodes that other Nodes (not Global Coordinator) into account. Note: for clarification on terminology please see Note 13229.1 9. If there are no children, it is safe to manually interfere and either commit force or rollback force. For global integrity, use the same COMMIT# (SCN) when you force the transaction. To force the transaction please see SYNTAX NOTES below. 10. After the transaction is forced, make sure that both DBA_2PC_PENDING and DBA_2PC_NEIGHBORS data dictionary views are empty. If for some reason it is necessary to clean those views, use packaged procedure DBMS_TRANSACTION.purge_lost_db_entry. Note 1012842.102 ORA-2019 ORA-2058 ORA-2068 ORA-2050: FAILED DISTRIBUTED TRANSACTIONS _$#$_ Note: Be very careful with this procedure as it is always more reliable and more consistent to let RECO resolve distributed transaction conflicts. Please attempt to use DBMS_TRANSACTION.purge_lost_db_entry only as a last resort after every other measure was implemented including restarting the database to resolve the locking conflict. 11. If even then there are entries in the views and errors still appear, please check for Bug 684157. This is fixed in 8.0.6 and higher. Syntax Notes COMMIT FORCE command Example of syntax where highest committed SCN is 88123887 (from dba_2pc_pending) and local transaction ID is 1.13.5197 (from either dba_2pc_pending or alert.log): SVRMGR> COMMIT FORCE 'your local transactionID on this node', 'highest SCN from already committed site'; SVRMGR> COMMIT FORCE '1.13.5197', '88123887'; ROLLBACK FORCE command Example of syntax where local transactionID is 1.13.5197 (from either dba_2pc_pending or alert.log): SVRMGR> ROLLBACK FORCE 'your local transactionID on this node'; SVRMGR> ROLLBACK FORCE '1.13.5197'; PURGING VIEWS: * Example of syntax for lost local transactionID 1.13.5197 (from either dba_2pc_pending or alert.log). NOTE: Run as SYS where 1.13.5197 is the local_tran_id SVRMGR> Execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY ('1.13.5197'); COMMIT; * Example of syntax for mixed local transaction ID 1.13.5197 (from either dba_2pc_pending or alert.log). Note, Run as SYS: SVRMGR> Execute DBMS_TRANSACTION.PURGE_MIXED ('1.13.5197'); COMMIT; Run PURGE_MIXED Procedure only if significant reconfiguration has occurred so that automatic recover (RECO) cannot resolve the transaction. Example of appropriate cases when it can be used: - Total loss of the remote database, or reconfiguration of software resulting in loss of two-phase commit capability. NOTE: A 'commit;' should be issued after each DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY and DBMS_TRANSACTION.PURGE_MIXED otherwise errors are given. SCN Recovery Steps Complete Recovery: 1. At the down site recover completely if possible (treat as regular recovery). 2. SCN will appear in the alert.log after recover is done on the crashed Node. Incomplete Recovery: 1. If time-based or cancel-based recovery was used on the crashed node, other sites must be placed back to the same point in time for global consistency. Get last SCN from the alert.log of the crashed node. 2. At each node perform a shutdown normal or immediate. 3. Take a cold backup. 4. Restore the control file if necessary. 5. Restore the last backup of all datafiles along with archived redo logs. 6. Choose which tool to use to perform SCN recovery - either Server Manager line mode or RMAN. 7. Connect internal, startup mount, check status from v$datafile to make sure all datafiles are online. Issue 'Alter database datafile '?/?/?' online;', for each datafile with status offline, to bring it online. 8. Issue the following command using the latest SCN from alert.log on the Node that had to be recovered: RECOVER DATABASE UNTIL CHANGE '1.13.5197'; NOTE: If for some reason (e.g.when issuing commit force command) automatic recovery (RECO process) needs to be disabled, use the following command to put RECO to sleep: ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;