TransactionScope Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Membuat transaksi blok kode. Kelas ini tidak dapat diwariskan.
public ref class TransactionScope sealed : IDisposable
public sealed class TransactionScope : IDisposable
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public sealed class TransactionScope : IDisposable
type TransactionScope = class
interface IDisposable
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
type TransactionScope = class
interface IDisposable
Public NotInheritable Class TransactionScope
Implements IDisposable
- Warisan
-
TransactionScope
- Atribut
- Penerapan
Contoh
Contoh berikut menunjukkan cara menggunakan TransactionScope kelas untuk menentukan blok kode untuk berpartisipasi dalam transaksi.
// This function takes arguments for 2 connection strings and commands to create a transaction
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
// transaction is rolled back. To test this code, you can connect to two different databases
// on the same server by altering the connection string, or to another 3rd party RDBMS by
// altering the code in the connection2 code block.
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();
try
{
// Create the TransactionScope to execute the commands, guaranteeing
// that both commands can commit or roll back as a single unit of work.
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
// 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 as connection2 is opened
// only when there is a chance that the transaction can commit.
using (SqlConnection connection2 = new SqlConnection(connectString2))
{
// The transaction is escalated 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);
}
}
// The Complete method commits the transaction. If an exception has been thrown,
// Complete is not called and the transaction is rolled back.
scope.Complete();
}
}
catch (TransactionAbortedException ex)
{
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
// Display messages.
Console.WriteLine(writer.ToString());
return returnValue;
}
' This function takes arguments for 2 connection strings and commands to create a transaction
' involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
' transaction is rolled back. To test this code, you can connect to two different databases
' on the same server by altering the connection string, or to another 3rd party RDBMS
' by altering the code in the connection2 code block.
Public Function CreateTransactionScope( _
ByVal connectString1 As String, ByVal connectString2 As String, _
ByVal commandText1 As String, ByVal commandText2 As String) As Integer
' Initialize the return value to zero and create a StringWriter to display results.
Dim returnValue As Integer = 0
Dim writer As System.IO.StringWriter = New System.IO.StringWriter
Try
' Create the TransactionScope to execute the commands, guaranteeing
' that both commands can commit or roll back as a single unit of work.
Using scope As New TransactionScope()
Using connection1 As New SqlConnection(connectString1)
' Opening the connection automatically enlists it in the
' TransactionScope as a lightweight transaction.
connection1.Open()
' Create the SqlCommand object and execute the first command.
Dim command1 As SqlCommand = 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 as connection2 is opened
' only when there is a chance that the transaction can commit.
Using connection2 As New SqlConnection(connectString2)
' The transaction is escalated to a full distributed
' transaction when connection2 is opened.
connection2.Open()
' Execute the second command in the second database.
returnValue = 0
Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
returnValue = command2.ExecuteNonQuery()
writer.WriteLine("Rows to be affected by command2: {0}", returnValue)
End Using
End Using
' The Complete method commits the transaction. If an exception has been thrown,
' Complete is called and the transaction is rolled back.
scope.Complete()
End Using
Catch ex As TransactionAbortedException
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message)
End Try
' Display messages.
Console.WriteLine(writer.ToString())
Return returnValue
End Function
Keterangan
Infrastruktur ini System.Transactions menyediakan model pemrograman eksplisit berdasarkan Transaction kelas , serta model pemrograman implisit menggunakan TransactionScope kelas , di mana transaksi secara otomatis dikelola oleh infrastruktur.
Penting
Kami menyarankan agar Anda membuat transaksi implisit menggunakan TransactionScope kelas , sehingga konteks transaksi sekitar dikelola secara otomatis untuk Anda. Anda juga harus menggunakan TransactionScope kelas dan DependentTransaction untuk aplikasi yang memerlukan penggunaan transaksi yang sama di beberapa panggilan fungsi atau beberapa panggilan utas. Untuk informasi selengkapnya tentang model ini, lihat topik Menerapkan Transaksi Implisit Menggunakan Cakupan Transaksi . Untuk informasi selengkapnya tentang menulis aplikasi transaksional, lihat Menulis Aplikasi Transaksional.
Setelah membuat contoh TransactionScope oleh new
pernyataan, manajer transaksi menentukan transaksi mana yang akan berpartisipasi. Setelah ditentukan, ruang lingkup selalu berpartisipasi dalam transaksi itu. Keputusan didasarkan pada dua faktor: apakah ada transaksi ambient dan nilai parameter TransactionScopeOption
di konstruktor. Transaksi sekitar adalah transaksi yang dijalankan kode Anda. Anda dapat memperoleh referensi ke transaksi sekitar dengan memanggil properti Transaction.Current statis dari kelas Transaction. Untuk informasi selengkapnya tentang bagaimana parameter ini digunakan, lihat bagian "Manajemen Aliran Transaksi" dari topik Menerapkan Transaksi Implisit Menggunakan Cakupan Transaksi .
Jika tidak ada pengecualian yang terjadi dalam cakupan transaksi (yaitu, antara inisialisasi TransactionScope objek dan pemanggilan metodenya Dispose ), maka transaksi tempat cakupan berpartisipasi diizinkan untuk melanjutkan. Jika pengecualian terjadi dalam cakupan transaksi, transaksi tempatnya berpartisipasi akan digulung balik.
Ketika aplikasi Anda menyelesaikan semua pekerjaan yang ingin dilakukannya dalam transaksi, Anda harus memanggil Complete metode hanya sekali untuk memberi tahu manajer transaksi bahwa itu dapat diterima untuk melakukan transaksi. Gagal memanggil metode ini membatalkan transaksi.
Panggilan ke Dispose metode menandai akhir cakupan transaksi. Pengecualian yang terjadi setelah memanggil metode ini mungkin tidak mempengaruhi transaksi.
Jika Anda memodifikasi nilai Current di dalam cakupan, pengecualian akan dilemparkan saat Dispose dipanggil. Namun, di akhir cakupan, nilai sebelumnya dipulihkan. Selain itu, jika Anda memanggil Dispose di Current dalam cakupan transaksi yang membuat transaksi, transaksi dibatalkan di akhir cakupan.
Konstruktor
TransactionScope() |
Menginisialisasi instans baru kelas TransactionScope. |
TransactionScope(Transaction) |
Menginisialisasi instans TransactionScope baru kelas dan menetapkan transaksi yang ditentukan sebagai transaksi sekitar, sehingga pekerjaan transaksional yang dilakukan di dalam cakupan menggunakan transaksi ini. |
TransactionScope(Transaction, TimeSpan) |
Menginisialisasi instans TransactionScope baru kelas dengan nilai batas waktu yang ditentukan, dan menetapkan transaksi yang ditentukan sebagai transaksi sekitar, sehingga pekerjaan transaksional yang dilakukan di dalam cakupan menggunakan transaksi ini. |
TransactionScope(Transaction, TimeSpan, EnterpriseServicesInteropOption) |
Menginisialisasi instans TransactionScope baru kelas dengan nilai batas waktu yang ditentukan dan persyaratan interoperabilitas COM+, dan menetapkan transaksi yang ditentukan sebagai transaksi sekitar, sehingga pekerjaan transaksional yang dilakukan di dalam cakupan menggunakan transaksi ini. |
TransactionScope(Transaction, TimeSpan, TransactionScopeAsyncFlowOption) |
[Didukung di .NET Framework 4.5.1 dan versi yang lebih baru] Menginisialisasi instans TransactionScope baru kelas dengan nilai batas waktu yang ditentukan, dan menetapkan transaksi yang ditentukan sebagai transaksi sekitar, sehingga pekerjaan transaksional yang dilakukan di dalam cakupan menggunakan transaksi ini. |
TransactionScope(Transaction, TransactionScopeAsyncFlowOption) |
[Didukung di .NET Framework 4.5.1 dan versi yang lebih baru] Menginisialisasi instans TransactionScope baru kelas dan menetapkan transaksi yang ditentukan sebagai transaksi sekitar, sehingga pekerjaan transaksional yang dilakukan di dalam cakupan menggunakan transaksi ini. |
TransactionScope(TransactionScopeAsyncFlowOption) |
Menginisialisasi instans TransactionScope baru kelas dengan opsi alur asinkron yang ditentukan. |
TransactionScope(TransactionScopeOption) |
Menginisialisasi instans TransactionScope baru kelas dengan persyaratan yang ditentukan. |
TransactionScope(TransactionScopeOption, TimeSpan) |
Menginisialisasi instans TransactionScope baru kelas dengan nilai dan persyaratan batas waktu yang ditentukan. |
TransactionScope(TransactionScopeOption, TimeSpan, TransactionScopeAsyncFlowOption) |
Menginisialisasi instans TransactionScope baru kelas dengan nilai batas waktu, persyaratan, dan opsi alur asinkron yang ditentukan. |
TransactionScope(TransactionScopeOption, TransactionOptions) |
Menginisialisasi instans TransactionScope baru kelas dengan persyaratan yang ditentukan. |
TransactionScope(TransactionScopeOption, TransactionOptions, EnterpriseServicesInteropOption) |
Menginisialisasi instans TransactionScope baru kelas dengan cakupan yang ditentukan dan persyaratan interoperabilitas COM+, dan opsi transaksi. |
TransactionScope(TransactionScopeOption, TransactionOptions, TransactionScopeAsyncFlowOption) |
[Didukung di .NET Framework 4.5.1 dan versi yang lebih baru] Menginisialisasi instans TransactionScope baru kelas dengan persyaratan yang ditentukan dan opsi alur asinkron. |
TransactionScope(TransactionScopeOption, TransactionScopeAsyncFlowOption) |
Menginisialisasi instans TransactionScope baru kelas dengan persyaratan yang ditentukan dan opsi alur asinkron. |
Metode
Complete() |
Menunjukkan bahwa semua operasi dalam cakupan berhasil diselesaikan. |
Dispose() |
Mengakhiri cakupan transaksi. |
Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
GetType() |
Mendapatkan instans Type saat ini. (Diperoleh dari Object) |
MemberwiseClone() |
Membuat salinan dangkal dari yang saat ini Object. (Diperoleh dari Object) |
ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |
Berlaku untuk
Keamanan Thread
Jenis ini aman untuk utas.