2009-03-13 18 views
69

Bir kullanma ifadesinde bir IDbTransaction var, ancak bir kullanım deyiminde bir istisna atılırsa geri alınacak olursa emin değilim. Kullanım ifadesinin Dispose() 'ın çağrısını zorlayacağını biliyorum ama Rollback() için de aynısının geçerli olup olmadığını bilen var mı?Bir hata bildirimi, bir hata oluştuğunda bir veritabanı işlemini geri alır mı?

Güncelleme: Ayrıca, aşağıda açıklandığı gibi Commit() 'i açıkça kullanmam gerekiyor mu yoksa kullanım bildirimi ile de ilgilenilecek mi?

Benim kod şöyle sıralamak görünür:

using Microsoft.Practices.EnterpriseLibrary.Data; 

... 

using(IDbConnection connection = DatabaseInstance.CreateConnection()) 
{ 
    connection.Open(); 

    using(IDbTransaction transaction = connection.BeginTransaction()) 
    { 
     //Attempt to do stuff in the database 
     //potentially throw an exception 
     transaction.Commit(); 
    } 
} 
+3

Merhaba, "taahhüt" vakasını açıklığa kavuşturmak için. Bu, elbette zorunlu değildir, çünkü use() {} sadece Dispose() yöntemini çağırır. Transaction.Dispose sınıfı, Commit ayrıca otomatikse, Commit veya Dispose olması gerekip gerekmediğini bilemez :) –

+0

Ayrıca bkz. Http://stackoverflow.com/questions/6418992/is-it-a-better-practice-to-explicitly -küçük-işlem-rollback-or-let-an-hariç – nawfal

cevap

85

Görünüşe evet (SQL Server). Bu (SQLTransaction en bertaraf çağırır) SqlInternalTransaction en Dispose yöntemi Reflector göründüğüne göre nasıl:

private void Dispose(bool disposing) 
{ 
    // ... 
    if (disposing && (this._innerConnection != null)) 
    { 
     this._disposing = true; 
     this.Rollback(); // there you go 
    } 
} 

DÜZENLEME: @Medinoc OracleConnection yapmaz sözü böylece uygulama özgü görünüyor.

+0

Bunu, ben bir kez bile bir istisna atarak bunu test edeceğim. –

+0

Bu harika! Aklımda bir soru olsa da, açık bir şekilde taahhüt vermem gerekiyor mu ... ya da kullanım bildirimi, geçerli taahhüt bildirimi gereksiz yere yapmakta başarılı olacak. – mezoid

+1

Bu * harika *, ancak çapraz-db uyumluluğu için kullanıyorsanız, diğer IDbTransaction uygulamaları için çalışıyor mu? –

4

Commit() öğesinin hiçbir zaman çağrılmadığı bir istisna varsa, işlem otomatik olarak geri dönecektir.

+0

Evet, bu benim anlayışım. Bir işlem bir taahhüt çağrılana veya bağlantı sona erene kadar devam eder. Bu noktada işlem günlüğü aslında değişikliklerle güncellenir veya kapalı bir bağlantı durumunda geri alınır (hiçbir zaman kapalı bir bağlantıdan bir taahhüt alamazsınız;)). – Mike

17

Taahhüt etmek zorundasınız. Kullanım ifadesi sizin için bir şey yapmayacaktır.

+5

Evet, kullanma, Çıkışta Geri Çağır'ı seçecektir; – awe

İlgili konular