Back to Home

DataBase System

Lesson123456791012131415

Lesson 11 : Recovery and Concurrency Control



Lesson Plan
Section No.
Section 1
Section 2
Test
PDF file
PPT File


<<Prev pageCourse MapNext page>>

Print content of this page
Save content of this page

 

ปัญหาและการแก้ไขการเกิดเดดล็อก

1.การเกิดเดดล็อก

การเกิดเดดล็อก (dead lock) คือ เหตุการณ์ที่ทรานแซกชันรอการใช้ข้อมูลที่ถูกล็อกโดยการทรานแซกชันอื่นอย่างไม่รู้จบในลักษณะเป็นลูกโซ่ เหมือนงูกินหาง เช่น การที่ทรานแซกชันที่ 2 รอคอยเพื่อใช้ทรัพยากร ได้แก่ ข้อมูลในฐานข้อมูลหรืออุปกรณ์อื่นๆ ที่กำลังถูกล็อกไว้และใช้งานโดยทรานแซกชันที่ 1 จึงทำให้ทรานแซกชันที่ 2 ไม่สามารถจะเรียกใช้ทรัพยากรนั้นในขณะเดียวกันได้ ดังนั้นทรานแซกชันที่ 2 จะต้องรอจนกว่าทรานแซกชันที่ 1 จะทำงานเสร็จและคลายล็อก (unlock) ทรัพยากรนั้นเสียก่อน อย่างไรก็ตามทรานแซกชันที่ 1 ก็ยังไม่สามารถทำงานใดๆ ต่อได้ เพราะทรานแซกชันที่ 1 ต้องการเรียกใช้ทรัพยากรที่กำลังถูกใช้งานและถูกล็อกไว้โดยทรานแซกชันที่ 2 จึงทำให้ทรานแซกชันที่ 1 ต้องรอทรานแซกชันที่ 2 ทำงานนั้นให้เสร็จและคลายล็อกทรัพยากรนั้นเสียก่อน โดยที่ทั้ง 2 ทรานแซกชันต่างไม่รู้ว่าตนเองรอทรัพยากรของอีกฝ่ายซึ่งต่างฝ่ายต่างล็อกไว้และกำลังใช้งานอยู่ ดังนั้นจึงไม่มีทรานแซกชันใดสามารถจะดำเนินการใดต่อไปได้ จะต้องอยู่ในสภาพหยุดนิ่งและรอไปเรื่อยไม่รู้จบ เหตุการณ์ลักษณะนี้เรียกว่า เดดล็อก (dead lock) ดังภาพที่ 11.3 แสดงเหตุการณ์ที่เกิดเดดล็อก

ภาพที่ 11.3 แสดงเหตุการณ์ของการเกิดเดดล็อก

จากภาพเกิด deadlock ขึ้นได้เนื่องจาก ณ เวลา t1 transaction 1 กำลังใช้ข้อมูล Y อยู่และในขณะเดียวกัน transaction 2 ก็กำลังใช้ข้อมูล X อยู่ ในช่วงเวลา t2 transaction 2 ต้องการใช้ข้อมูล Y ซึ่ง transaction 1 ยังใช้อยู่ ส่วน transaction 2 ก็ยังใช้ข้อมูล X ที่ transaction 1 ต้องการใช้อยู่ ลักษณะนี้จะทำให้เกิด deadlock ขึ้น

2.การแก้ปัญหาการเกิดเดดล็อก

วิธีการแก้ปัญหาการเกิดเดดล็อก มีดังนี้

2.1 การป้องกันก่อนเกิดเดดล็อก (deadlock prevention) วิธีนี้ระบบจัดการฐานข้อมูลในส่วนของการควบคุมภาวะพร้อมกันจะกำหนดว่า ทรานแซกชันที่ต้องการเรียกใช้ข้อมูลใดก็ตามจะต้องล็อกข้อมูลทุกอันที่ต้องการเรียกใช้ทั้งหมดไว้ก่อนการใช้งาน ถ้าหากทรานแซกชันไม่สามารถจะล็อกข้อมูลไว้ล่วงหน้าได้ จะต้องรอจนกว่าจะล็อกได้ครบเสียก่อนจึงจะเริ่มต้นทำงานได้วิธีการป้องกันการเกิดเดดล็อก (dead lock prevention)

