CONTENTS Title Page Copyright Page Preface 1 Introduction to Distributed Transactions 1.1 Deciding When to Use Distributed Transactions 1.2 Understanding the Two-Phase Commit Protocol and Distributed Transactions 1.2.1 Terminating Distributed Transactions 1.2.2 Completing Unresolved Transactions 2 How Distributed Transactions Work 2.1 Starting Distributed Transactions 2.2 Completing Successful Distributed Transactions 2.2.1 Executing the Prepare Phase 2.2.2 Executing the Commit Phase 2.3 Understanding the Database Recovery Process 2.4 Completing Unresolved Transactions 3 Designing Databases and Applications for Distributed Transactions 3.1 Designing Databases for Distributed Transactions 3.1.1 Partitioning Databases by Business Function 3.1.2 Partitioning Databases Geographically 3.1.3 Replicating Data 3.1.4 Combining Database Design Strategies 3.2 Granting Privileges for Distributed Transactions 3.3 Using Distributed Transactions in a VAXcluster Environment 3.4 Improving Performance with Distributed Transactions 4 Using SQL with Distributed Transactions 4.1 Using the Two-Phase Commit Protocol with SQL 4.1.1 Disabling the Two-Phase Commit Protocol 4.1.2 Avoiding Deadlock with Distributed Transactions 4.2 Using the Two-Phase Commit Protocol Implicitly 4.3 Using the Two-Phase Commit Protocol Explicitly 4.3.1 Handling Errors in Distributed Transactions 4.3.2 Using Context Structures with SQL Statements 4.3.3 Using Cursors with Distributed Transactions 4.3.4 Using SQL Module Language with Distributed Transactions 4.3.5 Using Precompiled SQL with Distributed Transactions 4.3.5.1 Declaring the Context Structure in Ada 4.4 Compiling, Linking, and Running the Sample Distributed Transaction Application 5 Using RDBPRE with Distributed Transactions 5.1 Using the Two-Phase Commit Protocol with RDBPRE 5.1.1 Avoiding Deadlock with Distributed Transactions 5.2 Using the Two-Phase Commit Protocol Implicitly 5.2.1 Using Existing Applications with Distributed Transactions 5.2.2 Writing New Applications That Implicitly Use the Two-Phase Commit Protocol 5.3 Using the Two-Phase Commit Protocol Explicitly 5.3.1 Handling Errors in Distributed Transactions 5.3.2 Writing Applications That Explicitly Use the Two-Phase Commit Protocol 6 Completing Unresolved Transactions 6.1 Using RMU Commands to Complete Unresolved Transactions 6.2 Completing Unresolved Transactions 6.3 Recovering Corrupted Databases and Completing Unresolved Transactions EXAMPLES 4-1 Writing Host Language Programs That Use Distributed Transactions to Modify Databases 4-2 Writing SQL Modules That Use Distributed Transactions to Modify Databases 4-3 Declaring and Calling SYS$START_TRANS in a Precompiled FORTRAN Program 4-4 Using Precompiled SQL with Distributed Transactions 5-1 Using Existing RDBPRE Applications with Distributed Transactions 5-2 Writing New Applications That Use Distributed Transactions 5-3 Writing RDBPRE Applications That Explicitly Call DECdtm Services FIGURES 1-1 Executing the Two-Phase Commit Protocol 1-2 Participants in a Distributed Transaction 2-1 Starting a Distributed Transaction 2-2 Passing the Distributed Transaction Identifier (TID) 2-3 Initiating the Prepare Phase 2-4 Resource Managers Execute the Prepare Phase 2-5 Voting by Participants in a Distributed Transaction 2-6 Writing the Commit Record 2-7 Initiating the Commit Phase 2-8 Resource Managers Commit the Transaction 2-9 Acknowledging That the Transaction Has Been Committed 2-10 Unresolved Distributed Transaction 3-1 Communication Among Nodes in a Cluster When One Node Manages the Database Lock Tree 3-2 Communication Among Nodes in a Cluster When Each Node Manages One Database Lock Tree 3-3 Using DECdtm Services to Add Databases to Existing Transactions TABLES 1-1 Committing or Rolling Back Distributed Transactions