Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Transaction nesnesi DependentClone yöntemi kullanılarak oluşturulur. Tek amacı, diğer kod parçalarının (örneğin, bir çalışan iş parçacığı) işlem üzerinde çalışma gerçekleştirmeye devam ederken işlemin işlenemeyeceğini garanti etmektir. Kopyalanmış işlemde yapılan iş tamamlandığında ve taahhüt edilmeye hazır olduğunda, işlemin yaratıcısını Complete yöntemini kullanarak bilgilendirebilir. Böylece, verilerin tutarlılığını ve doğruluğunu koruyabilirsiniz.
sınıfı, DependentTransaction zaman uyumsuz görevler arasındaki eşzamanlılığı yönetmek için de kullanılabilir. Bu senaryoda, ebeveyn kendi kodunu yürütmeye devam ederken, bağımlı kopya kendi görevleri üzerinde çalışabilir. Başka bir deyişle, bağımlı tamamlanana kadar ebeveyn işlemi engellenmez.
Bağımlı Kopya Oluşturma
Bağımlı bir işlem oluşturmak için DependentClone yöntemini çağırın ve DependentCloneOption numaralandırmayı parametre olarak geçirin. Bu parametre, bağımlı kopya işlemi işlemeye hazır olduğunu belirtmeden önce Commit üst işlemde çağrılırsa, işlemin davranışını tanımlar (yöntemini çağırarak Complete). Bu parametre için aşağıdaki değerler geçerlidir:
BlockCommitUntilComplete ana işlem zaman aşımına uğrayana veya tamamlandıklarını belirtmek için tüm bağımlılar üzerinde Complete çağrılana kadar ana işlemin taahhüt sürecini engelleyen bağımlı bir işlem oluşturur. Bu, istemci bağımlı işlemler tamamlanana kadar üst işlemin işlenmesini istemediği durumlarda kullanışlıdır. Üst öğe, çalışmasını bağımlı işlemden önce tamamlarsa ve işlemi çağırırsa Commit , işleme işlemi, tüm bağımlılar çağırana Completekadar işlem üzerinde ek iş yapılabilecek ve yeni listelemelerin oluşturulabileceği bir durumda engellenir. Hepsi işlerini tamamlayıp çağrı yapıldığında Complete, işlem için taahhüt süreci başlar.
RollbackIfNotComplete, diğer yandan, Commit çağrılmadan önce üst işlemde Complete çağrılırsa otomatik olarak durdurulan bağımlı bir işlem oluşturur. Bu durumda, bağımlı işlemde yapılan tüm işler tek bir işlem ömrü içinde olduğu gibi kalır ve kimsenin yalnızca bir kısmını işleme şansı yoktur.
Complete yöntemi, uygulamanız bağımlı işlem üzerindeki çalışmasını tamamladığında yalnızca bir kez çağrılmalıdır; aksi takdirde, bir InvalidOperationException atılır. Bu çağrı yapıldıktan sonra, işlem üzerinde herhangi bir ek çalışma denememelisiniz; aksi halde bir hata oluşur.
Aşağıdaki kod örneği, bağımlı bir işlemi kopyalayıp bir çalışan iş parçacığına geçirerek iki eşzamanlı görevi yönetmek için bağımlı bir işlemin nasıl oluşturulacağını gösterir.
public class WorkerThread
{
public void DoWork(DependentTransaction dependentTransaction)
{
Thread thread = new Thread(ThreadMethod);
thread.Start(dependentTransaction);
}
public void ThreadMethod(object transaction)
{
DependentTransaction dependentTransaction = transaction as DependentTransaction;
Debug.Assert(dependentTransaction != null);
try
{
using(TransactionScope ts = new TransactionScope(dependentTransaction))
{
/* Perform transactional work here */
ts.Complete();
}
}
finally
{
dependentTransaction.Complete();
dependentTransaction.Dispose();
}
}
//Client code
using(TransactionScope scope = new TransactionScope())
{
Transaction currentTransaction = Transaction.Current;
DependentTransaction dependentTransaction;
dependentTransaction = currentTransaction.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
WorkerThread workerThread = new WorkerThread();
workerThread.DoWork(dependentTransaction);
/* Do some transactional work here, then: */
scope.Complete();
}
İstemci kodu, ortam işlemini de ayarlayan bir işlem kapsamı oluşturur. Ortam işlemini çalışan iş parçacığına geçirmemelisiniz. Bunun yerine, geçerli işleme DependentClone yöntemini çağırarak geçerli (ortam) işlemi kopyalamanız ve bağımlıyı işçi iş parçacığına aktarmanız gerekir.
ThreadMethod yöntemi yeni iş parçacığında yürütülür. İstemci, bağımlı işlemi ThreadMethod parametresi olarak geçirip yeni bir iş parçacığı başlatır.
bağımlı işlem ile BlockCommitUntilCompleteoluşturulduğundan, ikinci iş parçacığında yapılan tüm işlemsel çalışmalar tamamlanana ve Complete bağımlı işlemde çağrılana kadar işlemin işlenemeyeceği garanti edilir. Bu, yeni iş parçacığı bağımlı işlemde using çağırılmadan önce istemcinin kapsamı sona erdiğinde (yani deyimin Complete sonunda işlem nesnesini atmaya çalıştığında), istemci kodu bağımlı işlemde Complete çağrılana kadar engel olduğu anlamına gelir. Ardından işlem tamamlanabilir veya durdurulabilir.
Eşzamanlılık Sorunları
sınıfını kullanırken DependentTransaction bilmeniz gereken birkaç ek eşzamanlılık sorunu vardır:
Çalışan iş parçacığı işlemi geri alır ancak üst öğe işlemi gerçekleştirmeye çalışırsa, bir TransactionAbortedException oluşturulur.
İşlemdeki her çalışan iş parçacığı için yeni bir bağımlı kopya oluşturmanız gerekir. Aynı bağımlı kopyayı birden çok iş parçacığına vermeyin, çünkü yalnızca biri üzerinde Complete çağrısı yapabilir.
Çalışan iş parçacığı yeni bir iş parçacığı oluşturursa, bağımlı kopyadan yeni bir bağımlı kopya oluşturup bunu yeni iş parçacığına ilettiğinizden emin olun.