如何透過 TCP/IP 執行 Two-Phase 認可交易
雙階段認可 (2PC) 是一種主機伺服器安裝的通訊協定,可確保網路上資料庫的多個實例更新會成功或完全失敗。 主機整合伺服器支援透過 TCP/IP 的 2PC,讓您能夠透過網際網路取得 2PC 連線的安全性。
主機整合伺服器支援 2PC 的運作方式有兩個元件:Microsoft 分散式交易協調器 (DTC) 和交易記錄。 DTC 會控管一般 DTC 交易流程:登記、準備、認可和中止。 此外,DTC 會在發生任何失敗或中斷連線時處理事務復原,而交易記錄會維護復原時所需的資訊記錄。
您可以使用 命名空間,搭配 ADO.NET 和 DB2 的 受控提供者 來執行 2PC System.Transactions
交易。 當您設定 Work=DUW 的連接屬性 Units=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();
}
}