Home   Cover Cover Cover Cover
 

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()); }
            }
        }
    }
}