Dukungan transaksi untuk layanan Web XML memanfaatkan dukungan dalam runtime bahasa umum, yang didasarkan pada model transaksi terdistribusi yang sama yang ditemukan di Microsoft Transaction Server (MTS) dan Layanan COM+. Model ini didasarkan pada penentuan secara eksplisit apakah suatu objek berpartisipasi dalam suatu transaksi, daripada menulis kode spesifik untuk menangani delegasi dan panggilan balik untuk suatu transaksi. Untuk layanan Web XML yang dibuat menggunakan ASP.NET, Anda dapat mendeklarasikan perilaku transaksi layanan Web XML dengan mengatur atribut TransactionOption dari atribut WebMethod yang berlaku untuk metode layanan Web XML. Jika pengecualian dilemparkan ketika metode layanan Web XML dijalankan, transaksi berakhir secara otomatis; sebaliknya, jika tidak ada pengecualian, transaksi secara otomatis didelegasikan.
Atribut TransactionOption dari atribut WebMethod menentukan bagaimana metode layanan Web XML berpartisipasi dalam suatu transaksi. Meskipun tingkat deklarasi ini mewakili logika transaksi, tingkat ini merupakan langkah menjauh dari transaksi sebenarnya. Transaksi sebenarnya terjadi ketika objek transaksi mengakses sumber data (seperti database atau antrian pesan). Transaksi yang terkait dengan objek ini secara otomatis mengalir ke pengelola sumber daya yang sesuai. Penyedia data .NET Framework seperti Penyedia Data .NET Framework (untuk SQL Server atau OLE DB) mencari transaksi dalam konteks objek dan mengkatalogkannya melalui Koordinator Transaksi Terdistribusi (DTC, Koordinator Transaksi Terdistribusi). Semua transaksi dihasilkan secara otomatis.
Metode layanan Web XML hanya dapat berpartisipasi dalam transaksi yang merupakan akar dari transaksi baru. Sebagai akar dari transaksi baru, semua interaksi dengan pengelola sumber daya (seperti server yang menjalankan Microsoft SQL Server, Microsoft Message Queuing, dan Microsoft Host Integration Server) mempertahankan properti ACID yang diperlukan untuk menjalankan aplikasi terdistribusi yang kuat. Metode layanan Web XML yang memanggil metode layanan Web XML lainnya berpartisipasi dalam transaksi yang berbeda karena transaksi tidak mengalir melalui metode layanan Web XML.
Mendeklarasikan layanan Web XMLmenggunakan transaksi dari metode layanan Web XML
.
[C#]
<%@ WebService Language="C#" Class="Pesanan" %>
[Dasar Visual]
<%@ WebService Language="VB" Class="Orders" %>
Tambahkan instruksi perakitan ke System.EnterpriseServices.
<%@ Majelis name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Tambahkan referensi ke ruang nama domain System.Web.Services dan System.EnterpriseServices.
[C#]
menggunakan System.Web.Layanan;
menggunakan System.EnterpriseServices;
[Dasar Visual]
Impor Sistem.Web.Layanan
Impor System.EnterpriseServices
mendeklarasikan metode layanan Web XML dan menetapkan properti TransactionOption dari atribut WebMethod ke TransactionOption.RequiresNew.
[C#]
[Metode Web(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string Nama Belakang)
[Dasar Visual]
<Metode Web(TransactionOption:=TransactionOption.RequiresNew)> _
Fungsi Publik DeleteAuthor(lastName As String) Sebagai Integer
Contoh kode berikut menunjukkan layanan Web XML menggunakan metode layanan Web XML tunggal, yang memanggil DeleteDatabase. Metode layanan Web XML ini melakukan operasi database dalam lingkup transaksi. Jika operasi database memunculkan pengecualian, transaksi secara otomatis dihentikan; jika tidak, transaksi akan dilakukan secara otomatis.
[C#]
<%@ WebService Language="C#" Class="Pesanan" %>
<%@ Nama Majelis="System.EnterpriseServices,Version=1.0.3300.0,Culture=netral,PublicKeyToken=b03f5f7f11d50a3a" %>
menggunakan Sistem;
menggunakan Sistem.Data;
menggunakan Sistem.Data.SqlClient;
menggunakan System.Web.Layanan;
menggunakan System.EnterpriseServices;
Pesanan kelas publik : WebService
{
[Metode Web(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string Nama Belakang)
{
String deleteCmd = "HAPUS DARI penulis WHERE au_lname='" +
Nama Belakang + "'" ;
String pengecualianCausingCmdSQL = "HAPUS DARI NonExistingTable WHERE
au_lname='" + Nama Belakang + "'" ;
SqlConnection sqlConn = SqlConnection baru(
"Info Keamanan Tetap=Salah; Keamanan Terintegrasi=SSPI;database=pubs;server=serversaya")
;
Pengecualian SqlCommandCausingCmd = baru
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// Perintah ini harus dijalankan dengan benar.
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// Perintah ini menghasilkan pengecualian, jadi perintah pertama adalah
// secara otomatis dibatalkan. Karena metode layanan Web XML
// berpartisipasi dalam suatu transaksi, dan terjadi pengecualian, ASP.NET
// secara otomatis membatalkan transaksi
// dieksekusi dengan benar dibatalkan.
int cmdResult = pengecualianCausingCmd.ExecuteNonQuery(
)
;
}
}
[Dasar Visual]
<%@ WebService Language="VB" Class="Pesanan" %>
<%@ assembly name="System.EnterpriseServices" %>
Sistem Impor
ImporSistem.Data
Mengimpor Sistem.Data.SqlClient
Impor Sistem.Web.Layanan
Impor Sistem.Web.Util
Mengimpor
Pesanan Kelas Publik
System.EnterpriseServices<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Fungsi Publik DeleteAuthor (lastName sebagai String) sebagai Integer
Redupkan deleteCmdSQL As String = "HAPUS DARI penulis WHERE au_lname='" + _
Nama Belakang + "'"
Redupkan pengecualianCausingCmdSQL As String = "DELETE FROM " + _
"NonExistingTable WHERE au_lname='" + lastName + "'"
Redupkan sqlConn Sebagai SqlConnection = SqlConnection Baru( _
"Info Keamanan Tetap=Salah; Keamanan Terintegrasi=SSPI;database=pubs;server=serversaya")
Redupkan deleteCmd As SqlCommand = SqlCommand Baru(deleteCmdSQL,sqlConn)
Redupkan pengecualianCausingCmd As SqlCommand = New _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
' Perintah ini harus dijalankan dengan benar.
hapusCmd.Koneksi.Buka()
deleteCmd.ExecuteNonQuery()
' Perintah ini menghasilkan pengecualian, jadi perintah pertama adalah
' secara otomatis dibatalkan. Karena metode layanan Web XML
' berpartisipasi dalam suatu transaksi, dan terjadi pengecualian, ASP.NET
' secara otomatis membatalkan transaksi
' yang dieksekusi dengan benar dibatalkan.
Redupkan cmdResult As Integer = pengecualianCausingCmd.ExecuteNonQuery()
sqlConn.Close()
Mengembalikan cmdHasil
Fungsi Akhir
Kelas Akhir