การสนับสนุนธุรกรรมสำหรับบริการเว็บ XML ใช้ประโยชน์จากการสนับสนุนในรันไทม์ภาษาทั่วไป ซึ่งอิงตามรูปแบบธุรกรรมแบบกระจายเดียวกันกับที่พบใน Microsoft Transaction Server (MTS) และ COM+ Services แบบจำลองนี้ขึ้นอยู่กับการกำหนดอย่างชัดเจนว่าออบเจ็กต์มีส่วนร่วมในธุรกรรมหรือไม่ แทนที่จะเขียนโค้ดเฉพาะเพื่อจัดการการมอบหมายและการเรียกกลับสำหรับธุรกรรม สำหรับบริการเว็บ XML ที่สร้างขึ้นโดยใช้ ASP.NET คุณสามารถประกาศลักษณะการทำงานของธุรกรรมของบริการเว็บ XML ได้โดยการตั้งค่าแอตทริบิวต์ TransactionOption ของแอตทริบิวต์ WebMethod ที่ใช้กับวิธีการบริการเว็บ XML หากมีข้อยกเว้นเกิดขึ้นเมื่อดำเนินการวิธีการบริการเว็บ XML ธุรกรรมจะสิ้นสุดลงโดยอัตโนมัติ ในทางกลับกัน หากไม่มีข้อยกเว้นเกิดขึ้น ธุรกรรมจะถูกมอบหมายโดยอัตโนมัติ
คุณลักษณะ TransactionOption ของแอตทริบิวต์ WebMethod ระบุว่าวิธีการบริการเว็บ XML มีส่วนร่วมในธุรกรรมอย่างไร แม้ว่าระดับการประกาศนี้แสดงถึงตรรกะของธุรกรรม แต่ก็เป็นขั้นตอนที่ห่างไกลจากธุรกรรมจริง ธุรกรรมจริงเกิดขึ้นเมื่อออบเจ็กต์ธุรกรรมเข้าถึงแหล่งข้อมูล (เช่น ฐานข้อมูลหรือคิวข้อความ) ธุรกรรมที่เกี่ยวข้องกับออบเจ็กต์นี้จะไหลไปยังผู้จัดการทรัพยากรที่เหมาะสมโดยอัตโนมัติ ผู้ให้บริการข้อมูล .NET Framework เช่น .NET Framework Data Provider (สำหรับ SQL Server หรือ OLE DB) จะค้นหาธุรกรรมในบริบทของออบเจ็กต์และจัดทำแค็ตตาล็อกผ่าน Distributed Transaction Coordinator (DTC, Distributed Transaction Coordinator) ธุรกรรมทั้งหมดถูกสร้างขึ้นโดยอัตโนมัติ
วิธีการบริการเว็บ XML สามารถมีส่วนร่วมในธุรกรรมที่เป็นรากของธุรกรรมใหม่เท่านั้น เนื่องจากเป็นรากของธุรกรรมใหม่ การโต้ตอบทั้งหมดกับผู้จัดการทรัพยากร (เช่น เซิร์ฟเวอร์ที่ใช้ Microsoft SQL Server, Microsoft Message Queuing และ Microsoft Host Integration Server) จะรักษาคุณสมบัติ ACID ที่จำเป็นในการรันแอปพลิเคชันแบบกระจายที่มีประสิทธิภาพ วิธีการบริการเว็บ XML ที่เรียกวิธีการบริการเว็บ XML อื่น ๆ มีส่วนร่วมในธุรกรรมที่แตกต่างกันเนื่องจากธุรกรรมไม่ไหลผ่านวิธีการบริการเว็บ XML
ประกาศบริการเว็บ XMLโดยใช้ธุรกรรมจากวิธีการบริการเว็บ
XML
[ค#]
<%@ WebService Language="C#" Class="คำสั่งซื้อ" %>
[วิชวลพื้นฐาน]
<%@ WebService Language="VB" Class="Orders" %>
เพิ่มคำสั่งแอสเซมบลีให้กับ System.EnterpriseServices
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
เพิ่มการอ้างอิงไปยังช่องว่างชื่อโดเมน System.Web.Services และ System.EnterpriseServices
[ค#]
ใช้ System.Web.Services;
ใช้ System.EnterpriseServices;
[วิชวลพื้นฐาน]
นำเข้า System.Web.Services
นำเข้า System.EnterpriseServices
ประกาศวิธีการบริการเว็บ XML และตั้งค่าคุณสมบัติ TransactionOption ของแอตทริบิวต์ WebMethod เป็น TransactionOption.RequiresNew
[ค#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
สาธารณะ int DeleteAuthor (สตริงนามสกุล)
[วิชวลพื้นฐาน]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
ฟังก์ชันสาธารณะ DeleteAuthor(lastName As String) As Integer
ตัวอย่างโค้ดต่อไปนี้แสดงบริการเว็บ XML โดยใช้วิธีการบริการเว็บ XML เดียว เรียก DeleteDatabase วิธีการบริการเว็บ XML นี้ดำเนินการฐานข้อมูลภายในขอบเขตของธุรกรรม หากการดำเนินการฐานข้อมูลเกิดข้อยกเว้น ธุรกรรมจะหยุดโดยอัตโนมัติ มิฉะนั้น ธุรกรรมจะกระทำโดยอัตโนมัติ
[ค#]
<%@ WebService Language="C#" Class="คำสั่งซื้อ" %>
<%@ ชื่อแอสเซมบลี = "System.EnterpriseServices, Version = 1.0.3300.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = b03f5f7f11d50a3a" % >
ใช้ระบบ;
ใช้ System.Data;
โดยใช้ System.Data.SqlClient;
ใช้ System.Web.Services;
ใช้ System.EnterpriseServices
คำสั่งคลาสสาธารณะ: WebService
-
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
สาธารณะ int DeleteAuthor (สตริงนามสกุล)
-
String DeleteCmd = "ลบจากผู้เขียนโดยที่ au_lname='" +
นามสกุล + "'" ;
String ข้อยกเว้น CausingCmdSQL = "ลบจาก NonExistingTable WHERE
au_lname='" + นามสกุล + "'" ;
SqlConnection sqlConn = SqlConnection ใหม่ (
"คงข้อมูลความปลอดภัย = เท็จ; ความปลอดภัยแบบรวม = SSPI; ฐานข้อมูล = pubs; เซิร์ฟเวอร์ = myserver");
SqlCommand DeleteCmd = SqlCommand ใหม่ (deleteCmdSQL, sqlConn);
SqlCommand ข้อยกเว้น CausingCmd = ใหม่
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// คำสั่งนี้ควรดำเนินการอย่างถูกต้อง
ลบCmd.Connection.Open();
DeleteCmd.ExecuteNonQuery();
// คำสั่งนี้ส่งผลให้เกิดข้อยกเว้น ดังนั้นคำสั่งแรกจึงเป็น
// ย้อนกลับโดยอัตโนมัติ เนื่องจากวิธีการบริการเว็บ XML คือ
// เข้าร่วมในธุรกรรมและมีข้อยกเว้นเกิดขึ้น ASP.NET
// ยกเลิกธุรกรรมโดยอัตโนมัติ
// ดำเนินการอย่างถูกต้องถูกย้อนกลับ
int cmdResult = ข้อยกเว้น CausingCmd.ExecuteNonQuery();
sqlConn.Close()
;
-
-
[วิชวลพื้นฐาน]
<%@ WebService Language="VB" Class="คำสั่งซื้อ" %>
<%@ ชื่อแอสเซมบลี = "System.EnterpriseServices" %>
นำเข้าระบบ
ImportsSystem.Data
นำเข้า System.Data.SqlClient
นำเข้า System.Web.Services
นำเข้า System.Web.Util
ใบสั่งคลาสสาธารณะ
System.EnterpriseServices
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
ฟังก์ชั่นสาธารณะ DeleteAuthor (นามสกุลเป็นสตริง) เป็นจำนวนเต็ม
Dim ลบCmdSQL As String = "ลบจากผู้เขียน WHERE au_lname='" + _
นามสกุล + "'"
ข้อยกเว้นเล็กน้อย CausingCmdSQL As String = "ลบจาก" + _
"NonExistingTable WHERE au_lname='" + นามสกุล + "'"
Dim sqlConn As SqlConnection = SqlConnection ใหม่ ( _
"Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver")
Dim DeleteCmd As SqlCommand = New SqlCommand(deleteCmdSQL,sqlConn)
Dim ข้อยกเว้น CausingCmd As SqlCommand = ใหม่ _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
' คำสั่งนี้ควรดำเนินการอย่างถูกต้อง
ลบCmd.Connection.Open()
DeleteCmd.ExecuteNonQuery()
' คำสั่งนี้ส่งผลให้เกิดข้อยกเว้น ดังนั้นคำสั่งแรกจึงเป็นเช่นนั้น
' ย้อนกลับโดยอัตโนมัติ เนื่องจากวิธีการบริการเว็บ XML คือ
' เข้าร่วมในธุรกรรมและมีข้อยกเว้นเกิดขึ้น ASP.NET
' ยกเลิกธุรกรรมโดยอัตโนมัติ
' ดำเนินการอย่างถูกต้องถูกย้อนกลับ
Dim cmdResult As Integer = ข้อยกเว้น CausingCmd.ExecuteNonQuery()
sqlConn.Close()
ส่งคืน cmdResult
ฟังก์ชันสิ้นสุด
จบคลาส