如何通过 TCP/IP 执行 Two-Phase 提交事务

两阶段提交(2PC)是主机服务器安装的协议,可确保更新网络上数据库的多个实例成功或全部失败。 主机集成服务器通过 TCP/IP 支持 2PC,使你能够通过 Internet 获得 2PC 连接的安全性。

Host Integration Server 支持 2PC 使用两个组件:Microsoft分布式事务处理协调器(DTC)和事务日志。 DTC 控制正常的 DTC 事务流:登记、准备、提交和中止。 此外,DTC 在发生任何故障或断开连接时处理事务恢复,而事务日志维护恢复时所需的信息日志。

可以通过使用 System.Transactions 命名空间,利用 ADO.NET 和 DB2 的托管提供程序执行 2PC 事务。 当您配置连接属性 "事务单位=DUW" 时,2PC 事务将自动启用。

示例:

下面的代码示例演示如何在 DB2 事务中使用 2PC。

谨慎

此示例或指南引用敏感信息,例如连接字符串或用户名和密码。 切勿在代码中硬编码这些值,并确保使用最安全的身份验证来保护机密数据。 有关详细信息,请参阅以下文档:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Data;  
using System.Transactions;  
using Microsoft.HostIntegration.MsDb2Client;  
  
namespace Db2DistributedTransaction  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Db2Tx();  
        }  
  
        static void Db2Tx()  
        {  
            string connectionStringDb2 = "Password=HISDEMO;User ID=HISDEMO;Initial Catalog=DSN1D037;Data Source=DSN8910;Network Transport Library=TCPIP;Host CCSID=37;PC Code Page=1208;Network Address=123.34.45.57;Network Port=446;Package Collection=HISDEMO;Default Schema=DSN8910;Default Qualifier=DSN8910;Units of Work=DUW;Defer Prepare=True;AutoCommit=False";  
            System.Transactions.CommittableTransaction transaction = new System.Transactions.CommittableTransaction();  
            MsDb2Connection connection = new MsDb2Connection(connectionStringDb2);  
            MsDb2Command command = new MsDb2Command();  
            try  
            {  
                connection.Open();  
                connection.EnlistTransaction(transaction);  
                command.Connection = connection;  
                command.CommandText = "INSERT INTO DSN8910.AREAS (AREAID, AREADESC, REGIONID) VALUES ('11111', 'Area 11111', 111)";  
                command.ExecuteNonQuery();  
                command.CommandText = "INSERT INTO DSN8910.AREAS (AREAID, AREADESC, REGIONID) VALUES ('22222', 'Area 22222', 222)";  
                command.ExecuteNonQuery();  
                while (true)  
                {  
                    Console.Write("Commit or Rollback? [C|R] ");  
                    ConsoleKeyInfo c = Console.ReadKey();  
                    Console.WriteLine();  
                    Console.ReadKey();  
  
                    if ((c.KeyChar == 'C') || (c.KeyChar == 'c'))  
                    {  
                        transaction.Commit();  
                        break;  
                    }  
                    else if ((c.KeyChar == 'R') || (c.KeyChar == 'r'))  
                    {  
                        transaction.Rollback();  
                        break;  
                    }  
                }  
                connection.Close();  
                transaction = null;  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Commit Exception Type: {0}", ex.GetType());  
                Console.WriteLine("  Message: {0}", ex.Message);  
                Console.ReadKey();  
            }  
            Console.WriteLine("Program end.");  
            Console.ReadKey();  
        }  
    }
}

另请参阅

使用 DB2 的托管提供程序