CommittableTransaction Kullanarak Belirtik İşlem Uygulama

CommittableTransaction sınıfı, uygulamaların örtük olarak kullanmak yerine bir işlemi kullanması TransactionScope için açık bir yol sağlar. Aynı işlemi birden çok işlev çağrısında veya birden çok iş parçacığı çağrısında kullanmak isteyen uygulamalar için kullanışlıdır. sınıfından TransactionScope farklı olarak, uygulama yazarının işlemi işlemek veya durdurmak için ve Rollback yöntemlerini özellikle çağırması Commit gerekir.

CommittableTransaction sınıfına genel bakış

CommittableTransaction Sınıf türetilir Transaction sınıfı, bu nedenle tüm işlevselliğini ikincisi sağlama. Özellikle yararlıdır Rollback yöntemi Transaction geri almak için de kullanılabilir sınıf bir CommittableTransaction nesne.

Transaction sınıfı sınıfına CommittableTransaction benzer ancak bir Commit yöntem sunmaz. Bu, işlemin ne zaman işlendiğini denetlerken işlem nesnesini (veya kopyalarını) diğer yöntemlere (potansiyel olarak diğer iş parçacıklarında) geçirmenizi sağlar. Çağrılan kod, işleme kaydolup oy verebilse de, yalnızca nesnenin CommittableTransaction oluşturucusu işlemi işleme yeteneğine sahiptir.

Followings ile çalışırken dikkat etmelisiniz CommittableTransaction sınıfı

  • CommittableTransaction İşlem oluşturma işlemi ortam işlemini ayarlamaz. Kaynak yöneticilerinin uygun olduğunda doğru işlem bağlamı altında çalıştığından emin olmak için ortam işlemini özel olarak ayarlamanız ve sıfırlamanız gerekir. Geçerli ortam işlemini ayarlamanın yolu, genel Transaction nesnedeki statik Current özelliği ayarlamaktır.

  • Bir CommittableTransaction nesne olamaz yeniden kullanılabilecek. Bir CommittableTransaction nesne işlendikten veya geri alındıktan sonra, bir işlemde yeniden kullanılamaz. Yani, geçerli ortam işlem bağlamı olarak ayarlanamaz.

CommittableTransaction Oluşturma

Aşağıdaki örnek, yeni bir oluşturur CommittableTransaction ve onu kaydeder.

//Create a committable transaction
tx = new CommittableTransaction();

SqlConnection myConnection = new SqlConnection("server=(local)\\SQLExpress;Integrated Security=SSPI;database=northwind");
SqlCommand myCommand = new SqlCommand();

//Open the SQL connection
myConnection.Open();

//Give the transaction to SQL to enlist with
myConnection.EnlistTransaction(tx);

myCommand.Connection = myConnection;

// Restore database to near it's original condition so sample will work correctly.
myCommand.CommandText = "DELETE FROM Region WHERE (RegionID = 100) OR (RegionID = 101)";
myCommand.ExecuteNonQuery();

// Insert the first record.
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'MidWestern')";
myCommand.ExecuteNonQuery();

// Insert the second record.
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'MidEastern')";
myCommand.ExecuteNonQuery();

// Commit or rollback the transaction
while (true)
{
    Console.Write("Commit or Rollback? [C|R] ");
    ConsoleKeyInfo c = Console.ReadKey();
    Console.WriteLine();

    if ((c.KeyChar == 'C') || (c.KeyChar == 'c'))
    {
        tx.Commit();
        break;
    }
    else if ((c.KeyChar == 'R') || (c.KeyChar == 'r'))
    {
        tx.Rollback();
        break;
    }
}
myConnection.Close();
tx = null;
tx = New CommittableTransaction

Dim myConnection As New SqlConnection("server=(local)\SQLExpress;Integrated Security=SSPI;database=northwind")
Dim myCommand As New SqlCommand()

'Open the SQL connection
myConnection.Open()

'Give the transaction to SQL to enlist with
myConnection.EnlistTransaction(tx)

myCommand.Connection = myConnection

'Restore database to near it's original condition so sample will work correctly.
myCommand.CommandText = "DELETE FROM Region WHERE (RegionID = 100) OR (RegionID = 101)"
myCommand.ExecuteNonQuery()

'Insert the first record.
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'MidWestern')"
myCommand.ExecuteNonQuery()

'Insert the second record.
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'MidEastern')"
myCommand.ExecuteNonQuery()

