Verteilte Transaktion mit CommitableTransaction
Zu Abschnitt 5.3.4 des Buchs
Dieses Beispiel zeigt, wie man eine verteilte Transaktion programmiert.
Es werden Änderungen an den zwei Tabellen Employees und Contact in zwei unterschiedlichen
Datenbanken Northwind und Personal durchgeführt. Mit einem CommitableTransaction -Objekt
wird eine verteilte Transaktion angelegt. Mit EnlistTransaction des SqlConnection -Objekts
wird angegeben, dass die beiden Verbindungen an der Transaktion teilnehmen sollen.
Es erfolgt eine Bestätigung der Änderungen mit Commit oder im Falle einer Ausnahme
ein Zurücknehmen der Änderungen mit Rollback .
5-3-4-CommitableTransactionSample.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;
namespace Chapter5
{
class CommitableTransactionSample
{
static void Main(string[] args)
{
string connStr1 = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Northwind; " +
"Integrated Security=True;";
string connStr2 = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=NETBOOK; " +
"Integrated Security=True;";
SqlConnection con1 = new SqlConnection(connStr1);
SqlConnection con2 = new SqlConnection(connStr2);
CommittableTransaction trans = new CommittableTransaction();
try
{
con1.Open();
con2.Open();
//---- Verbindungen bei verteiltem Transaktionsobjekt eintragen
con1.EnlistTransaction(trans);
con2.EnlistTransaction(trans);
//---- Kommandoobjekt anlegen
IDbCommand cmd1 = con1.CreateCommand();
IDbCommand cmd2 = con2.CreateCommand();
//---- die zwei SQL-Anweisungen in Transaktion ausfuehren
cmd1.CommandText =
"UPDATE Employees SET Extension=777 WHERE LastName = 'King'";
cmd1.ExecuteNonQuery();
cmd2.CommandText = "UPDATE Contact SET Phone=9999 WHERE Name = 'King'";
cmd2.ExecuteNonQuery();
//---- Aenderungen bestaetigen
trans.Commit();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
try
{
// Verbindungen schliessen
con1.Close();
con2.Close();
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
}
}
}
}
|
|