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 แล้วจะมีการบังคับใช้ข้อยกเว้น