'Commit or rollback the transaction
Dim c As ConsoleKeyInfo
While (True)
    Console.Write("Commit or Rollback? [C|R] ")
    c = Console.ReadKey()
    Console.WriteLine()

    If (c.KeyChar = "C") Or (c.KeyChar = "c") Then
        tx.Commit()
        Exit While
    ElseIf ((c.KeyChar = "R") Or (c.KeyChar = "r")) Then
        tx.Rollback()
        Exit While
    End If
End While

myConnection.Close()
tx = Nothing

örneğinin CommittableTransaction oluşturulması, ortam işlem bağlamını otomatik olarak ayarlamaz. Bu nedenle, bir kaynak yöneticisindeki herhangi bir işlem bu işlemin bir parçası değildir. Genel Transaction nesnedeki statik Current özellik, ortam işlemini ayarlamak veya almak için kullanılır ve kaynak yöneticilerinin işleme katılabilmesi için uygulamanın bunu el ile ayarlaması gerekir. Ayrıca, nesneyi kullanmayı bitirdiğinizde eski ortam işlemini kaydetmek ve geri yüklemek de iyi bir uygulamadır CommittableTransaction .

İşlemi işlemek için yöntemini açıkça çağırmanız Commit gerekir. Bir işlemi geri döndürmek için yöntemini çağırmanız Rollback gerekir. bir işlenene veya geri alınana kadar CommittableTransaction , bu işleme dahil olan tüm kaynakların hala kilitlendiğini unutmayın.

Bir CommittableTransaction işlev çağrıları ve dizileri arasında nesne kullanılabilir. Ancak, bu özel durumları işlemek ve özellikle çağırmak için uygulama geliştiricisi kadar kadar Rollback(Exception) yöntemi hataları durumunda.

Zaman uyumsuz tamamlama

CommittableTransaction sınıfı, bir işlemi zaman uyumsuz olarak işlemeye yönelik bir mekanizma da sağlar. Birden çok veritabanı erişimi ve olası ağ gecikme süresi içerebileceğinden işlem işlemesi önemli zaman alabilir. Yüksek aktarım hızı uygulamalarındaki kilitlenmeleri önlemek istediğinizde, işlem çalışmasını en kısa sürede tamamlamak ve işleme işlemini arka plan görevi olarak çalıştırmak için zaman uyumsuz işlemeyi kullanabilirsiniz. BeginCommit Ve EndCommit yöntemlerinin CommittableTransaction sınıfı, bunu yapmak izin.

Çağırabilirsiniz BeginCommit yürütme Soyguncu iş parçacığı havuzu için bir iş parçacığı gönderme. Ayrıca, işlemin gerçekten işlenip işlenmediğini belirlemek için de çağırabilirsiniz EndCommit . İşlem her nedenden dolayı işlenemediyse bir EndCommit işlem özel durumu oluşturur. İşlem çağrılıncaya kadar henüz işlenmemişse EndCommit , işlem işlenene veya durdurulana kadar çağıran engellenir.

Bir zaman uyumsuz tamamlama yapmak için kolay Sistemi'ne tamamlandığında çağrılacak bir geri çağırma yöntemi sağlayarak yoludur. Ancak, çağırmalıdır EndCommit özgün yöntemini CommittableTransaction arama çağırmak için kullanılan nesne. Bu nesneyi almak için, sınıfı sınıf uyguladığından IAsyncResult geri çağırma yönteminin IAsyncResult parametresini CommittableTransaction aşağı yayınlayabilirsiniz.

Aşağıdaki örnek, bir zaman uyumsuz tamamlama nasıl yapılacağı gösterir.

public void DoTransactionalWork()  
{  
     Transaction oldAmbient = Transaction.Current;  
     CommittableTransaction committableTransaction = new CommittableTransaction();  
     Transaction.Current = committableTransaction;  
  
     try  
     {  
          /* Perform transactional work here */  
          // No errors - commit transaction asynchronously  
          committableTransaction.BeginCommit(OnCommitted,null);  
     }  
     finally  
     {  
          //Restore the ambient transaction
          Transaction.Current = oldAmbient;  
     }  
}  
void OnCommitted(IAsyncResult asyncResult)  
{  
     CommittableTransaction committableTransaction;  
     committableTransaction = asyncResult as CommittableTransaction;
     Debug.Assert(committableTransaction != null);  
     try  
     {  
          using(committableTransaction)  
          {  
               committableTransaction.EndCommit(asyncResult);  
          }  
     }  
     catch(TransactionException e)  
     {  
          //Handle the failure to commit  
     }  
}  

Ayrıca bkz.