คำสั่ง sql select กับ update เกิดขึ้นพร้อมกัน ณ วินาทีเดียวกัน จะเกิดปัญหาหรือไม่คะ (asp.net & ms access)
มีข้อสงสัยค่ะ
เว็บไซต์ที่กำลังสร้างอยู่นี่ เป็น asp.net (vb) ซึ่งใช้ฐานข้อมูล microsoft access
เลยสงสัยว่า
ขณะหนึ่ง ลูกค้ากำลัง select ข้อมูล record หนึ่งอยู่ ณ เวลาเดียวกันนั้น ก็มี เจ้าหน้าที่เว็บไซต์กำลัง update ข้อมูล record นั้นด้วย
กรณีนี้ คำสั่ง sql select กับ update เกิดขึ้นพร้อมกัน ณ วินาทีเดียวกัน จะเกิดปัญหาหรือไม่คะ (แล้วอย่างหมายเหตุข้างล่างนี้ เป็น คำสั่ง update 2 คำสั่ง (หรือ 2 ตาราง) ถ้าเกิดขึ้นพร้อมกับคำสั่ง select จะเกิดปัญหาหรือไม่คะ แล้วต้องแก้โค้ดข้างล่างยังไงคะ )
และกรณี คำสั่ง sql select กับ delete เกิดขึ้นพร้อมกัน ณ วินาทีเดียวกัน จะเกิดอะไรขึ้นคะ จะเกิดปัญหาหรือไม่คะ
...ช่วยหน่อยค่ะ ไม่ค่อยชำนาญเรื่องฐานข้อมูลเชิงลึกค่ะ
ขอบคุณค่ะ
-------------------------------------------------------------
หมายเหตุ : code update ในโปรแกรม asp.net
'////////// BEGIN Update Package to Database////////////////////
Dim objConn As New OleDbConnection
Dim objCmd As New OleDbCommand
Dim strConnString, strSQL As String
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database/prosogo.mdb") & ";Jet OLEDB:Database Password=asiangamec2605;"
objConn.ConnectionString = strConnString
objConn.Open()
'///////BEGIN Update Table Package ////////////
strSQL = "UPDATE package SET " & _
" Title = '" & Me.txtTitle.Text & "' " & _
" ,Province = '" & strProvince & "' " & _
" ,ExpireDate = '" & Me.txtExpireDate.Text & "' " & _
" ,Detail = '" & Me.textboxDetail.Text & "' " & _
" ,Hilight = '" & Me.textboxHilight.Text & "' " & _
" ,Contact = '" & Me.txtContact.Text & "' " & _
" WHERE PackageID = " & lblPackageId.Text
objCmd = New OleDbCommand
With objCmd
.Connection = objConn
.CommandText = strSQL
.CommandType = CommandType.Text
End With
Try
objCmd.ExecuteNonQuery()
Catch ex As Exception
objConn.Close()
objConn = Nothing
Page.RegisterClientScriptBlock("OnLoad", "<script>alert('ไม่สามารถ update แพ็คเกจในตารางแพ็คเกจ / และ ไม่สามารถ update ชื่อแพ็คเกจในตารางคำสั่งซื้อ / ดู Error Message ที่ด้านบนสุดของหน้าจอ')</script>")
Response.Write(ex.Message)
Exit Sub
End Try
'///////END Update Table Package ////////////
'///////BEGIN Update PackageTitle In Table Ordering ////////
strSQL = "Update ordering Set PackageTitle='" & Me.txtTitle.Text & "' WHERE fPackageId = " & lblPackageId.Text
'ทดสอบแล้ว ถ้ายังไม่มี fPackageId นี้ใน Table Ordering คำสั่ง objCmd.ExecuteNonQuery() ก็ไม่ Error แม้ว่าจะไม่มี Record ให้อัพเดท objCmd = New OleDbCommand(strSQL, objConn)
Try
objCmd.ExecuteNonQuery()
Catch ex As Exception
objConn.Close()
objConn = Nothing
Page.RegisterClientScriptBlock("OnLoad", "<script>alert('ไม่สามารถ update ชื่อแพ็คเกจในตารางคำสั่งซื้อ /แต่ update แพ็คเกจในตารางแพ็คเกจ สำเร็จเรียบร้อยแล้ว / ดู Error Message ที่ด้านบนสุดของหน้าจอ')</script>")
Response.Write(ex.Message)
Exit Sub
End Try
'///////END Update PackageTitle In Table Ordering ////////
objConn.Close()
objConn = Nothing
pnlEdit.Visible = False
CheckBox1.Checked = False
Page.RegisterClientScriptBlock("OnLoad", "<script>alert('Updateแพ็คเกจในตารางแพ็คเกจ และ Updateชื่อแพ็คเกจในตารางคำสั่งซื้อ สำเร็จเรียบร้อยแล้ว')</script>")
Tag : .NET, Ms Access, Web (ASP.NET), VS 2003 (.NET 1.1)
Date :
2011-11-26 11:59:27
By :
muay
View :
8608
Reply :
10
ลองดูพวก Transaction ครับ
Go to : ASP.NET Microsoft Access Transaction (BeginTransaction,Commit,Rollback)
ดูตรง
Code
Trans = objConn.BeginTransaction(IsolationLevel.ReadCommitted)
Unspecified
A different isolation level than the one specified is being used, but the level cannot be determined.
When using OdbcTransaction, if you do not set IsolationLevel or you set IsolationLevel to Unspecified, the transaction executes according to the isolation level that is determined by the driver that is being used.
Chaos
The pending changes from more highly isolated transactions cannot be overwritten.
ReadUncommitted A dirty read is possible, meaning that no shared locks are issued and no exclusive locks are honored.
ReadCommitted Shared locks are held while the data is being read to avoid dirty reads, but the data can be changed before the end of the transaction, resulting in non-repeatable reads or phantom data.
RepeatableRead Locks are placed on all data that is used in a query, preventing other users from updating the data. Prevents non-repeatable reads but phantom rows are still possible.
Serializable A range lock is placed on the DataSet, preventing other users from updating or inserting rows into the dataset until the transaction is complete.
Snapshot Reduces blocking by storing a version of data that one application can read while another is modifying the same data. Indicates that from one transaction you cannot see changes made in other transactions, even if you requery.
Read Uncommitted
เป็น Isolation Level ระดับต่ำที่สุด ซึ่งมีการทำงานใช้ข้อมูลร่วมกัน โดยไม่มีการ Lock ข้อมูลเลย อีกทั้งยังสามารถนำข้อมูลผลลัพธ์ของ Transaction ที่ยังไม่ Commit ไปใช้งานได้อีกด้วย จึงทำให้อัตราความผิดพลาดของข้อมูลในฐานข้อมูลมีโอกาสเกิดได้สูง กล่าวได้ว่า Isolation Level ระดับนี้ ไม่ได้แก้ปัญหา Concurrency Control Problem ข้อใด ๆ ได้เลย ซึ่งมักจะกำหนด Isolation Level นี้กับงานที่ให้บริการอ่านข้อมูลได้อย่างเดียว ไม่สามารถเพิ่ม ลบ และแก้ไขข้อมูลได้ หรือไม่มีการแก้ไขข้อมูลบ่อยนัก ซึ่งจะสามารถรองรับผู้ใช้งานพร้อมกันในเวลาเดียวกันได้เป็นจำนวนมาก
Read Committed หรือ Cursor Stability
เป็น Isolation Level ที่เป็น Default ของ SQL Server 2005 ซึ่งมีการทำงานที่การใช้งานข้อมูลนั้นจะต้องเป็นข้อมูลผลลัพธ์ของ Transaction ที่ Commit แล้วเท่านั้น กล่าวคือ หากอยู่ในระหว่างการทำงานของ Transaction ข้อมูลนั้นจะยังไม่สามารถใช้งานได้กว่า Transaction นั้นจะ Commit เสียก่อน เป็นการแก้ปัญหา Uncommitted Dependency (Dirty Read) กล่าวได้ว่า Isolation Level นี้สามารถแก้ปัญหา Uncommitted Dependency(Dirty Read) ได้เท่านั้น ส่วนปัญหาข้ออื่นไม่สามารถแก้ปัญหาได้ Isolation Level นี้มักจะใช้ในงานที่ให้บริการข้อมูลผ่าน Web Application ที่มีการแก้ไข-เพิ่มข้อมูลได้ ซึ่งต้องการเพียงแสดงข้อมูลที่ถูกต้อง (Commit แล้ว) และรองรับผู้ใช้งานจำนวนมากเท่านั้น
Repeatable Read
มีลักษณะการทำงานอยู่ในรูปแบบ HOLD LOCK ระหว่างที่กำลังทำงานกับข้อมูล จะไม่ปลด Lock จนกว่า Transaction จะ Commit ซึ่งจะแก้ปัญหา Lost Update, Uncommitted Dependency (Dirty Read) และ Inconsistent Analysis (Non Repeatable Read) ได้ แต่ว่า Isolation Level นี้ยังไม่สามารถแก้ปัญหา Phantom Phenomenon ได้
Serializable
เป็น Isolation Level ระดับสูงสุดที่สามารถแก้ปัญหา Concurrency Control Problem ทั้ง 4 ข้อได้ ซึ่งรับประกันถึงความถูกต้องของข้อมูลสูงสุดด้วย แต่ว่า Isolation Level นี้มีอัตราการ Lock ข้อมูลสูงและมีโอกาสของการเกิด Deadlock สูงด้วย
http://greatfriends.biz/webboards/msg.asp?id=67190
http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx
Date :
2011-11-26 16:52:42
By :
webmaster
ตอบความคิดเห็นที่ : 1 เขียนโดย : webmaster เมื่อวันที่ 2011-11-26 16:52:42
รายละเอียดของการตอบ ::
ขอบคุณ คุณ Mr.Win มากค่ะ
คำตอบคุณมีประโยชน์มากค่ะ แต่ดิฉันยังไม่แน่ใจว่า ดิฉันเข้าใจคำตอบคุณอย่างถูกต้องหรือเปล่า
ขอถามต่อเป็นข้อๆดังนี้นะคะ
--------------------------------------
1. ดิฉันได้ post code update ในหมายเหตุ ซึ่งมี sql update 2 คำสั่ง
อันนี้ที่คุณได้ตอบมา โดยให้ link ตัวอย่าง code transaction
...ซึ่งดิฉันเข้าใจว่า คุณกำลังบอกให้ฉัน ใช้ transaction ในกรณีที่งานนั้นต้องประกอบด้วย update 2 คำสั่งหรือมากกว่านั้น เพื่อที่ว่า ถ้าคำสั่ง update คำสั่งที่ 2 ไม่สำเร็จ จะได้ Rollback คำสั่งแรกทิ้งด้วย ใช่ไม๊คะ เหมือนไม่มีการแก้ไขใดๆ
...ถ้าดิฉันเข้าใจถูก กรุณาตอบว่าข้อ 1 ถูกด้วยค่ะ
--------------------------------------
2.
กรณีที่ ดิฉันมี sql update เพียงคำสั่งเดียว ดิฉันต้องใช้ Code Transaction ตามตัวอย่างลิงก์ที่คุณให้มาหรือไม่คะ
--------------------------------------
3. เห็นคุณเขียนว่า ให้ดูตรง Trans = objConn.BeginTransaction(IsolationLevel.ReadCommitted)
และคุณได้อธิบายว่า
Read Committed หรือ Cursor Stability
เป็น Isolation Level ที่เป็น Default ของ SQL Server 2005 ซึ่งมีการทำงานที่การใช้งานข้อมูลนั้นจะต้องเป็นข้อมูลผลลัพธ์ของ Transaction
ที่ Commit แล้วเท่านั้น กล่าวคือ หากอยู่ในระหว่างการทำงานของ Transaction ข้อมูลนั้นจะยังไม่สามารถใช้งานได้กว่า Transaction นั้นจะ
Commit เสียก่อน เป็นการแก้ปัญหา Uncommitted Dependency (Dirty Read) กล่าวได้ว่า Isolation Level นี้สามารถแก้ปัญหา
Uncommitted Dependency(Dirty Read) ได้เท่านั้น ส่วนปัญหาข้ออื่นไม่สามารถแก้ปัญหาได้ Isolation Level นี้มักจะใช้ในงานที่ให้บริการ
ข้อมูลผ่าน Web Application ที่มีการแก้ไข-เพิ่มข้อมูลได้ ซึ่งต้องการเพียงแสดงข้อมูลที่ถูกต้อง (Commit แล้ว) และรองรับผู้ใช้งานจำนวน
มากเท่านั้น
ตรงข้อความข้างบนที่ว่า ...หากอยู่ในระหว่างการทำงานของ Transaction ข้อมูลนั้นจะยังไม่สามารถใช้งานได้กว่า Transaction นั้นจะ
Commit เสียก่อน
ซึ่งจากประโยคนี้ ดิฉันไม่แน่ใจว่าคุณตอบคำถามดิฉันหรือป่าว
...ที่ถามว่า คำสั่ง sql select กับ update เกิดขึ้นพร้อมกัน ณ วินาทีเดียวกัน จะเกิดปัญหาหรือไม่คะ
...ซึ่งดิฉันเข้าใจว่า คุณกำลังบอกว่า ขณะที่ดิฉัน update ลูกค้าจะไม่สามารถ select ได้ ใช่ไม๊คะ
ถ้าใช่ ดิฉันขอถามต่อว่า การที่ลูกค้า select ไม่ได้ หน้าจอ internet browser จะแสดงผลยังไงคะ
- แสดง error ภาษาอังกฤษบอกว่า มีอีกคนกำลังแก้ไขเรคคอร์ดนี้อยู่ หรือคะ
หรือว่า
- แสดง หน้าจอบราวเซอร์ขาวๆทั้งหน้า เหมือนเวลาสัญญาณเน็ตช้า แสดงอย่างนั้นจนกว่าคำสั่ง update ของฉันจะ commit หรือคะ ถึงจะแสดงข้อมูลที่ลูกค้า select
Date :
2011-11-27 00:59:35
By :
muay
1. ผมแค่ให้ดูเป็นตัวอย่างครับ จะกี่ Query ก็ใช้ Transaction ได้ครับ
2. คุณใช้ Transaction ได้ครับ มันสามารถทำการ Lock Table ที่คุณกำลัง Select ไว้อยู่ได้ครับ
3. ผมให้คุณดู Property ของ IsolationLevel ครับ ซึ่งในกรณีที่ถูก Lock เข้าใจว่า Process จะรอกันครับ ซึ่งมันเร็วมาก จึงไม่ค่อยเห็นผลของการทำงาน
Date :
2011-11-27 08:52:08
By :
webmaster
ได้ครับ
Date :
2011-12-04 00:07:31
By :
webmaster
Transaction ใส่ได้เฉพาะในหน้าที่กำลังทำงาน และ Process อยุ่ครับ
Date :
2011-12-19 16:12:23
By :
webmaster
ลองทำความเข้าใจกับ #1 ครับ คือ Transaction มันสามารถครอบการทำงานทั้งหมดที่ต้องการครับ
Date :
2011-12-21 07:03:56
By :
webmaster
Load balance : Server 00