Two Phase Commit is Oracle's method of
synchronizing two or more databases so that either everything commits or
everything rollsback. One of the controlling parts of this is the
"commit_point_strength" in the init.ora file. The DB with the highest
"commit_point_strength" becomes the "coordinator" of the process irregardless if
the transaction started in that instance.
OR, you've started a distributed transaction & issued the "COMMIT"
statement, what happens:
-
The coordinator gets selected. Assuming all of the
commit_point_strengths are the same the DB with the most changes is suppose to
become the coordinator, don't depend on that though.
-
The coordinator issuse a "prepare to commit" command otherwise known as
"collecting" in DBA_2PC_Pending.
-
If the remote DB has nothing to commit it replies accordingly & is no
longer part of the transaction. This part I know doesn't work consistently.
I've opened a TAR on the subject with OTS & they could not explain it either.
-
DB's that do have changes to make, take out the required locks & do the
other things neccessary to commit a change like normal, but hold at the prepared
point. They then communicate back to the coordinator that they are ready &
promise to do as told.
-
When the coordinator has recieved the promise from all nodes then the
"commit" message is sent and the transaction is complete, for the most part.
There is a final message from each node that signifies that they have in deed
committed the transaction. If that is received then the issue is assumed to be
complete & you get the appriopriate response.
-
Now, If any of these steps fails, that's when the "pending" transaction stuff
shows up in the database and error messages about "remote DB in doubt" start
showing up.
**This information is compiled from the web