Yerel İşlemler

ADO.NET içindeki işlemler, birden çok görevi tek bir iş birimi olarak yürütecek şekilde birbirine bağlamak istediğinizde kullanılır. Örneğin, bir uygulama iki görevleri gerçekleştirir düşünün. İlk olarak, bir tabloyu sipariş bilgileriyle güncelleştirir. İkincisi, stok bilgilerini içeren bir tabloyu güncelleştirir ve sipariş edilen maddelerin borçlarını alır. Görevlerden biri başarısız olursa, her iki güncelleştirme de geri alınır.

İşlem Türünü Belirleme

Bir işlem, tek aşamalı bir işlem olduğunda ve doğrudan veritabanı tarafından işlendiğinde yerel bir işlem olarak kabul edilir. İşlem, bir işlem izleyicisi tarafından eşgüdümlü olduğunda dağıtılmış bir işlem olarak kabul edilir ve işlem çözümlemesi için başarısız güvenli mekanizmalar (iki aşamalı işleme gibi) kullanır.

.NET Framework veri sağlayıcılarının her birinin yerel işlemleri gerçekleştirmek için kendi Transaction nesnesi vardır. SQL Server veritabanında bir işlemin gerçekleştirilmesini istiyorsanız, bir System.Data.SqlClient işlem seçin. Oracle işlemi için sağlayıcıyı System.Data.OracleClient kullanın. Ayrıca, işlem gerektiren sağlayıcıdan bağımsız kod yazmak için kullanılabilen bir DbTransaction sınıf vardır.

Not

İşlemler, sunucuda gerçekleştirildiğinde en verimli şekilde gerçekleştirilir. Açık işlemleri kapsamlı bir şekilde kullanan bir SQL Server veritabanıyla çalışıyorsanız, Transact-SQL BEGIN TRANSACTION deyimini kullanarak bunları saklı yordamlar olarak yazmayı göz önünde bulundurun.

Tek bir Bağlan Kullanarak İşlem Gerçekleştirme

ADO.NET içinde, nesneyle Connection işlemleri denetlersiniz. yöntemiyle BeginTransaction yerel bir işlem başlatabilirsiniz. Bir işlem başladıktan sonra, bir nesnenin Transaction özelliğiyle bu işlemde bir Command komut kaydedebilirsiniz. Ardından, işlemin bileşenlerinin başarısına veya başarısızlığına bağlı olarak veri kaynağında yapılan değişiklikleri işleyebilir veya geri alabilirsiniz.

Not

EnlistDistributedTransaction yöntemi yerel bir işlem için kullanılmamalıdır.

İşlemin kapsamı bağlantıyla sınırlıdır. Aşağıdaki örnek, bloktaki try iki ayrı komutlardan oluşan açık bir işlem gerçekleştirir. Komutlar, AdventureWorks SQL Server örnek veritabanındaki Production.ScrapReason tablosuna karşı INSERT deyimlerini yürütür ve özel durum oluşturmazsa işlenir. Bir özel durum oluşturulursa bloktaki catch kod işlemi geri alır. İşlem durdurulduysa veya işlem tamamlanmadan bağlantı kapatılırsa, otomatik olarak geri alınır.

Örnek

İşlem gerçekleştirmek için bu adımları izleyin.

  1. İşlemin BeginTransaction başlangıcını SqlConnection işaretlemek için nesnesinin yöntemini çağırın. yöntemi, BeginTransaction işleme bir başvuru döndürür. Bu başvuru, işlemde yer alan SqlCommand nesnelere atanır.

  2. Transaction nesnesini Transaction yürütülecek öğesinin SqlCommand özelliğine atayın. Etkin bir işlemle bağlantıda bir komut yürütülürse ve Transaction nesne nesnenin TransactionCommand özelliğine atanmamışsa, bir özel durum oluşturulur.

  3. Gerekli komutları yürütür.

  4. Commit İşlemi tamamlamak için nesnesinin SqlTransaction yöntemini çağırın veya işlemi sonlandırmak için yöntemini çağırınRollback. Ya da yöntemleri yürütülmeden önce CommitRollback bağlantı kapatılır veya atılırsa, işlem geri alınır.

Aşağıdaki kod örneği, Microsoft SQL Server ile ADO.NET kullanan işlem mantığını gösterir.

using (SqlConnection connection = new(connectionString))
{
    connection.Open();

    // Start a local transaction.
    SqlTransaction sqlTran = connection.BeginTransaction();

    // Enlist a command in the current transaction.
    SqlCommand command = connection.CreateCommand();
    command.Transaction = sqlTran;

    try
    {
        // Execute two separate commands.
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
        command.ExecuteNonQuery();
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
        command.ExecuteNonQuery();

        // Commit the transaction.
        sqlTran.Commit();
        Console.WriteLine("Both records were written to database.");
    }
    catch (Exception ex)
    {
        // Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message);

        try
        {
            // Attempt to roll back the transaction.
            sqlTran.Rollback();
        }
        catch (Exception exRollback)
        {
            // Throws an InvalidOperationException if the connection
            // is closed or the transaction has already been rolled
            // back on the server.
            Console.WriteLine(exRollback.Message);
        }
    }
}
Using connection As New SqlConnection(connectionString)
    connection.Open()

    ' Start a local transaction.
    Dim sqlTran As SqlTransaction = connection.BeginTransaction()

    ' Enlist a command in the current transaction.
    Dim command As SqlCommand = connection.CreateCommand()
    command.Transaction = sqlTran

    Try
        ' Execute two separate commands.
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')"
        command.ExecuteNonQuery()
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')"
        command.ExecuteNonQuery()

        ' Commit the transaction
        sqlTran.Commit()
        Console.WriteLine("Both records were written to database.")

    Catch ex As Exception
        ' Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message)

        Try
            ' Attempt to roll back the transaction.
            sqlTran.Rollback()

        Catch exRollback As Exception
            ' Throws an InvalidOperationException if the connection 
            ' is closed or the transaction has already been rolled 
            ' back on the server.
            Console.WriteLine(exRollback.Message)
        End Try
    End Try
End Using

Ayrıca bkz.