เมื่อพัฒนาเว็บแอปพลิเคชัน จำเป็นอย่างยิ่งที่จะต้องเข้าถึงฐานข้อมูลเพื่อดำเนินการให้เสร็จสิ้น เช่น การสืบค้น การแทรก การอัปเดต และการลบข้อมูล ได้รับผลกระทบจากตรรกะของแอปพลิเคชัน บางครั้งจำเป็นต้องรวมคำสั่งการดำเนินการฐานข้อมูลหลายรายการไว้ในหน่วยงาน (ธุรกรรม) ในฐานข้อมูล ธุรกรรมหมายถึงชุดของหน่วยปฏิบัติการเชิงตรรกะที่แปลงข้อมูลจากสถานะหนึ่งไปอีกสถานะหนึ่ง เพื่อให้มั่นใจถึงความสอดคล้องของข้อมูลในฐานข้อมูล ควรดำเนินการข้อมูลในกลุ่มหน่วยลอจิคัลที่แยกจากกัน: เมื่อเสร็จสมบูรณ์ทั้งหมดแล้ว ความสอดคล้องของข้อมูลก็สามารถคงไว้ได้ แต่เมื่อส่วนหนึ่งของการดำเนินการในหน่วยล้มเหลว ทั้งหมด ธุรกรรมจะถูกละเว้น การดำเนินการทั้งหมดตั้งแต่จุดเริ่มต้นเป็นต้นไปจะกลับสู่สถานะเริ่มต้น
ในความเป็นจริง ทุกการดำเนินการบนฐานข้อมูลจะมีการทำธุรกรรมโดยปริยายตามค่าเริ่มต้น บทความนี้ใช้โปรแกรมการลงทะเบียนผู้ใช้ทั่วไปเป็นตัวอย่างเพื่อแนะนำสามวิธีในการใช้ ASP เพื่อใช้การประมวลผลธุรกรรม: โซลูชันที่ยึดตามส่วนประกอบฐานข้อมูล ASP โซลูชันที่ยึดตามกลไกการประมวลผลธุรกรรมภายในฐานข้อมูล และโซลูชันที่ยึดตามส่วนประกอบของ MTS .
ฟังก์ชั่นโปรแกรม
สร้างสองตารางในฐานข้อมูล SQL Server: ตาราง USER และตาราง USERDOC ตาราง USER จะจัดเก็บชื่อผู้ใช้และรหัสผ่านของผู้ใช้ที่ลงทะเบียน และตาราง USERDOC จะจัดเก็บข้อมูลส่วนบุคคลของผู้ใช้ที่ลงทะเบียน ซึ่งจัดทำดัชนีตามชื่อผู้ใช้ ต่อไปนี้เป็นคำจำกัดความของตาราง USER และ USERDOC:
สร้างตาราง USER(ชื่อผู้ใช้ varchar(30),userPasswd varchar(30))
สร้างตาราง USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
เมื่อผู้ใช้ร้องขอการลงทะเบียน สคริปต์ ASP จะแทรกชื่อผู้ใช้และรหัสผ่านลงในตาราง USER ก่อน จากนั้นจึง ใน USERDOC ใส่ข้อมูลส่วนบุคคลของผู้ใช้ (อายุ เพศ เบอร์ติดต่อ ที่อยู่บ้าน ฯลฯ) ลงในตาราง ในเวลาเดียวกัน แอปพลิเคชันต้องตรวจสอบให้แน่ใจว่าแต่ละระเบียนในตาราง USER มีระเบียนที่สอดคล้องกันในตาราง USERDOC
วิธีที่ 1 ใช้วัตถุการเชื่อมต่อในคอมโพเนนต์ ADO ที่มีอยู่แล้วภายใน ASP เพื่อใช้การประมวลผลธุรกรรมของการดำเนินการฐานข้อมูล วิธีการบางอย่างของวัตถุการเชื่อมต่อมีดังนี้:
●วิธี Connection.BeginTrans: เริ่มต้นการทำธุรกรรม;
●วิธี Connection.CommitTrans: ดำเนินการให้เสร็จสิ้น/ส่งธุรกรรม
●วิธี Connection.RollBackTrans: เลิกทำ/ละทิ้งธุรกรรม
//เริ่มการทำธุรกรรม
<%Conn.BeginTrans%>
<% sqlText="แทรกลงในค่า USER(userName,userPasswd)('" %>
<% sqlText=sqlText & คำขอ("usrName") & "','"&request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% ถ้า conn.Errors.Count>0 แล้ว %>
<% conn.ข้อผิดพลาด ล้าง %>
//หากการดำเนินการแทรกข้อมูลล้มเหลว ธุรกรรมจะย้อนกลับไปข้างหน้า
<% conn.RollBackTrans %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterFail.html %>
<% สิ้นสุดถ้า %>
<% sqlText="แทรกลงใน USERDOC(ชื่อผู้ใช้,อายุ,เพศ,หมายเลขโทรศัพท์,ที่อยู่) "%>
<% sqlText=sqlText & "values('"& request ("usrName") & "', " & request("Age") %>
<% sqlText=sqlText & `,' " & คำขอ ("PhoneNum") & "','" %>
<% sqlText=sqlText & คำขอ ("ที่อยู่") & "') " %>
//ดำเนินการคำสั่งแทรกที่สองในหน่วยธุรกรรม
<% conn.execute(sqlText) %>
<% ถ้า conn.Errors.Count>0 แล้ว %>
<% conn.ข้อผิดพลาด ล้าง %>
//หากการดำเนินการล้มเหลว ธุรกรรมจะย้อนกลับไปข้างหน้า
<% conn.RollBackTrans %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterFail.html %>
<% สิ้นสุดถ้า %>
//หากธุรกรรมทั้งหมดดำเนินไปอย่างถูกต้อง ให้คอมมิตธุรกรรมนั้น
<% Conn.CommitTrans %>
//ไปที่หน้าการประมวลผลความสำเร็จในการลงทะเบียน
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterOk.html %>
วิธีที่ 2 สามารถใช้กลไกการประมวลผลธุรกรรมภายในระบบฐานข้อมูลเพื่อทำให้การประมวลผลธุรกรรมของการดำเนินการข้อมูลเสร็จสมบูรณ์โดยการเขียนขั้นตอนการจัดเก็บที่มีธุรกรรมในเซิร์ฟเวอร์ฐานข้อมูล ในเวลาเดียวกัน โดยใช้คอมโพเนนต์ ADO เพื่อเรียกกระบวนงานที่เก็บไว้ คุณยังสามารถกำหนดได้ว่าธุรกรรมจะดำเนินการสำเร็จหรือไม่โดยยึดตามรหัสส่งคืนของกระบวนงานที่เก็บไว้
ในระบบฐานข้อมูล แต่ละคำสั่ง SQL คือธุรกรรม ดังนั้นจึงรับประกันได้ว่าแต่ละข้อความจะสมบูรณ์หรือกลับไปสู่จุดเริ่มต้น อย่างไรก็ตาม หากคุณต้องการให้การดำเนินการของชุดคำสั่ง SQL เสร็จสมบูรณ์ทั้งหมดหรือไม่ถูกต้องทั้งหมด คุณต้องใช้กลไกการประมวลผลธุรกรรมของฐานข้อมูลเพื่อให้บรรลุเป้าหมายนี้
รหัสหลักในการสร้างขั้นตอนการจัดเก็บในฐานข้อมูลมีดังนี้:
สร้าง proc RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) ) เมื่อเริ่มต้น
//แสดงคำจำกัดความและเริ่มธุรกรรม
เริ่มทราน
แทรกลงในค่า USER(userName,userPasswd)(@usrName,@usrPasswd)
ถ้า @@error<>0
เริ่ม
//หากการดำเนินการล้มเหลว ธุรกรรมจะถูกย้อนกลับ
ย้อนกลับทราน
// กลับไปที่ขั้นตอนการจัดเก็บและตั้งค่ารหัสส่งคืนเป็นความล้มเหลวในการทำธุรกรรม
กลับ -1
จบ
ใส่ USERDOC(ชื่อผู้ใช้ อายุ เพศ หมายเลขโทรศัพท์ ที่อยู่)
ค่า(@Usrname,@อายุ,@PhoneNum,@ที่อยู่)
ถ้า @@error<>0
เริ่ม
//หากการดำเนินการล้มเหลว ธุรกรรมจะถูกย้อนกลับ
ย้อนกลับทราน
กลับ -1
จบ
//หากดำเนินการอย่างถูกต้อง ให้คอมมิตธุรกรรม
กระทำการทราน
กลับ 0
จบ
รหัสหลักสำหรับการเรียกขั้นตอนการจัดเก็บฐานข้อมูลในสคริปต์ ASP มีดังนี้:
<% ตั้งค่า Comm=server.CreateObject
("ADODB.Command") %>
<% ตั้งค่า Comm.ActiveConnection=conn %>
<% Comm.CommandType=adCmdStoredProc %>
<% Comm.CommandText="RegisterUser" %>
//สร้าง Stored Procedure เพื่อส่งกลับ Object พารามิเตอร์
<% ตั้ง RetCode=Comm.CreateParameter
("RetCode",adInteger,adParamReturnValue) %>
//สร้างวัตถุพารามิเตอร์อินพุตกระบวนงานที่เก็บไว้
<% ตั้ง usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %>
<% ตั้งค่า usrPwd=Comm.CreateParameter
("usrPasswd",adVarchar,adParamInput,30) %>
<% กำหนดอายุ=Comm.CreateParameter("age",adInteger,adParamInput) %>
<% ตั้งค่า PhoneNum=Comm.CreateParameter
("PhoneNum",adVarchar,adParamInput, 20) %>
<% ตั้งที่อยู่=Comm.CreateParameter("ที่อยู่",adVarchar,adParamInput,50) %>
<% Comm.Parameters.Append usrName %>
<% Comm.Parameters.Append usrPwd %>
<% Comm.Parameters.ผนวกอายุ %>
<% Comm.Parameters ผนวก PhoneNum %>
<% Comm.Parameters.ผนวกที่อยู่ %>
<% Comm.Parameters("usrName")=request("usrName") %>
<% Comm.Parameters("usrPasswd")=คำขอ("usrPasswd") %>
<% Comm.Parameters("age")=request("age") %>
<% Comm.Parameters("PhoneNum")=คำขอ("PhoneNum") %>
<% Comm.Parameters("ที่อยู่")=คำขอ("ที่อยู่") %>
<% ดำเนินการสื่อสาร %>
<% RetValue=Cint(Comm("RetCode")) %>
//ตรวจสอบว่าการลงทะเบียนสำเร็จหรือไม่โดยยึดตามโค้ดส่งคืนของโพรซีเดอร์ที่จัดเก็บในฐานข้อมูล
<% ถ้า RetValue< 0 แล้ว %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterFail.html %>
<% อื่น ๆ %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterOk.html %>
<% สิ้นสุดถ้า %>
วิธีที่ 3: เมื่อใช้กลไกการประมวลผลธุรกรรมของคอมโพเนนต์ MTS (Microsoft Transaction Server) เพื่อใช้การประมวลผลธุรกรรม ควรให้ความสนใจเป็นพิเศษกับข้อเท็จจริงที่ว่าธุรกรรมภายใต้กลไกนี้ไม่สามารถขยายเพจ ASP หลายหน้าได้ ถ้าธุรกรรมต้องใช้ออบเจ็กต์จากหลายส่วนประกอบ คุณต้องรวมการดำเนินการกับออบเจ็กต์เหล่านี้ในหน้า ASP
ขั้นแรก คุณต้องเพิ่มคำสั่ง @TRANSACTION ที่ด้านบนของเพจเพื่อประกาศเพจ ASP ว่าเป็นทรานแซคชัน
คำสั่ง @TRANSACTION ต้องอยู่ในบรรทัดแรกของหน้า มิฉะนั้นจะเกิดข้อผิดพลาด เมื่อการประมวลผลสคริปต์ ASP ในเพจสิ้นสุดลง ธุรกรรมปัจจุบันจะสิ้นสุดลง
<%@ ธุรกรรม=ภาษาที่ต้องการ=
VBScript%>
//เหตุการณ์ถูกทริกเกอร์สำเร็จโดยการทำธุรกรรม
<% ย่อย OnTransactionCommit() %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterOk.html %>
<% สิ้นสุดย่อย %>
//เหตุการณ์เกิดขึ้นเมื่อสิ่งต่างๆ ล้มเหลวในการดำเนินการ
<% ย่อย OnTransactionAbort() %>
<% การตอบสนอง เปลี่ยนเส้นทาง RegisterFail.html %>
<% สิ้นสุดย่อย %>
<% sqlText="แทรกลงในค่า USER(userName,userPasswd)('" %>
<% sqlText=sqlText & คำขอ("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% ถ้า conn.Errors.Count>0 แล้ว %>
<% conn.ข้อผิดพลาด ล้าง %>
<% ObjectContext.SetAbort %>
<% สิ้นสุดถ้า %>
<% sqlText="แทรกลงใน USERDOC(ชื่อผู้ใช้,อายุ,เพศ,หมายเลขโทรศัพท์,ที่อยู่) "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Age") %>
<% sqlText=sqlText & `,' " & คำขอ ("PhoneNum") & "','" %>
<% sqlText=sqlText & คำขอ ("ที่อยู่") & "') " %>
<% conn.execute(sqlText) %>
<% ถ้า conn.Errors.Count>0 แล้ว %>
<% conn.ข้อผิดพลาด ล้าง %>
<% ObjectContext.SetAbort %>
<% สิ้นสุดถ้า %>
<% ObjectContext.SetComplete %>
โซลูชันมีความยืดหยุ่นมากขึ้น วิธีการใช้คอมโพเนนต์ฐานข้อมูล ASP มีข้อดีบางประการ: คุณสามารถใช้คอมโพเนนต์ฐานข้อมูล ADO เพื่อประมวลผลธุรกรรมให้เสร็จสมบูรณ์ และคุณยังสามารถปรับแต่งคอมโพเนนต์ฐานข้อมูลของคุณเองได้ตามความต้องการที่แท้จริง (ตราบใดที่คอมโพเนนต์เหล่านั้นตรงตามคอมโพเนนต์ ASP) ข้อกำหนดการเขียน) สามารถ) หากคุณพิจารณาความน่าเชื่อถือของการประมวลผลธุรกรรมฐานข้อมูล จะเป็นการดีกว่าถ้าใช้การประมวลผลธุรกรรมที่เก็บไว้ภายในฐานข้อมูล ด้วยวิธีนี้ กลไกธุรกรรมฐานข้อมูลสามารถนำมาใช้โดยตรงเพื่อดำเนินการประมวลผลธุรกรรมเชิงตรรกะของแอปพลิเคชันให้เสร็จสมบูรณ์ ซึ่งมีความปลอดภัยและเชื่อถือได้ และลดการโต้ตอบข้อมูลระหว่างเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูล นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับระบบฐานข้อมูลแบบกระจาย ข้อดีของวิธีการประมวลผลธุรกรรมโดยใช้ส่วนประกอบของ MTS คือเซิร์ฟเวอร์ MTS จะควบคุมและจัดการการดำเนินการส่วนประกอบให้เสร็จสมบูรณ์และเลิกทำ (ส่วนประกอบที่ลงทะเบียนใน MTS) ได้โดยตรง มีพื้นที่การขยายที่ดีและมีโอกาสในการใช้งาน และสามารถให้ผลทางเทคนิคได้อย่างเต็มที่ ข้อดีของ MTS ปรับปรุงประสิทธิภาพความทนทานต่อข้อผิดพลาดของแอปพลิเคชันเครือข่ายและปรับปรุงประสิทธิภาพแบบไดนามิกของเว็บเซิร์ฟเวอร์ IIS