ชุดบรรยาย ASP (21) การสร้างสคริปต์ธุรกรรม
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:58:32
แอปพลิเคชันทางธุรกิจมักต้องการความสามารถในการรันสคริปต์และส่วนประกอบภายในธุรกรรม ธุรกรรมคือการทำงานของเซิร์ฟเวอร์ แม้ว่าการดำเนินการจะมีหลายขั้นตอน (เช่น การสั่งซื้อ การตรวจสอบสินค้าคงคลัง การชำระบิล ฯลฯ) ก็สามารถส่งคืนความสำเร็จหรือความล้มเหลวโดยรวมของการดำเนินการเท่านั้น ผู้ใช้สามารถสร้างสคริปต์ ASP ที่ทำงานภายในธุรกรรมได้ หากส่วนใดส่วนหนึ่งของสคริปต์ล้มเหลว ธุรกรรมทั้งหมดจะยุติลง
การประมวลผลธุรกรรม ASP ขึ้นอยู่กับ Microsoft Transaction Server (MTS) Microsoft Transaction Server (MTS) คือระบบประมวลผลธุรกรรมสำหรับการพัฒนา กำหนดค่า และจัดการแอปพลิเคชันเซิร์ฟเวอร์อินเทอร์เน็ตและอินทราเน็ตระดับองค์กรที่มีประสิทธิภาพสูง ปรับขนาดได้ และแข็งแกร่ง เซิร์ฟเวอร์ธุรกรรมจัดเตรียมโมเดลการออกแบบแอปพลิเคชันสำหรับการพัฒนาแอปพลิเคชันแบบกระจายที่ใช้คอมโพเนนต์ นอกจากนี้ยังมีสภาพแวดล้อมรันไทม์สำหรับการกำหนดค่าและการจัดการแอปพลิเคชันเหล่านี้
ความสามารถในการสร้างสคริปต์ธุรกรรมมีอยู่ในเซิร์ฟเวอร์ข้อมูลทางอินเทอร์เน็ตและเว็บเซิร์ฟเวอร์ส่วนบุคคล ถ้าคุณมี Microsoft Transaction Server ติดตั้งอยู่ คุณสามารถจัดแพคเกจส่วนประกอบเพื่อให้ทำงานภายในธุรกรรมได้
เกี่ยวกับธุรกรรม ธุรกรรมคือความสำเร็จหรือความล้มเหลวโดยรวมของการดำเนินการ การประมวลผลธุรกรรมใช้เพื่ออัพเดตฐานข้อมูลได้อย่างน่าเชื่อถือ เมื่อทำการเปลี่ยนแปลงที่เกี่ยวข้องกับฐานข้อมูลหลายรายการหรืออัปเดตหลายฐานข้อมูลพร้อมกัน ตรวจสอบให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดได้รับการดำเนินการอย่างถูกต้อง หากการเปลี่ยนแปลงใดๆ เหล่านี้ล้มเหลว จำเป็นต้องคืนค่าสถานะดั้งเดิมของตารางฐานข้อมูล
หากไม่มี MTS คุณจะต้องเขียนสคริปต์และส่วนประกอบเพื่อติดตามการเปลี่ยนแปลงที่ร้องขอด้วยตนเอง เพื่อกู้คืนข้อมูลหากการเปลี่ยนแปลงบางอย่างล้มเหลว เมื่อใช้ MTS คุณเพียงประกาศสคริปต์และส่วนประกอบของคุณว่า "ต้องมีธุรกรรม" และปล่อยให้ MTS จัดการความสอดคล้องของธุรกรรม การประมวลผลธุรกรรมใช้กับการเข้าถึงฐานข้อมูลเท่านั้น MTS ไม่สามารถกู้คืนการเปลี่ยนแปลงไปยังระบบไฟล์หรือทรัพยากรอื่น ๆ ที่ไม่ใช่ธุรกรรมได้ ฐานข้อมูลที่เข้าถึงโดยแอปพลิเคชันจะต้องได้รับการสนับสนุนโดย MTS ปัจจุบัน MTS รองรับ SQL Server และเซิร์ฟเวอร์ใดๆ ที่รองรับโปรโตคอล XA (ระบุโดย X/Open Association) MTS จะยังคงขยายการรองรับฐานข้อมูลอื่นๆ ต่อไป
ธุรกรรมไม่สามารถขยายเพจ ASP หลายหน้าได้ ถ้าธุรกรรมต้องใช้ออบเจ็กต์จากหลายส่วนประกอบ การดำเนินการที่ใช้ออบเจ็กต์เหล่านี้ต้องถูกรวมไว้ในเพจ ASP ตัวอย่างเช่น สมมติว่าคุณมีส่วนประกอบที่อัปเดตฐานข้อมูลบัญชีเงินเดือนและส่วนประกอบที่อัปเดตบันทึกพนักงานในฐานข้อมูลทรัพยากรบุคคล ในการบันทึกข้อมูลเงินเดือนใหม่สำหรับพนักงาน คุณต้องเขียนสคริปต์ที่เรียกองค์ประกอบทั้งสองนี้ในบริบทของธุรกรรม หนึ่งรายการเพื่ออัปเดตฐานข้อมูลบัญชีเงินเดือน และอีกรายการเพื่ออัปเดตเกรดพนักงานในฐานข้อมูลทรัพยากรบุคคล
การประกาศสคริปต์ธุรกรรม เมื่อคุณประกาศเพจเป็นทรานแซคชัน คำสั่งสคริปต์และอ็อบเจ็กต์ใดๆ ในเพจจะทำงานในสภาพแวดล้อมของธุรกรรมเดียวกัน เซิร์ฟเวอร์ธุรกรรมจัดการรายละเอียดของการสร้างธุรกรรมและกำหนดว่าธุรกรรมสำเร็จ (กระทำ) หรือล้มเหลว (ยุติ) หากต้องการประกาศเพจเป็นธุรกรรม ให้เพิ่มคำสั่ง @TRANSACTION ที่ด้านบนของเพจ:
<%@ ธุรกรรม = มูลค่า %>
พารามิเตอร์ค่าอาจเป็นค่าใดค่าหนึ่งต่อไปนี้:
ความหมายคุณค่า
Requires_New เริ่มต้นธุรกรรมใหม่
จำเป็นต้องเริ่มธุรกรรมใหม่
รองรับไม่เริ่มธุรกรรม
Not_Supported ไม่เริ่มการทำธุรกรรม
คำสั่ง @TRANSACTION ต้องอยู่ในบรรทัดแรกของหน้า มิฉะนั้นจะเกิดข้อผิดพลาด ต้องเพิ่มคำสั่งนี้ในทุกเพจที่ต้องดำเนินการภายใต้ธุรกรรม เมื่อการประมวลผลสคริปต์สิ้นสุดลง ธุรกรรมปัจจุบันจะสิ้นสุดลง
แอปพลิเคชันส่วนใหญ่ต้องการสภาพแวดล้อมการทำธุรกรรมสำหรับการดำเนินการบางอย่างเท่านั้น ตัวอย่างเช่น เว็บไซต์สายการบินอาจต้องการเพียงสคริปต์ธุรกรรมเพื่อจัดการการจองตั๋วและการจัดที่นั่ง ในขณะที่สคริปต์อื่นๆ ทั้งหมดสามารถทำงานได้อย่างปลอดภัยโดยไม่มีสภาพแวดล้อมการทำธุรกรรม เนื่องจากธุรกรรมจำเป็นต้องใช้สำหรับเพจที่ต้องการการประมวลผลธุรกรรมเท่านั้น อย่าประกาศไฟล์ Global.asa ของแอปพลิเคชันของคุณให้เป็นธุรกรรม
หากธุรกรรมถูกยกเลิก เซิร์ฟเวอร์ธุรกรรมจะคืนค่าการเปลี่ยนแปลงใด ๆ ไปยังทรัพยากรที่สำรองธุรกรรม ในปัจจุบัน เฉพาะเซิร์ฟเวอร์ฐานข้อมูลเท่านั้นที่รองรับธุรกรรมอย่างสมบูรณ์ เนื่องจากข้อมูลในฐานข้อมูลมีความสำคัญที่สุดสำหรับแอปพลิเคชันระดับองค์กร เซิร์ฟเวอร์ธุรกรรมไม่คืนค่าการเปลี่ยนแปลงในไฟล์ ตัวแปรเซสชันและแอปพลิเคชัน คอลเลกชัน ฯลฯ บนฮาร์ดดิสก์ อย่างไรก็ตาม คุณสามารถคืนค่าสคริปต์ของตัวแปรและคอลเลกชันได้โดยการเขียนเหตุการณ์ธุรกรรม ตามที่อธิบายไว้ในหัวข้อต่อไปนี้ ในบางครั้ง สคริปต์ของคุณยังสามารถยอมรับหรือยุติธุรกรรมได้อย่างชัดเจน เช่น เมื่อการเขียนข้อมูลลงในไฟล์ล้มเหลว
ยอมรับหรือยุติสคริปต์ เนื่องจาก Transaction Server ติดตามการประมวลผลธุรกรรม จึงกำหนดว่าธุรกรรมสำเร็จหรือล้มเหลวโดยสมบูรณ์ สคริปต์สามารถยุติธุรกรรมได้อย่างชัดเจนโดยการเรียก ObjectContext.SetAbort ตัวอย่างเช่น สคริปต์จำเป็นต้องยุติธุรกรรมเมื่อได้รับข้อความแสดงข้อผิดพลาดจากส่วนประกอบ ละเมิดข้อกำหนดทางธุรกิจ (เช่น ยอดคงเหลือในบัญชีน้อยกว่า 0) หรือล้มเหลวสำหรับการดำเนินการที่ไม่ใช่ธุรกรรม เช่น การอ่านและการเขียนไฟล์ หากเพจหมดเวลาก่อนที่ธุรกรรมจะเสร็จสมบูรณ์ ธุรกรรมนั้นจะต้องถูกยกเลิกด้วย
การเขียนสคริปต์เหตุการณ์ธุรกรรมเพียงอย่างเดียวไม่ได้กำหนดว่าธุรกรรมสำเร็จหรือล้มเหลว อย่างไรก็ตาม คุณสามารถเขียนเหตุการณ์ที่ถูกเรียกเมื่อมีการยืนยันหรือยุติธุรกรรมได้ ตัวอย่างเช่น หากคุณมีสคริปต์ที่ยืนยันบัญชีธนาคาร และคุณต้องการส่งคืนเพจที่แตกต่างกันให้กับผู้ใช้สำหรับสถานะที่แตกต่างกันของธุรกรรม คุณสามารถใช้เหตุการณ์ OnTransactionCommit และ OnTransactionAbort เพื่อเขียนการตอบกลับที่แตกต่างกันไปยังผู้ใช้ได้
<%@ ธุรกรรม = จำเป็น %>
-
'เอาต์พุตบัฟเฟอร์เพื่อให้สามารถแสดงหน้าต่างๆ ได้
Response.Buffer = จริง
-
<HTML>
<ร่างกาย>
<H1>ยินดีต้อนรับสู่บริการธนาคารออนไลน์</H1>
-
ตั้งค่า BankAction = Server.CreateObject("MyExample.BankComponent")
BankAction.Deposit(คำขอ("AcctNum"))
-
<P>ขอบคุณ ธุรกรรมของคุณกำลังได้รับการประมวลผล</P>
</ร่างกาย>
</HTML>
-
' แสดงหน้านี้หากการทำธุรกรรมสำเร็จ
SubOnTransactionCommit ()
ตอบกลับเขียน "<HTML>"
ตอบกลับเขียน "<BODY>"
ตอบกลับเขียนว่า "ขอบคุณ บัญชีของคุณได้รับเครดิตแล้ว"
ตอบกลับเขียน "</BODY>"
ตอบกลับเขียน "</HTML>"
การตอบสนองฟลัช()
จบย่อย
-
-
' แสดงหน้านี้หากการทำธุรกรรมล้มเหลว
SubOnTransactionAbort ()
การตอบสนอง.Clear()
ตอบกลับเขียน "<HTML>"
ตอบกลับเขียน "<BODY>"
ตอบกลับเขียนว่า "เราไม่สามารถทำธุรกรรมของคุณให้เสร็จสิ้นได้"
ตอบกลับเขียน "</BODY>"
ตอบกลับเขียน "</HTML>"
การตอบสนองฟลัช()
จบย่อย
-
การลงทะเบียนส่วนประกอบในตัวจัดการทรัพยากร MTS เพื่อเข้าร่วมในธุรกรรม ส่วนประกอบจะต้องลงทะเบียนในแพ็คเกจ MTS และต้องกำหนดค่าให้ต้องมีธุรกรรม ตัวอย่างเช่น หากสคริปต์ของคุณจัดการคำสั่งซื้อโดยการเรียกสองคอมโพเนนต์ คอมโพเนนต์หนึ่งจะอัปเดตฐานข้อมูลสินค้าคงคลัง และอีกตัวจะอัปเดตฐานข้อมูลการชำระเงิน จากนั้น ส่วนประกอบทั้งสองนี้จะต้องทำงานในสภาพแวดล้อมธุรกรรมเดียวกัน Transaction Server รับประกันว่าหากส่วนประกอบใดล้มเหลว จะไม่มีการอัพเดตฐานข้อมูล ส่วนประกอบบางอย่างไม่จำเป็นต้องมีการทำธุรกรรม ตัวอย่างเช่น ส่วนประกอบ Ad Rotator
ลงทะเบียนและกำหนดค่าส่วนประกอบของธุรกรรมโดยใช้ MTS Resource Manager คุณสมบัติของธุรกรรมจะต้องตั้งค่าเป็น ต้องมีธุรกรรม หรือ ต้องมีธุรกรรมใหม่ ส่วนประกอบของธุรกรรมจะต้องลงทะเบียนในแพ็คเกจ MTS แทนที่จะวางส่วนประกอบในแพ็คเกจที่อยู่ระหว่างดำเนินการของ IIS ให้สร้างแพ็คเกจของคุณเอง โดยทั่วไปแล้ว ส่วนประกอบทั้งหมดควรอยู่ในไลบรารีส่วนประกอบ ส่วนประกอบของไลบรารีส่วนประกอบสามารถใช้งานได้โดยแอปพลิเคชัน ASP หลายตัวและทำงานในกระบวนการแอปพลิเคชัน ASP ใช้ MTS Explorer เพื่อสร้างแพ็คเกจใหม่และตั้งค่าคุณสมบัติการเปิดใช้งานของแพ็คเกจเป็น Library
ส่วนประกอบของธุรกรรมสามารถลงทะเบียนในแพ็คเกจเซิร์ฟเวอร์ได้ แพ็คเกจเซิร์ฟเวอร์มักจะทำงานเป็นกระบวนการแยกต่างหากบนเซิร์ฟเวอร์ หากคุณต้องการใช้การตรวจสอบความปลอดภัยตามกลุ่มการทำงาน หรือหากคุณต้องการให้ส่วนประกอบของคุณสามารถเข้าถึงได้โดยแอปพลิเคชันบนคอมพิวเตอร์ระยะไกล ให้ใช้แพ็คเกจเซิร์ฟเวอร์สำหรับส่วนประกอบของธุรกรรม
หากต้องการใช้ MTS Explorer จะต้องติดตั้ง Microsoft Transaction Server
ขอบเขตของวัตถุ โดยทั่วไป อย่าเก็บวัตถุที่สร้างจากคอมโพเนนต์ MTS ในวัตถุ ASP Application หรือ Session วัตถุ MTS หายไปหลังจากธุรกรรมเสร็จสมบูรณ์ เนื่องจากวัตถุเซสชันและวัตถุแอปพลิเคชันได้รับการออกแบบมาสำหรับอินสแตนซ์ของวัตถุที่ใช้ระหว่างเพจ ASP ที่แตกต่างกัน อย่าใช้เพื่อจัดเก็บวัตถุที่เผยแพร่เมื่อสิ้นสุดธุรกรรม
สคริปต์ ASP เป็นรากของธุรกรรมที่ประกาศ ซึ่งเป็นจุดเริ่มต้น วัตถุ MTS ใด ๆ ที่ใช้โดยเพจ ASP ของธุรกรรมจะถือว่าเป็นส่วนหนึ่งของธุรกรรม เมื่อธุรกรรมเสร็จสมบูรณ์ วัตถุ MTS ที่ใช้ในเพจจะหายไป รวมถึงวัตถุที่เก็บไว้ในวัตถุเซสชันหรือแอปพลิเคชัน หลังจากจุดนี้ ความพยายามในการเรียกวัตถุที่กำหนดขอบเขตเซสชันหรือแอปพลิเคชันจากเพจธุรกรรมอื่นจะล้มเหลว
การเข้าคิวธุรกรรม การอัพเดตฐานข้อมูลจากเซิร์ฟเวอร์ระยะไกลอาจทำให้ธุรกรรมล่าช้าหรือยุติลงเนื่องจากความล่าช้าหรือความล้มเหลวของเครือข่าย เนื่องจากทุกส่วนของธุรกรรมต้องกระทำ แอปพลิเคชันอาจหยุดทำงาน รอการคอมมิตหรือยกเลิกข้อความจากเซิร์ฟเวอร์ระยะไกล หรือธุรกรรมอาจถูกยกเลิกเนื่องจากไม่สามารถส่งการอัปเดตฐานข้อมูลได้
สำหรับการอัปเดตที่ต้องดำเนินการพร้อมกัน วิธีการที่ถูกต้องคือการยกเลิกธุรกรรมหรือชะลอการทำธุรกรรมให้เสร็จสิ้นจนกว่าผู้เข้าร่วมทั้งหมดในธุรกรรมจะสามารถกระทำได้ ตัวอย่างเช่น ขั้นตอนการจองของสายการบินควรหักบัญชีธนาคารของลูกค้าและเครดิตเข้าบัญชีธนาคารของสายการบินไปพร้อมๆ กัน หากการอัปเดตเป็นส่วนหนึ่งของธุรกรรมโดยรวม แต่อาจช้ากว่าการอัปเดตอื่นๆ คุณอาจไม่ต้องการให้ลูกค้ารอให้กระบวนการอัปเดตทั้งหมดเสร็จสิ้น ตัวอย่างเช่น ธุรกรรมการจองเที่ยวบินอาจส่งคำสั่งซื้ออาหารไปยังซัพพลายเออร์อาหารหรืออัปเดตค่าเดินทางของลูกค้า แม้ว่าการดำเนินการเหล่านี้จะต้องเสร็จสิ้น แต่ก็สามารถทำได้ในภายหลัง
Microsoft Message Queue Server ช่วยให้คุณสามารถรวมการอัปเดตหรือชุดการอัปเดตลงในข้อความธุรกรรมไปยังเซิร์ฟเวอร์ระยะไกลได้ Message Queue Server รับประกันว่าการอัปเดตจะถูกส่งไปยังเซิร์ฟเวอร์ระยะไกลแม้ว่าเครือข่ายจะไม่พร้อมใช้งานในขณะนี้ก็ตาม แอปของคุณจะได้รับข้อความยืนยันและสามารถประมวลผลธุรกรรมต่อไปได้