Yerel İşlemler
ADO.NET içindeki işlemler, birden çok görevi tek bir iş birimi olarak yürütecek şekilde birbirine bağlamak istediğinizde kullanılır. Örneğin, bir uygulama iki görevleri gerçekleştirir düşünün. İlk olarak, bir tabloyu sipariş bilgileriyle güncelleştirir. İkincisi, stok bilgilerini içeren bir tabloyu güncelleştirir ve sipariş edilen maddelerin borçlarını alır. Görevlerden biri başarısız olursa, her iki güncelleştirme de geri alınır.
İşlem Türünü Belirleme
Bir işlem, tek aşamalı bir işlem olduğunda ve doğrudan veritabanı tarafından işlendiğinde yerel bir işlem olarak kabul edilir. İşlem, bir işlem izleyicisi tarafından eşgüdümlü olduğunda dağıtılmış bir işlem olarak kabul edilir ve işlem çözümlemesi için başarısız güvenli mekanizmalar (iki aşamalı işleme gibi) kullanır.
.NET Framework veri sağlayıcılarının her birinin yerel işlemleri gerçekleştirmek için kendi Transaction
nesnesi vardır. SQL Server veritabanında bir işlemin gerçekleştirilmesini istiyorsanız, bir System.Data.SqlClient işlem seçin. Oracle işlemi için sağlayıcıyı System.Data.OracleClient kullanın. Ayrıca, işlem gerektiren sağlayıcıdan bağımsız kod yazmak için kullanılabilen bir DbTransaction sınıf vardır.
Not
İşlemler, sunucuda gerçekleştirildiğinde en verimli şekilde gerçekleştirilir. Açık işlemleri kapsamlı bir şekilde kullanan bir SQL Server veritabanıyla çalışıyorsanız, Transact-SQL BEGIN TRANSACTION deyimini kullanarak bunları saklı yordamlar olarak yazmayı göz önünde bulundurun.
Tek bir Bağlan Kullanarak İşlem Gerçekleştirme
ADO.NET içinde, nesneyle Connection
işlemleri denetlersiniz. yöntemiyle BeginTransaction
yerel bir işlem başlatabilirsiniz. Bir işlem başladıktan sonra, bir nesnenin Transaction
özelliğiyle bu işlemde bir Command
komut kaydedebilirsiniz. Ardından, işlemin bileşenlerinin başarısına veya başarısızlığına bağlı olarak veri kaynağında yapılan değişiklikleri işleyebilir veya geri alabilirsiniz.
Not
EnlistDistributedTransaction
yöntemi yerel bir işlem için kullanılmamalıdır.
İşlemin kapsamı bağlantıyla sınırlıdır. Aşağıdaki örnek, bloktaki try
iki ayrı komutlardan oluşan açık bir işlem gerçekleştirir. Komutlar, AdventureWorks SQL Server örnek veritabanındaki Production.ScrapReason tablosuna karşı INSERT deyimlerini yürütür ve özel durum oluşturmazsa işlenir. Bir özel durum oluşturulursa bloktaki catch
kod işlemi geri alır. İşlem durdurulduysa veya işlem tamamlanmadan bağlantı kapatılırsa, otomatik olarak geri alınır.
Örnek
İşlem gerçekleştirmek için bu adımları izleyin.
İşlemin BeginTransaction başlangıcını SqlConnection işaretlemek için nesnesinin yöntemini çağırın. yöntemi, BeginTransaction işleme bir başvuru döndürür. Bu başvuru, işlemde yer alan SqlCommand nesnelere atanır.
Transaction
nesnesini Transaction yürütülecek öğesinin SqlCommand özelliğine atayın. Etkin bir işlemle bağlantıda bir komut yürütülürse veTransaction
nesne nesneninTransaction
Command
özelliğine atanmamışsa, bir özel durum oluşturulur.Gerekli komutları yürütür.
Commit İşlemi tamamlamak için nesnesinin SqlTransaction yöntemini çağırın veya işlemi sonlandırmak için yöntemini çağırınRollback. Ya da yöntemleri yürütülmeden önce Commit Rollback bağlantı kapatılır veya atılırsa, işlem geri alınır.
Aşağıdaki kod örneği, Microsoft SQL Server ile ADO.NET kullanan işlem mantığını gösterir.
using (SqlConnection connection = new(connectionString))
{
connection.Open();
// Start a local transaction.
SqlTransaction sqlTran = connection.BeginTransaction();
// Enlist a command in the current transaction.
SqlCommand command = connection.CreateCommand();
command.Transaction = sqlTran;
try
{
// Execute two separate commands.
command.CommandText =
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
command.ExecuteNonQuery();
command.CommandText =
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
command.ExecuteNonQuery();
// Commit the transaction.
sqlTran.Commit();
Console.WriteLine("Both records were written to database.");
}
catch (Exception ex)
{
// Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message);
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Console.WriteLine(exRollback.Message);
}
}
}
Using connection As New SqlConnection(connectionString)
connection.Open()
' Start a local transaction.
Dim sqlTran As SqlTransaction = connection.BeginTransaction()
' Enlist a command in the current transaction.
Dim command As SqlCommand = connection.CreateCommand()
command.Transaction = sqlTran
Try
' Execute two separate commands.
command.CommandText = _
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')"
command.ExecuteNonQuery()
command.CommandText = _
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')"
command.ExecuteNonQuery()
' Commit the transaction
sqlTran.Commit()
Console.WriteLine("Both records were written to database.")
Catch ex As Exception
' Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message)
Try
' Attempt to roll back the transaction.
sqlTran.Rollback()
Catch exRollback As Exception
' Throws an InvalidOperationException if the connection
' is closed or the transaction has already been rolled
' back on the server.
Console.WriteLine(exRollback.Message)
End Try
End Try
End Using