430 likes | 838 Views
บทที่ 9 การจัดการทรานแซกชั่น และการควบคุมสภาวะการทำงานพร้อมกัน. (transaction management and concurrency control). จุดประสงค์. อธิบายโอเปอเรชั่นและสถานะของทรานแซกชั่นได้อย่างถูกต้อง บอกปัญหาที่เกิดขึ้นจากสภาวะการทำงานพร้อมกันได้ เข้าใจเทคนิควิธีการควบคุมสภาวะการทำงานพร้อมกัน
E N D
บทที่ 9 การจัดการทรานแซกชั่น และการควบคุมสภาวะการทำงานพร้อมกัน (transaction management and concurrency control)
จุดประสงค์ • อธิบายโอเปอเรชั่นและสถานะของทรานแซกชั่นได้อย่างถูกต้อง • บอกปัญหาที่เกิดขึ้นจากสภาวะการทำงานพร้อมกันได้ • เข้าใจเทคนิควิธีการควบคุมสภาวะการทำงานพร้อมกัน • บอกประเภทของการล็อคและระดับการล็อคได้ • อธิบายหลักการกู้คืนฐานข้อมูลด้วยเทคนิควิธีต่างๆ ได้อย่างถูกต้อง
ทรานแซกชั่น คืออะไร? ทรานแซกชั่น คือ การประมวลผล เช่น การอ่าน การบันทึก การปรับปรุง หรือการลบข้อมูล ซึ่งหลังจากประมวลผลแล้ว ข้อมูลจะต้องมีความถูกต้องตรงกัน
คุณสมบัติของทรานแซกชั่นที่ดีคุณสมบัติของทรานแซกชั่นที่ดี • ความเป็นหนึ่งเดียว(Atomicity) • ความสอดคล้อง(Consistency) • ความเป็นอิสระ(Isolation) • ความคงทน(Durability)
ความเป็นหนึ่งเดียว (Atomicity) ทุกการกระทำของทรานแซกชั่นจะต้องทำงานโดยสมบูรณ์ ตั้งแต่เริ่มต้นจนกระทั่งจบกระบวนการของทรานแซกชั่นนั้นๆ หรือไม่เช่นนั้น.. ก็จะต้องยกเลิกการกระทำใดๆ ทั้งหมด (Rollback) ที่ผ่านมา ซึ่งเปรียบเสมือนว่ายังไม่เคยเอ็กซีคิวต์กระบวนการใดๆ เลย
ความสอดคล้อง (Consistency) “ทุกทรานแซกชั่นจะส่งผลต่อข้อมูลในฐานข้อมูล” โดยข้อมูลในฐานข้อมูลต้องมีความถูกต้องหรือมีความสอดคล้องตรงกันอยู่เสมอ
ความเป็นอิสระ (Isolation) เป็นคุณสมบัติของทรานแซกชั่น ที่ใช้ในการ ”ป้องกันผลกระทบจากการกระทำพร้อมกันของทรานแซกชั่นอื่นๆ” คุณสมบัตินี้ จะไม่อนุญาตให้แต่ละทรานแซกชั่นเปลี่ยนแปลงข้อมูลได้ในเวลาเดียวกัน โดยจะต้องรอคอยให้ทรานแซกชั่นที่อยู่ลำดับก่อนหน้าได้จัดการข้อมูลให้เสร็จสมบูรณ์เสียก่อน เพื่อมิให้ส่งผลกระทบต่อข้อมูลที่ไม่ถูกต้องในภายหลัง
ความคงทน (Durability) เมื่อทรานแซกชั่นทำงานเสร็จสมบูรณ์(Commit) ระบบจะต้องสามารถคงข้อมูลที่ได้รับการแก้ไขหรืออัปเดตตามรายการทรานแซกชั่นนั้นๆ ไว้ได้ SAVE
แล้วถ้าเกิดสภาวะการทำงานพร้อมกันของทรานแซกชั่นขึ้นล่ะ..จะทำยังไง?แล้วถ้าเกิดสภาวะการทำงานพร้อมกันของทรานแซกชั่นขึ้นล่ะ..จะทำยังไง? จะต้องมีกระบวนการจัดการกับการกระทำของทรานแซกชั่นที่ก่อให้เกิดสภาวะการทำงานพร้อมกัน ไม่เช่นนั้น.. จะส่งผลเสียต่อความผิดพลาดในข้อมูล
กอล์ฟ แก๊ป เวลา 1. อ่านระเบียนบัญชีเงินฝาก ก. (ยอดเงินคงเหลือ=1000 บาท) t1 1. อ่านระเบียนบัญชีเงินฝาก ก. (ยอดเงินคงเหลือ=1000 บาท) t2 2. ทำรายการถอนเงิน 200 (ยอดเงินคงเหลือ=800บาท) ยอดนี้ยังไม่ถูกบันทึกลงฐานข้อมูล t3 2. ทำรายการถอนเงิน 300 (ยอดเงินคงเหลือ=700 บาท) ยอดนี้ยังไม่ถูกบันทึกลงฐานข้อมูล t4 3. ปรับปรุงยอดบัญชีเงินฝาก ก. (ยอดเงินคงเหลือ=800บาท) บันทึกลงฐานข้อมูล t5 3. ปรับปรุงยอดบัญชีเงินฝาก ก. (ยอดเงินคงเหลือ=700 บาท) บันทึกลงฐานข้อมูล t6 ERROR !
จากเหตุการณ์ดังกล่าวทำให้ยอดเงินที่บันทึกลงในบัญชีลูกค้านั้นเกิดความผิดพลาด ส่งผลให้เกิดปัญหา 3 ประการ คือ 1. ปัญหาการสูญเสียจากการแก้ไขข้อมูล (The Lost Update Problem) 2. ปัญหาข้อมูลที่ยังไม่ได้รับการยืนยันความสมบูรณ์ (The Uncommitted Dependency Problem) 3. ปัญหาความขัดแย้งระหว่างข้อมูล (The Inconsistent Analysis Problem) ปัญหาจากภาวะการเข้าถึงพร้อมกัน
1. ปัญหาการสูญเสียจากการอัพเดตข้อมูล ปัญหาการอัพเดตที่ผิดพลาด
2. ปัญหาจากการย้อนกลับ หรือปัญหาข้อมูลที่ยังไม่ได้รับการยืนยันความสมบูรณ์ ปัญหาจากการอ่านข้อมูลที่ยังไม่ได้รับการ Commit
3. ปัญหาความไม่สอดคล้องกันของข้อมูล หรือปัญหาความขัดแย้งระหว่างข้อมูล ปัญหาจากข้อมูลที่ขัดแย้งกัน
ทำแบบฝึกหัดกันดีกว่า..ทำแบบฝึกหัดกันดีกว่า..
เมื่อเกิดภาวะพร้อมกัน ระบบจัดการฐานข้อมูลหรือ DBMS ต้องมีเทคนิคหรือกระบวนการในการในการควบคุมภาวะพร้อมกัน เพื่อมิให้เกิดการแย่งชิงข้อมูลที่ยังประมวลผลไม่เสร็จและถูกนำไปใช้งานโดยทรานแซกชั่นอื่นที่สอดแทรกเข้ามา เทคนิคการควบคุมภาวะพร้อมกัน แบ่งออกเป็น 2 ประเภท คือ 1. ควบคุมภาวะพร้อมกันด้วยการล็อก (Locking) 2. ควบคุมภาวะพร้อมกันโดยไม่ใช้วิธีการล็อก (Without Locking) เทคนิคการควบคุมภาวะพร้อมกัน(Concurrency Control Techniques)
1. ควบคุมภาวะพร้อมกันด้วยการล็อก (Lock-Based Concurrency Control) เป็นเทคนิคการกำหนดสถานะล็อกให้กับทรานแซกชั่น เพื่อป้องกันทรานแซกชั่นอื่นๆ เข้ามาใช้งานข้อมูลนั้น จนกว่าข้อมูลที่อยู่ในสถานะล็อกนั้นจะทำงานเสร็จสมบูรณ์และปลดล็อก และเมื่อปลดล็อกแล้วทรานแซกชั่นอื่นๆ ก็สามารถนำข้อมูลไปใช้งานต่อได้
Emery Marsha 1. Request account balance 1. Request account balance 2. Lock account balance 3. Read account balance (Balance = 1000) 4. Withdraw 200 (Balance = 800) 5. Write account balance (Balance = 800) 6. Unlock account balance 2. Lock account balance 3. Read account balance (Balance = 800) 4. Withdraw 300 (Balance = 500) 5. Write account balance (Balance = 500) 6. Unlock account balance
ประกอบด้วย Read Lockคือถ้าทรานแซกชั่นใดมีการ Read Lock ข้อมูลเอาไว้ ทรานแซกชั่นนั้นจะอ่านข้อมูลได้อย่างเดียว จะอัพเดตไม่ได้ Write Lockคือถ้าทรานแซกชั่นใดมีการ Write Lock ข้อมูลเอาไว้ ทรานแซกชั่นนั้นก็จะทั้งอ่านและอัพเดตข้อมูลได้ (สถานะนี้จะไม่อนุญาตให้ผู้อื่นเข้ามาใช้งานจนกว่าทรานแซกชั่นนี้จะทำงานเสร็จ) พื้นฐานการล็อก
แบ่งออกเป็น 2 ชนิด 1. การล็อกแบบแชร์ (Shared Locks)คืออนุญาตให้ทรานแซกชั่นอื่นๆเข้ามาอ่านข้อมูลได้อย่างเดียว จะอัพเดตไม่ได้ นั่นก็คือการ Read Lock หรือ S-Lock 2. การล็อกแบบเอ็กซ์คลูซีฟ (Exclusive Locks)คือไม่อนุญาตให้ทรานแซกชั่นอื่นๆ ใช้ข้อมูลที่ถูกล็อกอยู่ นั่นก็คือการ Write Lock หรือ X-Lock ประเภทของการล็อก
1. การล็อกฐานข้อมูล (Database Locking) 2. การล็อกตาราง (Table Locking) 3. การล็อกเรคอร์ด (Record Locking) 4. การล็อกฟิลด์ (Field Locking) ระดับของการล็อก (Locking Level)
1. การล็อกฐานข้อมูล (Database Locking) • ล็อกเพื่อไม่ให้คนอื่นเข้ามาใช้ฐานข้อมูลได้ จนกว่าจะปลดล็อก อธิเช่น .. การสำรองข้อมูล .. โดย ในระหว่างที่เราทำการสำรองข้อมูลอยู่นั้น ฐานข้อมูลจะถูกล็อกเอาไว้เพื่อไม่ให้คนอื่นเข้ามาใช้งาน จนกว่าจะสำรองข้อมูลเสร็จสมบูรณ์ และจึงปลดล็อก
2. การล็อกตาราง (Table Locking) • เพื่อไม่ให้ใครเข้ามายุ่งเกี่ยว ในขณะที่มีการปรับปรุงตารางอยู่ • ผู้ใช้งานคนอื่นๆ จะไม่สามารถอ่านเรคอร์ดจากตารางนั้นได้ จนกว่า..จะมีการปลดล็อกตาราง • เหมาะสมกับงานที่ต้องมีการปรับปรุงข้อมูลทั้งหมดในตาราง
3. การล็อกเรคอร์ด (Record Locking) • เป็นการล็อกเพียงบางเรคอร์ดหรือบางแถวในตาราง • เหมาะกับงานที่ต้องการปรับปรุงข้อมูลเฉพาะบางเรคอร์ดที่ต้องการ เช่น การปรับปรุงที่อยู่ของพนักงานบางคน ฯลฯ • ผู้ใช้คนอื่นๆ จะไม่สามารถเข้ามาใช้เรคอร์ดของพนักงานคนนี้ได้ จนกว่าจะถูกปลดล็อก
4. การล็อกฟิลด์ (Field Locking) • เป็นการล็อกแอตตริบิวต์หรือคอลัมน์ที่ถูกใช้งาน • ยังสามารถใช้งานข้อมูลต่างๆ ในเรคอร์ดได้เหมือนเดิม .. ยกเว้นแอตตริบิวต์ที่ถูกล็อก • การล็อกวิธีนี้..จะนำมาใช้กับแอตตริบิวต์ที่มักจะเปลี่ยนแปลงค่าอยู่เสมอ..แต่เป็นวิธีที่ไม่ค่อยนิยมทำกัน..
ภาวะติดตาย จะเกิดขึ้นก็ต่อเมื่อ มีทรานแซกชั่นตั้งแต่ 2 ทรานแซกชั่นขึ้นไปได้มีการล็อกข้อมูล และแต่ละทรานแซกชั่นก็ต่างรอให้แต่ละฝ่ายทำการปลดล็อก เช่น การล็อกค้าง(Deadlock) หรือ ภาวะติดตาย
Emery Marsha 1. Lock record X 1. Lock record Y 2. Request record Y 2. Request record X Wait for Y Wait for X Deadlock
2. ควบคุมภาวะพร้อมกันโดยไม่ใช้วิธีการล็อก (Concurrency Control Without Locking) เมื่อเกิดการ Deadlock ดังนั้นวิธีการแก้ปัญหาก็คือ ไม่ใช้วิธีการล็อก (Without Lock) ซึ่งวิธีนี้ก็แบ่งออกเป็น 2 แบบ - Optimistic Concurrency Control - Timestamp-Based Concurrency Control
Optimistic Concurrency Control วิธีนี้ประกอบด้วย 3 ขั้นตอน คือ 1. Read 2. Validation 3. Write
อ่านข้อมูลจากฐานข้อมูล และบันทึกลงใน Private workspace ของตนเอง โดยที่ทรานแซกชั่นอื่นๆ จะไม่สามารถเข้ามาข้องเกี่ยวกับพื้นที่ของตนได้ Read • เป็นขั้นตอนการตรวจสอบโดย DBMS • เป็นการตรวจสอบความขัดแย้งระหว่างทรานแซกชั่น • ถ้าเกิดความขัดแย้งกัน ทรานแซกชั่นเหล่านั้นจะถูกยกเลิกและพื้นที่ Private Workspace จะถูกเคลียร์ เพื่อเริ่มต้นการทำงานซ้ำอีกรอบของทรานแซกชั่นนั้นๆ Validation หากไม่พบปัญหาความขัดแย้งกันระหว่างทรานแซกชั่น ก็จะทำการนำข้อมูลที่อยู่ใน Private Workspace มาบันทึกลงในฐานข้อมูลจริง Write
Timestamp-based Concurrency Control • วิธีนี้จะใช้เวลาในการตัดสินการเข้าใช้ข้อมูลของทรานแซกชั่น โดยจะเก็บค่าของเวลาลงตัวแปร แล้วดูว่าทรานแซกชั่นไหนมาก่อนก็ให้เข้าใช้ก่อน • สามารถทำได้ 2 วิธีด้วยกัน คือ.. • - ใช้เวลาของระบบเป็นตัวประทับ (Systems Clock) • - ใช้ตัวแปรนับ (Counter)
Timestamp-based Concurrency Control • ใช้เวลาของระบบเป็นตัวประทับ (Systems Clock) วิธีนี้จะนำเวลาของระบบเป็นตัวแปรเก็บค่า แล้วนำไปประทับเพื่อใช้กำหนดลำดับของแต่ละทรานแซกชั่น • ใช้ตัวแปรนับ (Counter) วิธีนี้จะใช้ตัวแปรนับ หรือที่เรียกว่า Counter ที่ใช้เป็นตัวนับด้วยการเพิ่มค่าทีละหนึ่ง แล้วนำมาเป็นตัวกำหนดลำดับให้กับแต่ละทรานแซกชั่น