วิธีนี้คือให้แน่ใจว่าการเกิดเดดล็อกจะไม่มีวันเกิดขึ้น ซึ่งวิธีการป้องกันนี้ง่ายต่อการใช้งานเที่ยงตรงแน่นอน วิธีการป้องกันการเกิดเดดล็อกมีอยู่หลายวิธีด้วยกันอย่างง่าย คือ transaction ต้องขอใช้ทรัพยากรทุกชิ้นที่ต้องการพร้อม ๆ กันในคราวเดียว คือ หมายถึงว่า transaction นั้นถ้าได้ใช้ทรัพยากรก็จะได้หมดทุกชิ้น หรือไม่เช่นนั้นก็ไม่ได้เลย หรืออีกวิธีหนึ่งคือให้ transaction ที่ของทรัพยากรแล้วไม่ได้ทันที ให้ปลดปล่อยทรัพยากรที่ครอบครองไว้ทั้งหมด แล้วขอใหม่ร่วมกับทรัพยากรที่ขอไม่ได้นั้น

2.2 การตรวจจับการเกิดเดดล็อก (deadlock detection) วิธีนี้เป็นวิธีแก้ปัญหาเมื่อเกิดเดดล็อกแล้วโดยระบบจัดการฐานข้อมูลจะตรวจจับว่าทรานแซกชันใดทำให้เกิดเดดล็อกบ้าง โดยจะตรวจจับจากกราฟที่เรียกว่า “wait-for graph” การตรวจจับการเกิดเดดล็อก

วิธีนี้จะย่อมให้เกิดเดดล็อกได้และพยายามตรวจตราระบบเพื่อหาการเกิดเดดล็อกแล้วทำการแก้ไข หลักการโดยทั่วไปคือ ตรวจหาการรอเป็นวัฏจักร (Circular wait) ระหว่าง transaction ต่าง ๆ โดยเครื่องมือที่สำคัญ คือ resource allocation graph หรือ wait-for graph ซึ่งเป็นกราฟแสดงความสัมพันธ์ระหว่างทรัพยากรและกระบวนการต่าง ๆ ในแง่ของการจับจองใช้และการขอใช้ วิธีการตรวจจับการเกิดเดดล็อกมีตั้งแต่แบบง่าย ๆ โดยอาศัยประสบการณ์และความชำนาญของพนักงานควบคุมเครื่องที่จะเข้าใจถึงระบบทั้งหมด โดยสามารถทราบถึงจุดที่เกิดการหยุดชะงักไม่ดำเนินไปตามที่เคยเป็น ปัญหาที่ตามมาคือ การแก้ไขการเกิดเดดล็อกที่เกิดขึ้นแล้ว ซึ่งก็มีตั้งแต่ปิดระบบทั้งหมดแล้วเริ่มกันใหม่ หรือวิธีที่ละเอียดอ่อนกว่านั้น คือ ตัด transaction ออกจากวัฏจักรการรอคอยที่ละ transaction จนระบบดำเนินต่อไปได้ ดังตัวอย่างเช่น

ซึ่งระบบจัดการฐานข้อมูลจะใช้ข้อมูลจากตัวอย่างข้างต้นสร้างเป็นกราฟเพื่อตรวจจับเดดล็อก ดังแสดงในภาพที่ 11. ดังนี้

ภาพที่ 11. 4 แสดงทรานแซกชันใน wait-for-graph ที่ไม่เกิดเดดล็อก

จากภาพที่ 11.4 จะเห็นว่า ถึงแม้ว่าใน wait for graph มีการรอข้อมูลที่ถูกล็อกโดยทรานแซกชันต่างๆ แต่จะไม่มีทรานแซกชันใดที่ทำให้เกิดเดดล็อก แต่ถ้าหากในภาพที่ 11.4 มีการเพิ่มเติมโดยให้ทรานแซกชันที่ 5 รอข้อมูลที่ถูกล็อกโดยทรานแซกชันที่ 2 จะทำให้เกิดเดดล็อกดังแสดงในภาพที่ 11.5

ภาพที่ 11. 5 แสดงทรานแซกชันใน wait-for-graph ที่ทำให้เกิดเดดล็อกโดย T2, T4, T5

ถ้าหากพบว่ามีทรานแซกชันใน wait for graph นั่นคือ มีการรอในลักษณะวนเป็นลูกโซ่ ซึ่งเป็น wait for graph ที่เกิดเดดล็อก ระบบจัดการฐานข้อมูลจะตรวจสอบและยกเลิกการทำงานของทรานแซกชันที่ทำให้เกิดเดดล็อก ซึ่งอาจจะมีการโรลแบ็กเพื่อให้ทรานแซกชันเริ่มต้นทำงานใหม่ทั้งหมด วิธีนี้สิ้นเปลือง (overhead) มาก เพราะระบบจัดการฐานข้อมูลต้องคอยเพิ่มเติมข้อมูลเข้าใน wait for graph เพื่อใช้ในการตรวจจับเดดล็อกตลอดเวลา

 

 

Last Updated: 12/13/2001 11:20:37 AM
© โครงการเครือข่ายสารสนเทศเพื่อพัฒนาการศึกษา ทบวงมหาวิทยาลัย