Home   Cover Cover Cover Cover
 

Verteilte Transaktion mit TransactionScope


Zu Abschnitt 5.3.4 des Buchs

Das folgende Beispiel zeigt die Verwendung eines TransactionScope-Objekts zur Abwicklung einer verteilten Transaktion. In einer using-Anweisung wird ein Codeblock mit einem lokalen TransactionScope-Objekt angelegt. Innerhalb dieses Codeblocks werden alle Datenbankanweisungen als Transaktion ausgeführt. Am Ende des Blocks erfolgt die Bestätigung durch Complete. Im Falle einer Ausnahme wird der Block ohne Aufruf von Complete verlassen und alle Änderungen werden zurückgenommen.

5-3-4-TransactionScopeSample.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;

namespace Chapter5
{

    class TransactionScopeSample
    {
        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 = null;
            SqlConnection con2 = null;
            try
            {
                using (TransactionScope transScope =
                            new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    // Verbindungen anlegen und oeffnen
                    con1 = new SqlConnection(connStr1);
                    con2 = new SqlConnection(connStr2);
                    con1.Open();
                    con2.Open();
                    //----- Extension in Employees aendern 
                    IDbCommand cmd1 = con1.CreateCommand();
                    cmd1.CommandText = "UPDATE Employees SET Extension=1234 WHERE LastName = 'King'";
                    cmd1.ExecuteNonQuery();
                    //----- Phone in Contact aendern 
                    IDbCommand cmd2 = con2.CreateCommand();
                    cmd2.CommandText = "UPDATE Contact SET Phone=1234 WHERE Name = 'King'";
                    cmd2.ExecuteNonQuery();

                    // Aenderungen bestaetigen
                    transScope.Complete();
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                try
                {
                    // Verbindungen schliessen
                    con1.Close();
                    con2.Close();
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
            }
        }
    }
}