2 temel işlem türü vardır; bağlantı işlemleri ve ortam işlemleri. Bir bağlantı işlemi (SqlTransaction gibi) doğrudan db bağlantısına (SqlConnection gibi) bağlanır, bu da bazı durumlarda bağlantıyı geçici olarak geçmeye devam etmeniz gerektiği anlamına gelir, ancak "oluştur / kullan / serbest bırak" işlevine izin vermez ve çapraz db çalışmasına izin vermez. Bir örnek (alan için biçimlendirilmiş):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Çok dağınık değil, ama bizim bağlantı "conn" ile sınırlı. Eğer farklı yöntemlere seslenmek istiyorsak, şimdi "conn" u geçmeliyiz.
Alternatif bir ortam işlemidir; .NET 2.0'da yeni olan TransactionScope nesnesi (System.Transactions.dll) bir dizi işlem üzerinde kullanıma izin verir (uygun sağlayıcılar ortam işlemine otomatik olarak kaydolur). Bu, mevcut (işlemsel olmayan) koda geri sığmayı ve birden çok sağlayıcıyla konuşmayı kolaylaştırır (birden fazla kişiyle konuşursanız DTC dahil olur).
Örneğin:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Burada iki yöntemin kendi bağlantılarını (aç / kullan / kapat / at) işleyebileceğini, ancak herhangi bir şey iletmek zorunda kalmadan sessizce ortam işleminin bir parçası olacağını unutmayın.
Kod hatalarınız varsa, Dispose () öğesi Complete () olmadan çağrılır, böylece geri alınır. Beklenen yuvalama vb. Desteklenir, ancak bir iç işlemi geri alamazsınız ancak dış işlemi tamamlayamazsınız: herhangi biri mutsuzsa işlem iptal edilir.
TransactionScope'un diğer avantajı, sadece veritabanlarına bağlı olmamasıdır; işleme duyarlı herhangi bir sağlayıcı bunu kullanabilir. Örneğin, WCF. Ya da etrafında bazı TransactionScope uyumlu nesne modelleri bile var (yani geri alma özelliğine sahip .NET sınıfları - belki de bu yaklaşımı hiç kullanmamış olsam da, bir anıdan daha kolay).
Sonuçta, çok, çok yararlı bir nesne.
Bazı uyarılar:
- SQL Server 2000'de bir TransactionScope hemen DTC'ye gider; Bu, SQL Server 2005 ve sonraki sürümlerde düzeltilmiştir, DTC'ye yükseltildiğinde 2 kaynak vb. ile konuşana kadar LTM'yi (çok daha az ek yük) kullanabilir.
- Bağlantı dizenizi değiştirmeniz gerekebileceği anlamına gelen bir aksaklık var