Most popular

วันพฤหัสบดีที่ 19 พฤษภาคม พ.ศ. 2554

.Net กับ Transactions PART I

Web Service กับ Transaction

คุณสมบัติ Transaction ที่ใช้ใน Web Service มีอยู่ 5 คุณสมบัติ คือ

  • Disabled:   หากมีการเรียกใช้งานจะไม่ใช้ transaction
  • NotSupported:    หากมีการเรียกใช้งานจะไม่รองรับ transaction  
  • Required: หากมี transaction หลักอยู่แล้วให้ใช้ตัวเดิม แต่ถ้ายังไม่มีก็จะสร้างใหม่
  • RequiresNew: หากมีการเรียกใช้งาน สร้าง transaction ใหม่เสมอ โดยไม่ต้องคำนึงถึงการทำงานอื่น
  • Supported:  ให้ใช้ transaction ร่วมกันโดยไม่สร้างใหม่  
มีรูปแบบการระบุให้ใช้ Transaction ตามภาพ
เมื่อมีการระบุ RequireหNew เมื่อมีการใช้ Transaction ใน web method ให้เป็น Transaction ใหม่เสมอ
 ADO.NET DataSet(.xsd) กับ Transaction

ส่วนใหญ่ Project ที่ผู้เขียนสร้างขึ้นในการทำงาน ถ้าเขียนบน .Net ก็มักจะใช้ในส่วนของ DataSet .xsd นั่นก็คือ DataSet ที่สร้างเพื่อทำงานกับฐานข้อมูล เมื่อเรียกใช้งานจาก Visual Studio (2008/2010) โปรแกรมก็จะสร้างหน้าจอ Design โครงสร้างของ DataSet ให้ใช้งานโดยสะดวก ซึ่งก็คือการช่วยเราสร้าง Class ที่ Inheritance มาจาก System.Data.DataSet นั่นเอง แต่ผู้เขียนจะข้ามขั้นตอนนี้ไป

โครงสร้างภายในไฟล์ DataSet บรรจุ TableAdapter อยู่หลายตัว

การใช้งาน DataSet .xsd ไม่ยาก และยังประหยัดเวลาการเขียน SQL Statement อีกด้วย แต่ปัญหาก็คือเรื่องของการ Manage Transaction ซึ่งไม่สามารถระบุจุดที่เปิด Transaction ที่ on runtime code ของเราได้ เนื่องจากการสร้าง Object Instance ขึ้นมาใช้งานแทนตัวของ DataSet ทำให้การทำงานของ Transaction เป็นกลไกภายในของ Object

การแก้ปัญหาคือ การนำ TransactionScope มาใช้

TransactionScope 
อยู่ภายใน System.Transactions เมื่อเรียกมาใช้งานจะมีรูปแบบการทำงานเป็นบล๊อก คือ จะควบคุมการใช้ Transaction ภายในบล๊อกของตัวเองเท่านั้น และจะทำการ Rollback Transaction อัตโนมัติเมื่อคำสั่งภายในบล๊อกทำงานไม่สำเร็จ 

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
         //คำสั่งการทำงานกับฐานข้อมูล

         scope.Complete(); //หากการทำงานไม่สำเร็จถึงบรรทัดนี้ จะทำการ Rollback ทันที
}

ลองประยุคใช้งานจริงกับตัวอย่างข้างต้น


ค่าของ TransactionScopeOption จะสามารถระบุได้ 3 ค่า คือ
  • Required : หากไม่มี Transaction อื่นอยู่ให้สร้างขึ้นใหม่ หากมีอยู่แล้วให้ใช้ Transaction เดิม
  • Requires New : ไม่สนใจว่ามี Transaction อื่นใดอยู่หรือไม่ ให้สร้างใหม่เสมอ 
  • Suppress : ไม่สร้าง Transaction 

หมายเหตุ
การใช้ TransactionScope จำเป็นต้องตั้งค่า MSDTC Service ให้ถูกต้องด้วย

การตั้งค่า MSDTC Service (Windows XP,Server 2003)  
http://www.codeproject.com/KB/cs/MSDTC_And_TransactionScop.aspx

การตั้งค่า MSDTC Service (Windows 7)    
http://www.thereforesystems.com/turn-on-msdtc-windows-7/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น