วันพฤหัสบดี, พฤษภาคม 27, 2553

ทิป : ใช้สโตร์โพร์ซีเยอร์ที่ซับซ้อน ทดแทนการ เรียกอ่านข้อมูลหลายรอบ

ใช้สโตร์โพร์ซีเยอร์ที่ซับซ้อน สำหรับการแสดง ชุดผลลัพธ์ต่างๆ แทนที่จะเรียกอ่านข้อมูลหลายรอบ จากสโตร์โพรซีเยอร์หลายตัว ADO .NET นำเสนอวิธีที่ง่ายขึ้น ในการทำงานร่วมกับ ชุดผลลัพธ์ หลากหลายชุด อาทิ เช่น การใช้เมทธอด NextResult() ของ ออปเจ็กต์ SqlDataReader โค้ดดังกล่าวนี้ แสดงถึงวิธีการ สำรวจค่าทุกๆ เรคคอร์ด เพื่อแสดงผลชุดผลลัพธ์

sqlDR = objDB.RunQueryReturnDR("MyStoredProcedure")
Dim arrResult(0) As String
Do
While sqlDR.Read() ' การวางตำแหน่งตัวชี้ (pointer) ไปยังเรคคอร์ดแรกสุด
i += 1
ReDim Preserve arrResult(i)
arrResult(i) = sqlDR("ProductNumber")
End While
Loop While (sqlDR.NextResult())
' เลื่อนไปยัง ชุดผลลัพธ์ถัดไป

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

วันพุธ, พฤษภาคม 26, 2553

ทิป : ใช้ออปเจ็กต์การเข้าถึงข้อมูล (Data Access) ที่เหมาะกับงาน

  • งานด้านการเรียกดูข้อมูล ชนิดอ่านอย่างเดียว ให้ใช้การสตรีม เพื่อการเข้าถึงข้อมูล
  • ใช้ออปเจ็กต์ DataSet สำหรับงานปรัปบรุงข้อมูล กรณีที่เราต้องการ ทำการปรับปรุงแบบไร้การเชื่อมต่อ (อีกทางเลือกหนึ่ง สามารถ สร้าง สโตร์โพรซีเยอร์เฉพาะ เพื่อจัดการ ด้านการปรับปรุงข้อมูล)
  • ใช้ ออปเจ็กต์ DataView เมื่อเราต้องการทำงานกับ มุมมองแบบกรองรายการ ของออปเจ็กต์ DataSet ขนาดใหญ่ เพราะออปเจ็กต์นี้ ได้จัดเตรียม คุณลักษณะ ที่มีประโยชน์มากมายของ ออปเจ็กต์ DataSet ขณะเดียวกัน มันก็ใช้งาน ทรัพยากรระบบน้อยกว่า การใช้ออปเจ็กต์ DataSet โดยตรง

วันอาทิตย์, พฤษภาคม 23, 2553

ควรใช้ Transaction เมื่อไหร่

การนำ Transaction มาใช้ จะทำให้เกิด Overhead ในการทำงานของระบบ และมีผลโดยตรงกับ Performance ดังนั้น นักพัฒนา จะต้องพิจารณาให้ครอบคลุม ผลกระทบดังกล่าว ถึงแม้ว่า ADO .net จะสนับสนุนการทำ Transaction ได้ค่อนข้างดีก็ตาม ให้อาศัยหลักเกณฑ์ในการพิจารณาว่า จะใช้ Transaction เมื่อ โพรเซสของงาน ต้องอาศัย การประมวลผลในหลายส่วนงาน (มีโพรเซสงานเข้ามาเกี่ยวข้องมากว่า 1 รายการ) เพื่อให้ผลลัพท์ของข้อมูลที่เกี่ยวเนื่องกันมีความถูกต้อง

วันเสาร์, พฤษภาคม 22, 2553

ค่าที่กำหนดให้ Isolation Level มีดังนี้

Chaos การแก้ไขที่คงสถานะ “รอ” Pending โดยกำหนดค่าระดับที่ ไม่อนุญาตให้เขียนทับ
ค่าได้ จนกว่า การทำงานของ Transaction จะสิ้นสุด (SQL Server ไม่รองรับข้อ
กำหนดนี้ )

ReadUnCommitted เหมือนข้อกำหนด Dirty Read : ไม่มีการทำ Shared Lock และการกำหนด
Exclusive Lock Isolation ชนิดนี้ เหมาะสำหรับ การทำงาน กับทุกข้อมูลที่ตรง
กับ เงื่อนไข โดยไม่สนใจว่า Transaction จะ Commit หรือไม่

