![]() |
|
![]() |
|
![]() |
ปัญหาและการแก้ไขการเกิดเดดล็อก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 เพื่อใช้ในการตรวจจับเดดล็อกตลอดเวลา |
|
|