2011-01-07 11 views
14

Şu anda TransactionScope nesnesinin kurucusuyla ilgili bir karışıklık yaşıyorum.İşlemScopeOption - Gerekli veya GerekenlerNew

Web sitemdeki kullanıcıların ürünleri sipariş edebileceğini varsayalım. Taleplerini sunarken, mevcut miktarın sola doğru bir şekilde yapıldığını ve eğer hala sıfırdan büyükse, talebi yerine getiriyorum. Daha sonra, mevcut miktarı bırakıyorum.

Tüm işlem, .NET transactionScope kullanarak bir işlem içerisindedir.

.NET transactionScope nesnesinde birkaç makale okuduktan sonra, işlemScope yapıcısı için kullanılacak TransactionScopeOption değeri hakkında biraz kafam karıştı.

aşağıdakilerden biri yukarıda anlatılan durum için daha uygundur hangisi:

public void ProcessRequest() 
{ 
    TransactionOptions transactionOptions = new TransactionOptions(); 
    transactionOptions.IsolationLevel = IsolationLevel.Serializable; 
    using (TransactionScope currentScope = new TransactionScope(TransactionScopeOption.RequiresNew, transactionOptions)) { 
     // DB Query to verify if quantity is still greater than zero 
     // DB Query to request and decrement quantity 
     currentScope.Complete(); 
    } 
} 

VEYA

public void ProcessRequest() 
{ 
    TransactionOptions transactionOptions = new TransactionOptions(); 
    transactionOptions.IsolationLevel = IsolationLevel.Serializable; 
    using (TransactionScope currentScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { 
     // DB Query to verify if quantity is still greater than zero 
     // DB Query to request and decrement quantity 
     currentScope.Complete(); 
    } 
} 

Not Yukarıdaki sadece benim gerçek sorun basitleştirilmesi sona erdiğini söyledi. Ben sadece böyle bir durumda TransactionScopeOption (RequiredNew veya Gerekli) doğru değeri bilmekle ilgileniyorum.

Yanıtladığınız için teşekkür ederiz. Eğer ProcessRequestTransactionScope.Required kullanın SomeOtherMethod yarattığı işlem kullanmak istiyorsanız

public void SomeOtherMethod() { 
    using (TransactionScope ts = new TrasansctionScope()) { 
     // Another DB action 
     ProcessRequest(); 
     // Yet another DB action 
    } 
} 

:

cevap

16

Başka yöntem başka işlem içine ProcessRequestararsa ne olmasını istediğini bağlıdır. Bu, varsayılan değerdir (ve çağrı yığınına başka bir işlem kapsamı oluşturmadan bunu çağırdığınızda hala bir işlem oluşturur).

Her zaman kendi (yeni) işlemini kullanmak için bu yöntemi zorlamak istiyorsanız, TransactionScope,RequiresNew kullanın.

+0

Benim durumumda, ProcessRequest yöntemi hiçbir zaman başka bir işlemin içine katılmayacaktır. Ben sadece bir istek yürütür sonra emin olmak için arıyorum: "istek ve eksiltme miktara DB Sorgusu" : Yürüttüğü zaman "miktarı hala O'dan büyük olup olmadığını DB Sorgusu doğrulamak için" , miktar başka bir istek nedeniyle henüz sıfıra ulaşmadı, aynı yöntemi ProcessRequest yürütme. Yani, varsayılan: TransactionScope.Required benim için doğru değerdir. –

+2

Kesinlikle - aksi takdirde (istemeden), kendi işlemini kullanmak için gerekli olan ProcessRequest hakkında özel bir şey olduğunu ima ederdiniz. –

+0

Tamam. Hızlı cevap için teşekkürler. –

5

Başka bir işlemde yönteminizin çağrılmayacağını anlıyorum. Ama olacaksa, burada TransactionScopeOption'u nasıl seçersiniz.

ProcessRequest tarafından veritabanına yazılan içerik herhangi arayan tarafından altüst edilemezse, arayan (varsa) tarafından oluşturulan birine yeni işlem paralel başlatır ve yeni işlem tarafından yönetilmeyen RequiresNew kullanın herhangi bir şekilde arayan. İşlemin iç içe geçemeyeceğini, varolan işlemi kullanabileceğini veya yeni bir tane oluşturulacağını düşünmek en iyisidir. İşlem yuvalanmamış!

ProcessRequest tarafından veritabanına yazılan içerik devrilebilirse, Required'u kullanın. Bununla birlikte, bu seçenek şeffaf değildir; ProcessRequest için arayan ProcessRequest'in geri dönebileceğinin farkında olmalıdır çünkü eğer callee ortam hareketini geri alırsa, arayan herhangi bir sql işlemini gerçekleştiremez, aksi halde "İşlem işlemin durumu için geçerli değildir." atılacak. Herhangi bir sorgunun, bir işlemin gizlice oluşturulup geri çekilip gönderilmediğini bilmediğinizden, herhangi bir sorguyu çalıştırmadan önce her zaman System.Transactions.Transaction.Current.TransactionInformation.Status'u kontrol etmeniz en iyisidir.

Aşağıdaki tabloyu yararlı bulabilirsiniz. enter image description here