10 กุมภาพันธ์ 2554

VB.Net กับ Transaction

Transaction เป็นกลุ่มคำสั่งที่สร้างขึ้นเพื่อการประมวลผลข้อมูล โดยที่กลุ่มคำสั่งของทรานแซกชันถือว่าเป็นหน่วยของงานที่ไม่สามารถแบ่งแยกออกเป็นส่วนย่อยได้อีก การทำงานจะทำตั้งแต่ต้นจนเสร็จสิ้นภายใต้หน่วยของทรานแซกชันนั้น หากเกิดเหตุอันไม่คาดคิดขณะประมวลผลคำสั่ง เช่น ระเบิดภูเขา เผากระท่อม ไฟดับ สายสัญญาณขาดหาย โปรแกรมผิดพลาด .... แล้วมีผลมาทำให้คำสั่งหยุดกลางครัน การทำงานที่ผ่านมาตั้งแต่เริ่มทำ Transaction ก็จะกลับสู่สภาพเดิมก่อนที่จะมีการทำ Transaction

ตัวอย่าง เช่น การโอนเงินผ่านธนาคาร จาก นาย ก.  ไปให้ นาย ข. ถ้าเรามองการทำงานเวลาเราไปโอนเงินผ่านตู้ 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

Unknown กล่าวว่า...

ได้ความรู้เพิ่มมากเลยคะ หนูทราบทราบรายละเอียดการใช้ system.transactions กับ LinQ to Sql การใช้โค้ดต่างๆ รบกวนให้ความกกระจ่างในเรื่องนี้กับหนูด้วยนะคะ

ไน้ท์นี กล่าวว่า...

ทำได้แล้วครับ

เขียนได้ดีและเข้าใจง่ายมาก

ขอบคุณมากๆครับ

"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.