ตัวอย่าง เช่น การโอนเงินผ่านธนาคาร จาก นาย ก. ไปให้ นาย ข. ถ้าเรามองการทำงานเวลาเราไปโอนเงินผ่านตู้ ATM เราจะเห็นว่ามีการทำงานแค่ครั้งเดียว คือ นาย ก. ไปโอนเงิน (เป็นการมองในระดับ High Level) แต่ในอีกมุมนึง การทำงานของโปรแกรม ซึ่งเป็นส่วนของการประมวลผลคำสั่งและปรับปรุงข้อมูลลงฐานข้อมูล จะเกิดขั้นตอนการปรับปรุงข้อมูลอย่างน้อย 2 คำสั่ง (มองในระดับ Low Level) คือ คำสั่งแรก จะต้องปรับปรุงข้อมูลของนาย ก. โดยลดยอดลง คำสั่งที่สอง จะเป็นการปรับปรุงข้อมูลโดยการเพิ่มเงินในบัญชีของนาย ข. ลักษณะนี้ เราจำเป็นต้องมีการทำ Transaction เพื่อป้องกันเหตุสุดวิสัยที่อาจจะทำให้การปรับปรุงข้อมูลข้างต้นไม่ให้เกิดข้อผิดพลาดในการปรับปรุงข้อมูลเกิดขึ้น
คุณสมบัติของทรานแซกชัน ประกอบด้วย
1. Atomicity คือ ความเป็นหนึ่งเดียว : การทำงานของกลุ่มคำสั่งภายใต้ทรานแซกชันจะถูกประมวลผลเสมือนเป็นคำสั่งเดียวกัน
2. Consistency คือ ความถูกต้องของข้อมูล : การทำงานของทรานแซกชันไม่ว่าจะสำเร็จหรือล้มเหลว ข้อมูลจะต้องสอดคล้องกันเสมอ
3. Isolation คือ การทำงานที่เป็นอิสระแกกัน : การทำงานของทรานแซกซันแต่ละทรานแซกชันจะเป็นอิสระจากกัน ข้อมูลที่ถูกปรับปรุงในทรานแซกชันหนึ่งจะไม่มีผลกันอีกทรานแซกชันหนึ่ง
4. Durability คือ ความคงอยู่ : ข้อมูลทั้งหมดจะคงอยู่หลังจากผ่านการคอมมิตทรานแซกชันแล้ว (commit transaction) ไม่ว่าจะเกิดเหตุการณ์ ระเบิดภูเขา เผากระท่อม หรืออื่น ๆ ก็ตาม
ตัวอย่าง การเขียนคำสั่งจัดการ Transaction ด้วยภาษา VB.Net
ให้ทำการสร้างฐานข้อมูลภายใต้ SQL Server 2008 และตารางข้อมูล พร้อมทั้งเพิ่มข้อมูลเข้าสู่ตาราง ดังนี้ (เปิดหน้าต่าง New Query ใน SQL Server 2008 แล้วป้อนคำสั่งตามตัวอย่างด้านล่าง)
CREATE DATABASE myDATA GO CREATE TABLE tblBankAccount ( [ACC_NO] [varchar](10) NOT NULL PRIMARY KEY, [ACC_NAME] [varchar](50) NULL, [AMOUNT] [money]) GO INSERT INTO tblBankAccount (ACC_NO,ACC_NAME,AMOUNT) VALUES('111','Kasem',50000) INSERT INTO tblBankAccount (ACC_NO,ACC_NAME,AMOUNT) VALUES('222','Mesak',100)
ทำการเขียนโปรแกรมด้วย VB.Net
1. เปิด Visual Studio 20xx จากนั้นคลิกเลือก New Project....
เลือก Visual Basic -> Windows -> Windows Forms Application
ที่ช่อง Name ป้อน myTransaction
จากนั้นคลิกปุ่ม OK
2. ที่ฟอร์ม ให้เพิ่มคอนโทร Button1 และ DataGridView ตามตัวอย่าง ดังภาพ
3. ให้ดับเบิลคลิกที่ฟอร์ม หรือ ปุ่ม Button1 แล้วป้อนคำสั่ง ดังนี้
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim strConn As String = "Data Source=.\SQLEXPRESS;Initial Catalog=myData;Integrated Security=SSPI;" 'Data Source เปลี่ยนตามเครื่องที่ติดต่อ Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "คลิกเพื่อปรับปรุงยอดโอนเงิน" Button1.Width = 200 DisplayData() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Using objCS = New SqlConnection(strConn) objCS.Open() 'คำสั่งจัดการ Transaction Dim nTR As SqlTransaction nTR = objCS.BeginTransaction Try 'ปรับปรุงข้อมูลชุดแรก ภายใต้ทรานแซกชัน nTR Dim strSQL1 As String = "UPDATE tblBankAccount SET Amount = Amount - 100 WHERE Acc_no = '111'" Dim objSQL1 As New SqlCommand(strSQL1, objCS, nTR) objSQL1.ExecuteNonQuery() 'ปรับปรุงข้อมูลชุดที่สอง ภายใต้ทรานแซกชัน nTR Dim strSQL2 As String = "UPDATE tblBankAccount SET Amount = Amount + 100 WHERE Acc_no = '222'" Dim objSQL2 As New SqlCommand(strSQL2, objCS, nTR) objSQL2.ExecuteNonQuery() 'เมื่อข้อมูลถูกปรับปรุงทั้งหมดเรียบร้อยแล้วทำการ คอมมิตทรานแซกชัน nTR.Commit() Catch ex As Exception 'หากเกิดข้อผิดพลาก ให้ทำการโรลแบ็ก nTR.Rollback() MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK) End Try End Using DisplayData() End Sub Sub DisplayData() ' นำข้อมูลจากตาราง tblBankAccount มาแสดงในกริด Using objCS = New SqlConnection(strConn) Dim objDS As New DataSet() Dim objDA = New SqlDataAdapter() objDA.SelectCommand = New SqlCommand("SELECT * FROM tblBankAccount", objCS) objDS.Clear() objDA.Fill(objDS, "tblBankAccount") DataGridView1.DataSource = objDS.Tables(0) End Using End Sub End Class
4. จากนั้นกดปุ่ม F5 เพื่อทำการ Run แล้วลองทดสอบ ตามภาพ
ข้อควรระวัง การใช้ทรานแซกชันระบบฐานข้อมูลจะทำการล็อกตารางที่อยู่ภายใต้ทรานแซกชัน ดังนั้นเวลาใช้ควรทำให้เสร็จในคราวเดียวกัน อย่าเปิดทรานแซกชันค้างไว้ โดยไม่ทำการ commit หรือ rollback
ขอส่งกำลังใจให้กับทหารกล้า ที่ปกป้องประเทศ ทุก ๆ ท่าน
3 ความคิดเห็น:
รันไม่ผ่านครับผม
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load มันมีขีดเส้นใต้คำว่าFrom1_Load
ได้ความรู้เพิ่มมากเลยคะ หนูทราบทราบรายละเอียดการใช้ system.transactions กับ LinQ to Sql การใช้โค้ดต่างๆ รบกวนให้ความกกระจ่างในเรื่องนี้กับหนูด้วยนะคะ
ทำได้แล้วครับ
เขียนได้ดีและเข้าใจง่ายมาก
ขอบคุณมากๆครับ
แสดงความคิดเห็น