WCF - ธุรกรรม
ธุรกรรมใน WCF คือชุดของการดำเนินการที่เป็นไปตามคุณสมบัติบางอย่างซึ่งเรียกรวมกันว่า ACID ที่นี่หากการดำเนินการเดียวล้มเหลวระบบทั้งหมดจะล้มเหลวโดยอัตโนมัติ เมื่อมีการสั่งซื้อทางออนไลน์ธุรกรรมจะเกิดขึ้น ตัวอย่างต่อไปนี้จะเป็นประโยชน์ในการทำความเข้าใจกระบวนการทำธุรกรรมในแง่ที่ง่ายขึ้น
ตัวอย่าง
สมมติว่าคุณสั่งซื้อโทรทัศน์ LCD จากร้านค้าออนไลน์และคุณกำลังจะชำระเงินด้วยบัตรเครดิตของคุณ เมื่อคุณป้อนข้อมูลที่จำเป็นเพื่อสั่งซื้อการดำเนินการสองอย่างจะเกิดขึ้นพร้อมกัน
หนึ่งจำนวนเงินที่ระบุจะถูกหักจากบัญชีธนาคารของคุณและอย่างที่สองบัญชีผู้จัดจำหน่ายจะได้รับเครดิตในจำนวนเดียวกัน การดำเนินการทั้งสองต้องดำเนินการสำเร็จจึงจะมีธุรกรรมที่ประสบความสำเร็จ
คุณสมบัติการทำธุรกรรม WCF
คุณสมบัติทั้งสี่ตามด้วยธุรกรรม WCF มีดังต่อไปนี้ -
Atomic - การดำเนินการทั้งหมดจะต้องทำเป็นการดำเนินการที่แบ่งแยกไม่ได้เพียงครั้งเดียวเมื่อเสร็จสิ้นการทำธุรกรรม
Consistency - ไม่ว่าจะเป็นชุดปฏิบัติการอะไรก็ตามระบบจะอยู่ในสภาพที่สอดคล้องกันเสมอกล่าวคือผลลัพธ์ของธุรกรรมจะเป็นไปตามความคาดหมายเสมอ
Isolation - สถานะตัวกลางของระบบจะไม่ปรากฏแก่หน่วยงานใด ๆ ของโลกภายนอกจนกว่าการทำธุรกรรมจะเสร็จสมบูรณ์
Durability - สถานะการทำงานจะได้รับการบำรุงรักษาโดยไม่คำนึงถึงความล้มเหลวใด ๆ (ฮาร์ดแวร์ไฟดับ ฯลฯ )
ในขณะกำหนดค่าธุรกรรม WCF มีปัจจัยบางอย่างที่ต้องพิจารณา สิ่งเหล่านี้เป็นพฤติกรรมการผูกมัดและการดำเนินการ
Binding- การผูกที่รองรับธุรกรรมใน WCF มีเพียงไม่กี่รายการและจำเป็นอย่างยิ่งที่จะต้องเลือกเฉพาะการเชื่อมโยงเหล่านี้ซึ่งยังคงปิดใช้งานตามค่าเริ่มต้นและควรเปิดใช้งานเพื่อรับการสนับสนุนที่จำเป็นสำหรับธุรกรรม การผูกเหล่านี้มีดังนี้ -
- NetTcpBinding
- NetNamedPipeBinding
- WSHttpBinding
- WSDualHttpBinding
- WSFederationHttpBinding
Operation behavior- แม้ว่าการผูกจะอำนวยความสะดวกให้กับเส้นทางสำหรับการเผยแพร่ธุรกรรมการดำเนินการจะดูแลการประมวลผลธุรกรรมและการกำหนดค่าการดำเนินการ ลักษณะการทำงานส่วนใหญ่ใช้สองแอตทริบิวต์: TransactionFlow และ TransactionScopeRequired ที่นี่ควรสังเกตว่า TransactionFlow มีค่าสามค่าหลัก ๆ ดังนี้: Allowed, Mandatory และ NotAllowed
รหัสต่อไปนี้แสดงว่าการเปลี่ยนการกำหนดค่าของสัญญาผูกมัดและการดำเนินการอำนวยความสะดวกในการเผยแพร่ไคลเอนต์หรือไม่
<bindings>
<wsHttpBinding>
<binding name = "MandatoryTransBinding" transactionFlow = "true">
<reliableSession enabled ="true"/>
</binding>
</wsHttpBinding>
</bindings>
โปรโตคอลการทำธุรกรรม
WCF ใช้โปรโตคอลสามประเภทสำหรับการทำธุรกรรม -
- Lightweight
- ธุรกรรม Ole
- ธุรกรรม WS- ปรมาณู (WS-AT)
WS-AT เป็นโปรโตคอลที่ทำงานร่วมกันได้และช่วยให้การไหลเวียนของธุรกรรมแบบกระจายผ่านไฟร์วอลล์ อย่างไรก็ตามไม่ควรใช้โปรโตคอลนี้เมื่อธุรกรรมนั้นขึ้นอยู่กับเทคโนโลยีของ Microsoft อย่างเคร่งครัด
ขั้นตอนของการทำธุรกรรม WCF
ธุรกรรม WCF มีสองขั้นตอนดังแสดงในรูปต่อไปนี้
Prepare Phase - ในขั้นตอนนี้ตัวจัดการธุรกรรมจะตรวจสอบว่าเอนทิตีทั้งหมดพร้อมที่จะทำธุรกรรมหรือไม่
Commit Phase - ในระยะนี้ความมุ่งมั่นของเอนทิตีเริ่มต้นในความเป็นจริง
รูปต่อไปนี้แสดงการทำงานของทั้งสองขั้นตอนของธุรกรรม WCF
การเปิดใช้งานธุรกรรม WCF
ในการเปิดใช้งานธุรกรรม WCF ได้สำเร็จเราต้องทำตามชุดของหกขั้นตอนในลักษณะตามลำดับ ขั้นตอนที่จำเป็นจะกล่าวถึงด้านล่าง
Step 1 − Creation of two WCF Services
ขั้นตอนที่สำคัญที่สุดในเรื่องนี้คือการสร้างโครงการบริการสองโครงการใน WCF เพื่อเข้าร่วมในธุรกรรมเดียว ธุรกรรมฐานข้อมูลจะดำเนินการกับบริการทั้งสองนี้และจะเข้าใจว่าการทำธุรกรรม WCF เป็นหนึ่งเดียวกันอย่างไร นอกจากนี้ยังมีการสร้างเว็บแอปพลิเคชันของธุรกรรม WCFT เพื่อใช้บริการที่สร้างขึ้นสองบริการในขอบเขตธุรกรรมเดียว
Step 2 − Method creation and its attribution with TransactionFlow attribute
ที่นี่เมธอด UpdateData จะถูกสร้างขึ้นสำหรับทั้งบริการ WCF เพื่อแทรกลงในฐานข้อมูลด้วยแอ็ตทริบิวต์ OperationContract ในการทำงานนี้ให้สำเร็จคลาสอินเตอร์เฟสถูกสร้างขึ้นก่อนด้วยความช่วยเหลือของแอตทริบิวต์ ServiceContract สำหรับการเปิดใช้งานธุรกรรมในเมธอดที่สร้างขึ้นใหม่จะถูกนำมาประกอบกับ TransactionFlow และอนุญาตให้ใช้ธุรกรรมได้โดยใช้ค่าที่อนุญาต
[ServiceContract]
public interface IService1 {
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
Step 3− Implementation of WCF service with TransactionScopeRequired attribute
ทำได้โดยใช้รหัสที่แสดงด้านล่าง -
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
try {
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
Boolean doRollback = false;
using(SqlCommand cmd = new SqlCommand(
"insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
try {
cmd.ExecuteNonQuery();
} catch(SqlException) {
doRollback = true;
break;
}
}
if(doRollback)
transaction.Rollback();
else
transaction.Commit();
}
finally {
objConection.Close();
}
}
Step 4 − Enabling Transaction Flow by WCF Service Config File
การเข้ารหัสทำได้ดังนี้ -
<bindings>
<wsHttpBinding>
<binding name = "TransactionalBind" transactionFlow = "true"/>
</wsHttpBinding>
</bindings>
จำเป็นอย่างยิ่งที่จะต้องแนบธุรกรรมที่ได้รับอนุญาตผูกพันกับปลายทางเพื่อเปิดเผยบริการ WCF
<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">
Step 5 − Calling both the services in a single transaction
ที่นี่เรียกใช้บริการสองรายการข้างต้นในธุรกรรมเดียวและเพื่อจุดประสงค์นี้วัตถุ TransactionScope ถูกใช้เพื่อจัดกลุ่มทั้งบริการ วิธีการที่สมบูรณ์ของออบเจ็กต์ข้างต้นถูกเรียกให้กระทำธุรกรรม WCF ในการย้อนกลับจะมีการเรียกใช้เมธอด Dispose
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
// Call your webservice transactions here
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
ส่วนเล็ก ๆ ของโค้ดที่สมบูรณ์ซึ่งการทำธุรกรรม WCF ถูกจัดกลุ่มไว้ในขอบเขตเดียวนั้นแสดงอยู่ด้านล่าง -
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Step 6 − Testing WCF transaction
การทดสอบจะทำในขั้นตอนที่ 6 และขั้นสุดท้ายและหลังจากเรียกใช้บริการ WCF ครั้งที่ 1 แล้วจะมีการบังคับใช้ข้อยกเว้น