DependentTransaction ile Eşzamanlılığı Yönetme
Transaction Nesnesi kullanılarak oluşturulan DependentClone yöntemi. 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. Kopyalanan işlem içinde yapılan iş tamamlandığında ve işlenmeye hazır olduğunda, yöntemini kullanarak işlemin oluşturucusunu Complete bilgilendirebilir. Bu nedenle, tutarlılık ve veri doğruluğunu saklayabilir.
DependentTransaction Sınıf ayrıca zaman uyumsuz görevler arasında eşzamanlılık yönetmek için kullanılabilir. Bu senaryoda, kendi görevlere bağımlı kopya çalışırken herhangi bir kod yürütmek üst devam edebilirsiniz. Diğer bir deyişle, üst öğenin yürütme bağımlı tamamlanıncaya kadar engellenmemiş.
Bağımlı bir kopya oluşturma
Bağımlı bir işlem oluşturmak için yöntemini çağırın DependentClone ve numaralandırmayı DependentCloneOption parametre olarak geçirin. Bu parametre, bağımlı kopya işlemi işlemeye hazır olduğunu belirtmeden önce üst işlemde çağrılırsa Commit
işlemin davranışını tanımlar (yöntemini çağırarak Complete ). Bu parameTRe için şu değerler geçerlidir:
BlockCommitUntilComplete üst işlem zaman aşımına gelene kadar veya tamamlanmalarını gösteren tüm bağımlılara çağrılana kadar Complete üst işlemin işleme işlemini 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ısı Completeyapın, işlem için işleme işlemi başlar.
RollbackIfNotCompletediğer yandan, üst işlem çağrılmadan önce Complete çağrılırsa Commit 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.
Yöntemin Complete , 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 oluşturulur. Bu çağrı çağrıldıktan sonra, işlem üzerinde herhangi bir ek çalışma denememelisiniz veya bir özel durum oluşturulur.
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şlemde yöntemini çağırarak DependentClone geçerli (ortam) işlemi kopyalamanız ve bağımlıyı çalışan iş parçacığına geçirmeniz gerekir.
ThreadMethod
Yeni iş parçacığı üzerinde yöntemini yürütür. İstemci, bağımlı işlemi parametre olarak ThreadMethod
geçirerek 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şlem üzerinde çağrılmadan Complete önce istemcinin kapsamının sona ermesi (deyiminin using
sonunda işlem nesnesini atmaya çalıştığında) istemci kodunun bağımlı işlemde çağrılana kadar Complete engel olduğu anlamına gelir. Ardından işlem işlemeyi veya durdurmayı tamamlayabilir.
Eşzamanlılık sorunları
İlgili sorunlar var. kullanırken farkında olması gereken birkaç ek eşzamanlılık DependentTransaction sınıfı:
Ç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. Yalnızca biri çağırabilirsiniz çünkü aynı bağımlı kopya birden çok iş parçacığı için geçmeyin Complete üzerindeki.
Yeni bir iş parçacığı çalışan iş parçacığı olarak çoğaltılır, bağımlı bir kopya bağımlı oluşturmak ve yeni bir dizi için iletmektir emin olun.