ReadCommitted ขณะที่อ่านข้อมูล จะกำหนด Share Lock ไปยังชุดข้อมูล ที่ Transaction ทำ
งานอยู่ เพื่อหลีกเลี่ยงการอ่านข้อมูล แบบ Dirty Read ผลลัพท์จะเหมือนกับ
Non-Repeatable Read หรือ Phantom Rows Isolation ชนิดนี้ เหมาะสำหรับ
การทำงาน กับทุกข้อมูลที่ตรงกับ เงื่อนไข และ Commit แล้วเท่านั้น และค่านี้ยัง
เป็น ค่าดีฟอลท์ สำหรับ Isolation Level หากไม่ระบุใน Transaction

RepeatableRead กำหนด Share Lock กับข้อมูลทั้งหมดที่ใช้ในคิวรี เพื่อป้องกันการแก้ไขข้อมูลจาก
ผู้ใช้คนอื่นๆ และ ป้องกันการอ่านแบบ Non-Repeatable Isolation ชนิดนี้ เหมาะ
สำหรับ กรณีที่เราต้องการ รายการข้อมูล (Record) ที่อ่านเข้ามา ยังคงเป็นค่า
เดิมในการอ่านข้อมูลครั้งต่อไป

ResizeableRead กรณีนี้ จะล็อก ชุดข้อมูล เพื่อป้องกันการแก้ไขและเพิ่มข้อมูลจากผู้ใช้คนอื่นๆ จน
กว่า Transaction จะทำงานเสร็จ Isolation ชนิดนี้ เหมาะสำหรับ กรณีที่เราต้อง
การ ชุดข้อมูลที่เราทำงานอยู่ เป็นชุดข้อมูลเดียวกัน จนกระทั่งเราประมวลผล
รายการจนแล้วเสร็จ

UnSpecified กรณีนี้ คือการนำ Isolation Level ที่ต่างจากข้อกำหนดมาใช้ ซึ่งไม่สามารถระบุ
Isolation Level ได้

วันศุกร์, พฤษภาคม 21, 2553

ข้อกำหนดทั่วไปสำหรับ Isolation Level

ข้อกำหนดทั่วไปสำหรับ Isolation Level Dirty Read = คือข้อกำหนด ที่ Transaction หนึ่งสามารถอ่านข้อมูลได้ ในขณะที่ Transaction อื่นๆ กำลังแก้ไขข้อมูลอยู่
Non-Repeatable Read = การแก้ไขใน Transaction หนึ่ง มีผล ทำให้การเรียกดู ข้อมูลเปลี่ยนแปลง ตัวอย่างเช่น Transaction A เรียกดูข้อมูลมาดูชุดแรก ระหว่างนั้น Transaction B ทำการอัพเดตข้อมูล จากนั้น Transaction A เรียกดูข้อมูลชุดถัดมา ผลลัพท์ ที่ได้ จะต่างจากครั้งแรก แม้จะใช้ ชุดคำสั่งเดียวกัน
Phantom Read = กรณี Transaction A วางเงื่อนไข สำหรับ เรคคอร์ดที่เลือก เมื่อ Transcation A ต้องการแสดง 100 รายการที่ตรงตามเงื่อนไข ในระหว่างนั้น Transaction B แทรกข้อมูลบางรายการ เข้าไปตรงกับเงื่อนไขที่กำหนดใน Transaction A จะมีผลให้ เมื่อ Transaction A คิวรีข้อมูลอีกครั้งจะได้ ผลลัพท์ที่ต่างไปจากเดิม เราเรียก การเพิ่มรายการโดยวิธีนี้ว่า Phantom Rows

วันพฤหัสบดี, พฤษภาคม 20, 2553

พร๊อพเพอร์ตี้ ACID ?

การที่จะนำ Transaction มาใช้ ต้องพิจารณาถึง คุณลักษณะของ ACID อันประกอบไปด้วย
Atomic = ในทุกขั้นตอนของ Transaction ควรจะประกอบไปด้วย จุดที่แสดงถึง “ความสำเร็จ” และ “ความผิดพลาด”
Consistent = Transaction สามารถทำให้ข้อมูล เปลี่ยนจาก สถานะเดิม ไปเป็น อีกสถานะหนึ่ง
Isolated = ในแต่ละ Transaction จะมีอิสระต่อกัน โดย Transaction ใดๆ ไม่อาจแทรกแซงขณะที่ Transaction หนึ่ง กำลังทำงานอยู่
Durable = การเปลี่ยนแปลงที่เกิดขึ้นจาก Transaction จะถูกเก็บบันทึกไว้ใน สื่อบันทึกข้อมูล ก่อนที่ Transaction จะประมวลคำสั่ง เป็นผล “สำเร็จ” Log การเปลี่ยนแปลงจะถูกบันทึกไว้ ดังนั้นถ้าเกิด “ความผิดพลาด” ขึ้น ชุดข้อมูลใน สื่อบันทึก จะต้องสามารถ ฟื้นคืนสถานะ (Reconstruct) กลับมาได้