Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: .NET Framework
.NET
.NET Standard
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 uygulamanın iki görev gerçekleştirdiğini 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şlemin sonuçlandırılması için hata emniyetli mekanizmalar (iki aşamalı işleme gibi) kullanır.
SQL Server için Microsoft SqlClient Veri Sağlayıcısı,SQL Server veritabanlarında yerel işlemler gerçekleştirmek için kendi SqlTransaction nesnesine sahiptir. Diğer .NET veri sağlayıcıları da kendi Transaction nesnelerini sağlar. 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.
Uyarı
İş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ğlantı kullanarak işlem gerçekleştirme
ADO.NET içinde, nesneyle Connection işlemleri denetlersiniz. yöntemiyle BeginTransaction yerel bir işlem başlatabilirsiniz. İşlem başlatıldıktan sonra, bir Transaction nesnesinin Command özelliğini kullanarak bu işlemde bir 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.
Uyarı
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 INSERT tablosuna yönelik Production.ScrapReason deyimlerini yürütür; herhangi bir özel durum oluşmazsa bu deyimler kaydedilir. Bir istisna fırlatılırsa, catch bloğundaki kod işlemi geri alır. İşlem durdurulduysa veya işlem tamamlanmadan bağlantı kapatılırsa, otomatik olarak geri alınır.
Example
İşlem gerçekleştirmek için bu adımları izleyin.
İşlemin başlangıcını işaretlemek için BeginTransaction nesnesinin SqlConnection yöntemini çağırın. Bu BeginTransaction yöntemi işleme bir referans döndürür. İşleme dahil edilen SqlCommand nesnelere bu referans atanır.
Transactionnesnesini Transaction yürütülecek öğesinin SqlCommand özelliğine atayın. Bağlantıda etkin bir işlem varsa veTransactionnesnesiTransactionnesnesininCommandözelliğine atanmamışsa, bir istisna fırlatılır.Gerekli komutları yürütür.
İşlemi tamamlamak için Commit nesnesinin SqlTransaction yöntemini çağırın veya işlemi sonlandırmak için Rollback yöntemini çağırın. Commit veya Rollback yöntemlerinden herhangi biri yürütülmeden önce bağlantı kapatılır veya atılırsa, işlem geri alınır.
Aşağıdaki kod örneği, SQL Server için Microsoft SqlClient Veri Sağlayıcısı'nı kullanan işlem mantığını gösterir.
using System;
using Microsoft.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Data Source = localhost; Integrated Security = true; Initial Catalog = AdventureWorks";
using (SqlConnection connection = new SqlConnection(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);
}
}
}
}
}