วันศุกร์, มิถุนายน 11, 2553

เทคนิคการ บันทึกเฉพาะส่วน (Save Points) ใน Transaction

เมื่อไหร่ ก็ตามที่เรา Rollback Transaction จะทำให้การปรับปรุงแก้ไข ทุกคำสั่งถูกยกเลิก และคืนสถานะเดิมของข้อมูลทั้งหมด โดยในบางครั้ง เราอาจไม่ต้องการ Rollback คำสั่งใด คำสั่งหนึ่ง จากทุกๆ คำสั่ง ก็เป็นได้ ฉะนั้นเราจำเป็นต้องหากลไก ที่จะ Rollback เพียงส่วนใดส่วนหนึ่งใน Transaction เราสามารถทำเช่นนั้นได้ ด้วยการใช้ SavePoints
SavePoints เป็นตัวทำเครื่องหมายที่ทำงานคล้ายกับ Bookmark เราอาจจะทำเครื่องหมาย ณ. จุดใด จดหนึ่งภายในการทำงานของ Transaction จากนั้นให้ Rollback กลับไปที่จุดที่ทำเครื่องหมายไว้ แทนที่จะ Rollback Transaction ทั้งหมด วิธีการคือ เราจะใช้ เมทธอด Save ในออบเจ็กต์ Transaction (ใช้ได้เฉพาะ คลาส SqlTransaction เท่านั้น)

ลิสติ่งที่ 1 พร้อมคำอธิบาย
Imports system
Imports System.Data
Imports System.Data.SqlClient

Module Module3

Sub Main()
Dim tConnection As SqlConnection
Dim tCommand As SqlCommand
Dim tTransaction As SqlTransaction
Dim tReader As SqlDataReader

‘ กำหนด ตัวแปรออบเจ็กต์ ต่างๆ เช่น Connection,Command และ Transaction เพื่อเชื่อมต่อไปยังฐานข้อมูล

Dim ConnectionString As String
ConnectionString = "Data Source=totsawat;Initial Catalog=Northwind;Integrated Security=True"
tConnection = New SqlConnection(ConnectionString)
tConnection.Open()

‘ เริ่มการทำงานของ Transaction โดยเรียกเมทธอด BeginTransaction ของออบเจ็กต์ Connection
tTransaction = tConnection.BeginTransaction()

tCommand = New SqlCommand()
tCommand.Connection = tConnection
tCommand.Transaction = tTransaction

Try
‘ เอ็กซิคิ้ว คำสั่ง SQL สเตทเม้นต์เพื่อการเพิ่มข้อมูล ทั้งหมด 5 ชุดคำสั่ง จาก ออบเจ็กต์ SqlCommand

tCommand.CommandText = "insert into orders default values"
tCommand.ExecuteNonQuery() ‘เรียกการทำงาน SavePoint ด้วยเมทธอด “Save” หลังจากเพิ่มเรคคอร์ดแรกแล้ว
tTransaction.Save("FirstOrder")
tCommand.CommandText = "insert into orders default values"
tCommand.ExecuteNonQuery()
tCommand.CommandText = "insert into orders default values"
tCommand.ExecuteNonQuery()
‘จากนั้น ให้ทำการเพิ่มเรคคอร์ดเข้าไปอีก 2 ชุดคำสั่ง แล้วเรียกเมทธอด rollback ย้อนกลับไปจนถึง จุด SavePoint ที่ชื่อ FirstOrder จะสังเกตเห็นว่า เราใช้ เมทธอด rollback พร้อมกับระบุชื่อของ SavePoint เป็นพารามิเตอร์ กรณีที่ต้องการ เรียกคืนสถานะเดิม (rollback) ทั้งหมดของ Transaction ไม่จำเป็นต้องระบุพารามิเตอร์
tTransaction.Rollback("FirstOrder")
‘ ต่อจากนั้น ให้ทำการเพิ่มเรคคอร์ดเข้าไปอีก 2 ชุดคำสั่ง และ สั่ง คอมมิท ตามปกติ
tCommand.CommandText = "insert into orders default values"
tCommand.ExecuteNonQuery()
tCommand.CommandText = "insert into orders default values"
tCommand.ExecuteNonQuery()
tTransaction.Commit()
‘ สุดท้ายให้เรียก หมายเลขออร์เดอร์ 3 รายการล่าสุด ขึ้นมาดู ทางหน้าจอ
tCommand.CommandText = "select top 3 orderid from " & _
"orders order by orderid desc "
tReader = tCommand.ExecuteReader()
Console.WriteLine("Last 3 Orders")

While tReader.Read()
Console.WriteLine(tReader.GetInt32(0))
End While

Catch e As Exception
Console.WriteLine(e.Message)
Console.ReadLine()
Finally
tConnection.Close()
End Try

End Sub

End Module

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

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