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
.NET, ad alanı üzerinden System.Transactions erişilebilen bir işlem çerçevesi içerir. Bu çerçeve, işlemleri ADO.NET dahil olmak üzere .NET ile tamamen tümleştirilmiş bir şekilde kullanıma sunar.
Programlama geliştirmelerine ek olarak, System.Transactions ve ADO.NET, siz işlemlerle çalışırken optimizasyonları koordine etmek için birlikte çalışabilir. Yükseltilebilir işlem, gerektiğinde otomatik olarak tam dağıtılmış bir işleme yükseltilebilen basit (yerel) bir işlemdir.
SQL Server için Microsoft SqlClient Veri Sağlayıcısı, SQL Server ile çalışırken tanıtılabilir işlemleri destekler. Yükseltilebilir bir işlem, eklenen ek yük gerekmediği sürece dağıtılmış bir işlemin ek yükünü çağırmaz. Tanıtılabilir işlemler otomatiktir ve geliştiricinin müdahalesi gerekmez.
Tanıtılabilir işlemler oluşturma
SQL Server için Microsoft SqlClient Veri Sağlayıcısı, yükseltilebilir işlemler için System.Transactions ad alanındaki sınıflar aracılığıyla destek sağlar. Yükseltilebilir işlemler, gerekli olana kadar dağıtılmış işlemin oluşturulmasını erteleyerek dağıtılmış işlemleri optimize eder. Yalnızca bir kaynak yöneticisi gerekiyorsa, dağıtılmış işlem gerçekleşmez.
Uyarı
Kısmen güvenilen bir senaryoda, DistributedTransactionPermission bir işlem dağıtılmış bir işleme yükseltildiğinde gereklidir.
Tanıtılabilir işlem senaryoları
Dağıtılmış işlemler genellikle işlemde erişilen tüm kaynak yöneticilerini tümleştiren Microsoft Dağıtılmış İşlem Düzenleyicisi (MS DTC) tarafından yönetilen önemli sistem kaynaklarını kullanır. Yükseltilebilir işlem, işi etkili bir şekilde basit bir SQL Server işlemine devreden özel bir işlem türüdür. System.Transactions, Microsoft.Data.SqlClientve SQL Server, işlemin işlenmesinde yer alan çalışmayı koordine eder ve gerektiğinde tam dağıtılmış bir işleme yükselter.
Yükseltilebilir işlemleri kullanmanın avantajı, etkin TransactionScope bir işlem kullanılarak bir bağlantı açıldığında ve başka hiçbir bağlantı açılmadığında, işlemin tam dağıtılmış bir işlemin ek yükünü doğurma yerine basit bir işlem olarak işlemesidir.
Bağlantı dizesi anahtar sözcükleri
ConnectionString özelliği, Enlistişlem bağlamlarını algılayıp algılamayacağını ve bağlantıyı dağıtılmış bir işlemde otomatik olarak listeleyip Microsoft.Data.SqlClient listelemeyeceğini belirten bir anahtar sözcüğünü destekler. Eğer Enlist=true ise, bağlantı, açılış iş parçacığının geçerli işlem bağlamına otomatik olarak dahil edilir.
Enlist=false iseSqlClient, bağlantı dağıtılmış bir işlemle etkileşim kurmaz. için Enlist varsayılan değer true değeridir. Bağlantı dizesinde belirtilmezse Enlist , bağlantı açıldığında algılanan bir dağıtılmış işleme otomatik olarak eklenir.
Bağlantı Transaction BindingSqlConnection dizesindeki anahtar sözcükler, bağlantının listelenmiş System.Transactions bir işlemle ilişkisini denetler.
SqlConnectionStringBuilder'ın TransactionBinding özelliği aracılığıyla da kullanılabilir.
Aşağıdaki tabloda olası değerler açıklanmaktadır.
| Keyword | Description |
|---|---|
| Örtük Bağlamayı Kaldırma | Varsayılan. Bağlantı sona erdiğinde işlemden ayrılır ve otomatik komut moduna geri döner. |
| Açık Bağlamayı Kaldır | İşlem kapatılana kadar bağlantı işleme bağlı kalır. İlişkili işlem etkin değilse veya ile eşleşmiyorsa Currentbağlantı başarısız olur. |
TransactionScope Kullanma
sınıfı, TransactionScope dağıtılmış bir işlemdeki bağlantıları örtük olarak listeleyerek bir kod bloğunu işlemsel hale getirir. Complete yöntemini, TransactionScope bloğundan çıkmadan önce çağırmanız gerekir. Bloktan çıkıldığında Dispose yöntemi çağrılır. Kodun kapsamdan ayrılmasına neden olan bir özel durum oluşturulduysa, işlem durduruldu olarak kabul edilir.
using bloğundan çıktığınızda TransactionScope nesnesinde Dispose çağrıldığından emin olmak için bir blok kullanmanızı öneririz. Bekleyen işlemlerin taahhüt edilememesi veya geri alınamaması, TransactionScope için varsayılan zaman aşımı bir dakika olduğundan performansa önemli ölçüde zarar verebilir. Deyimini using kullanmazsanız, tüm çalışmaları bir Try bloğu içinde gerçekleştirmeniz ve Finally bloğunda Dispose yöntemini açıkça çağırmanız gerekir.
Eğer içinde TransactionScope bir özel durum oluşursa, işlem tutarsız olarak işaretlenir ve terk edilir. Kapandığında TransactionScope geri alınır. Özel durum oluşmazsa, katılan işlemler işleme alır.
Uyarı
Varsayılan olarak, TransactionScope sınıfı Serializable değerinde bir IsolationLevel ile işlem oluşturur. Uygulamanıza bağlı olarak, uygulamanızda yüksek çekişmelerden kaçınmak için yalıtım düzeyini düşürmeyi düşünebilirsiniz.
Uyarı
Önemli veritabanı kaynaklarını kullandıklarından, dağıtılmış işlemler içinde yalnızca güncelleştirmeleri, eklemeleri ve silmeleri gerçekleştirmenizi öneririz. Select ifadeleri veritabanı kaynaklarını gereksiz yere kilitleyebilir ve bazı senaryolarda, seçme işlemleri için işlem kullanmanız gerekebilir. Diğer işlem yapılmış kaynak yöneticilerini içermediği sürece, veritabanı dışı tüm çalışmalar işlem kapsamı dışında yapılmalıdır. İşlem kapsamındaki bir özel durum işlemin işlenmesini engellese de, sınıfın TransactionScope kodunuzun işlem kapsamı dışında yaptığı değişiklikleri geri alma için bir sağlama yoktur. İşlem geri alındığında bazı eylemleri gerçekleştirmeniz gerekiyorsa, IEnlistmentNotification arabirimini kendi uygulamanız olarak yazmanız ve işleme açıkça katılmanız gerekir.
Example
System.Transactions ile çalışmak için System.Transactions.dll bir başvurunun olması gerekir.
Aşağıdaki işlev, iki farklı SqlConnection nesnesiyle temsil edilen iki farklı SQL Server örneğiyle, TransactionScope bloğu içine alınmış yükseltilebilir bir işlemin nasıl oluşturulacağını gösterir.
Aşağıdaki kod, bir TransactionScope bloğunu using ifadesiyle oluşturur ve ilk bağlantıyı açarak bunun TransactionScope içerisinde otomatik olarak kaydeder.
İşlem başlangıçta tam dağıtılmış bir işlem olarak değil basit bir işlem olarak listelenmiştir. İkinci bağlantı, ilk bağlantıdaki komut bir özel durum oluşturmazsa ancak TransactionScope içine kaydedilir. İkinci bağlantı açıldığında, işlem otomatik olarak tam dağıtılmış bir işleme yükseltilir.
Daha sonra Complete yöntemi çağrılır ve bu yöntem yalnızca hiçbir özel durum fırlatılmadıysa işlemi taahhüt eder. Herhangi bir noktada TransactionScope bloğunda bir istisna atılırsa, Complete çağrılmaz ve TransactionScope bloğunun sonunda using atıldığında, dağıtılmış işlem geri alınır.
using System;
using System.Transactions;
using Microsoft.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Data Source = localhost; Integrated Security = true; Initial Catalog = AdventureWorks";
string commandText1 = "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
string commandText2 = "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
int result = CreateTransactionScope(connectionString, connectionString, commandText1, commandText2);
Console.WriteLine("result = " + result);
}
static public int CreateTransactionScope(string connectString1, string connectString2,
string commandText1, string commandText2)
{
// Initialize the return value to zero and create a StringWriter to display results.
int returnValue = 0;
System.IO.StringWriter writer = new System.IO.StringWriter();
// Create the TransactionScope in which to execute the commands, guaranteeing
// that both commands will commit or roll back as a single unit of work.
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
try
{
// Opening the connection automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Create the SqlCommand object and execute the first command.
SqlCommand command1 = new SqlCommand(commandText1, connection1);
returnValue = command1.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command1: {0}", returnValue);
// if you get here, this means that command1 succeeded. By nesting
// the using block for connection2 inside that of connection1, you
// conserve server and network resources by opening connection2
// only when there is a chance that the transaction can commit.
using (SqlConnection connection2 = new SqlConnection(connectString2))
try
{
// The transaction is promoted to a full distributed
// transaction when connection2 is opened.
connection2.Open();
// Execute the second command in the second database.
returnValue = 0;
SqlCommand command2 = new SqlCommand(commandText2, connection2);
returnValue = command2.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
}
catch (Exception ex)
{
// Display information that command2 failed.
writer.WriteLine("returnValue for command2: {0}", returnValue);
writer.WriteLine("Exception Message2: {0}", ex.Message);
}
}
catch (Exception ex)
{
// Display information that command1 failed.
writer.WriteLine("returnValue for command1: {0}", returnValue);
writer.WriteLine("Exception Message1: {0}", ex.Message);
}
}
// If an exception has been thrown, Complete will not
// be called and the transaction is rolled back.
scope.Complete();
}
// The returnValue is greater than 0 if the transaction committed.
if (returnValue > 0)
{
writer.WriteLine("Transaction was committed.");
}
else
{
// You could write additional business logic here, notify the caller by
// throwing a TransactionAbortedException, or log the failure.
writer.WriteLine("Transaction rolled back.");
}
// Display messages.
Console.WriteLine(writer.ToString());
return returnValue;
}
}
Ayrıca bakınız
- İşlemler ve eşzamanlılık
- SQL Server için Microsoft ADO.NET