อาการ
พิจารณาสถานการณ์ต่อไปนี้:
-
คุณมีฐานข้อมูลที่มีตัวเลือก ALLOW_SNAPSHOT_ISOLATION และ READ_COMMITTED_SNAPSHOT เปิดใช้งานใน Microsoft SQL Server ๒๐๐๘ R2
-
คุณเรียกใช้คำสั่ง select ที่มีคำแนะนำ TABLOCK และ UPDLOCK กับตารางในฐานข้อมูล
-
คำสั่งselectจะถูกห่อในทรานเริ่มต้นที่ชัดเจนแต่จะไม่มีการดำเนินการทรานแซคชัน
-
คิวรีเดียวกันอีกสองรายการที่เริ่มต้นด้วยคำแนะนำคิวรีเดียวกันอยู่ในทรานแซคชันที่ชัดเจน
ในสถานการณ์สมมตินี้เมื่อคิวรีแรกมีความมุ่งมั่นหนึ่งในคิวรีอื่นจะถูกล็อกตาย
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจาก SQL Server รายงานการชะงักงันในหนึ่งในสถานการณ์สมมติต่อไปนี้อย่างไม่ถูกต้อง:
-
เมื่อ ALLOW_SNAPSHOT_ISOLATION และ READ_COMMITTED_SNAPSHOTเปิดใช้งานสำหรับฐานข้อมูลคิวรีหลายรายการกับธุรกรรมเดียวกันอาจถูกรายงานว่าเป็นล็อกอย่างไม่ถูกต้องเมื่อหนึ่งในนั้นเสร็จสมบูรณ์
-
เมื่อ ALLOW_SNAPSHOT_ISOTION เปิดใช้งานและคำแนะนำ TABLOCK และ UPDLOCK จะถูกใช้งานที่สองและคำสั่ง SELECT ที่สามจะใช้การล็อก IX ที่มีความตั้งใจในการแปลงเป็น X ตัวล็อก IX สิ้นสุดลง deadlocking เมื่อพยายามแปลงเป็น X ทำ
-
เมื่อ ALLOW_SNAPSHOT_ISOLATIONปิดใช้งานแบบสอบถามที่สองและที่สามจะได้รับการล็อกหกตัว ในสถานการณ์นี้เมื่อหกล็อกถูกแปลงเป็น X เป็นเพียงสถานการณ์สมมติการบล็อกไม่ใช่การชะงักงัน
การแก้ไข
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตที่สะสมของ SQL Server ครั้งแรก หลังจากที่คุณนำโปรแกรมแก้ไขด่วน SQL Server แก้ไขปัญหาด้วยการบันทึกถ้าพบคำแนะนำในการอ่าน คำใบ้หรือคำใบ้ NOLOCK สำหรับฐานข้อมูลและคิวรี ข้อมูลนี้จะถูกใช้เพื่อเลือกชนิดของล็อกที่ถูกต้องเพื่อจัดการสถานการณ์อย่างถูกต้องแทนที่จะมีการล็อกตายของรายงานอย่างไม่ถูกต้อง
การอัปเดตที่สะสม11สำหรับ SQL Server ๒๐๐๘ R2 SP2 /en-us/help/2926028
การอัปเดตที่สะสมใหม่แต่ละรายการสำหรับ SQL Server ประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมดและการแก้ไขการรักษาความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตที่สะสมก่อนหน้านี้ ตรวจสอบการอัปเดตที่สะสมล่าสุดสำหรับ SQL Server:
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"