หากการทำธุรกรรม "มุ่งมั่น" จะถูกบันทึกไว้อย่างแน่นอนหรือไม่?


12

หากการทำธุรกรรมที่จะมุ่งมั่นที่จะประสบความสำเร็จผมสามารถแล้วเป็น 100% แน่ใจว่าจะได้รับการเขียนไปยังฐานข้อมูลและไฟล์บันทึก? ฉันมั่นใจได้อย่างไรว่าข้อมูลถูกบันทึกไว้?

วันนี้ล็อกไฟล์ของเราถึงขีด จำกัด ของไดรฟ์และเราได้รับข้อผิดพลาดมากมาย นอกจากนี้บริการอื่น ๆ บางอย่างล้มเหลว เราเพิ่มดิสก์และรีสตาร์ทเซิร์ฟเวอร์

ในระหว่างการเริ่มต้นเซิร์ฟเวอร์ทำการ "กู้คืนฐานข้อมูล" - ฉันจะแน่ใจได้หรือไม่ว่าทุกอย่างโอเคอีกครั้ง?


2
คุณสามารถตรวจสอบบันทึกข้อผิดพลาดหลังจากการกู้คืนเสร็จสมบูรณ์เพื่อดูจำนวนธุรกรรมที่ถูกคอมมิตและจำนวนที่ถูกย้อนกลับ ไม่มีคำตอบวิเศษนี้ - หากดิสก์พังทั้งหมดขึ้นอยู่กับสถานะของการทำธุรกรรมในเวลานั้น
Aaron Bertrand

1
@AaronBertrand แต่ถ้าการทำธุรกรรมอยู่ในสถานะ "commit" (การส่งคำสั่งสำเร็จแล้ว) มันจะเป็นไปได้ยังไงที่มันหายไประหว่างการกู้คืน?
SQL Police

3
@Giosco: มันไม่สามารถ "commit" หมายถึงมันอยู่ในไฟล์บันทึกของฐานข้อมูล วิธีเดียวที่จะทำให้มันหายไปหลังจากนั้นก็คือ 1) สูญเสียล็อกไฟล์ก่อนที่มันจะถูกบันทึกลงในไฟล์ข้อมูลหรือ 2) สูญเสียทั้งล็อกไฟล์และไฟล์ข้อมูลหรือ 3) ความผิดพลาดของมนุษย์ โปรดทราบว่า (3) มักจะเป็นที่ชื่นชอบที่สุด
RBarryYoung

2
@Giosco คุณจะรู้ได้อย่างไรว่าการทำธุรกรรมทั้งหมดของคุณในเวลาที่ไดรฟ์เต็มได้รับการยอมรับ
Aaron Bertrand

2
กระบวนงานที่เก็บไว้ <> ทรานแซกชัน - โพรซีเดอร์ที่เก็บไว้ของคุณสามารถมีทรานแซคชันที่ชัดเจนหลายรายการหรือโดยนัยเท่านั้นอาจมีลอง / จับตรรกะอาจมีธุรกรรมที่เลเยอร์ C # ฯลฯ เป็นต้นอีกครั้งโดยสมมติว่าไม่มีข้อยกเว้น อาจเป็นอันตรายเกินไปเล็กน้อยเป็นคำสั่งแบบครอบคลุม
Aaron Bertrand

คำตอบ:


16

หากแอปพลิเคชันไคลเอนต์ได้ออก COMMIT และได้รับรหัสสำเร็จแล้วธุรกรรมนั้นรับประกันโดยเอ็นจิ้นเพื่อความทนทาน รับประกันได้ว่าการเปลี่ยนแปลงทั้งหมดที่ทำในธุรกรรมจะปรากฏให้เห็นแม้จะเกิดความผิดพลาด นอกจากนี้การกู้คืนยังรับประกันว่าการทำธุรกรรมใด ๆ ที่ไม่ได้กระทำจะถูกย้อนกลับในกรณีที่เกิดความผิดพลาด

สำหรับรายละเอียดเพิ่มเติมฉันแนะนำให้อ่านกระดาษARIES

การบันทึกและการกู้คืนการเขียนล่วงหน้าไม่สามารถรับประกันได้ว่าฮาร์ดแวร์หน่วยเก็บข้อมูลพื้นฐานมีข้อบกพร่อง (ความเสียหาย) และผลิตภัณฑ์วิศวกรรมใด ๆ อาจมีข้อบกพร่อง

แอปพลิเคชันของคุณเช่นเดียวกับแอปพลิเคชันอื่นทั้งหมดจะต้องเขียนอย่างระมัดระวังเพื่อให้ทำงานได้อย่างถูกต้องเมื่อมีข้อขัดข้อง (ข้อผิดพลาด) ไม่มีเวทย์มนตร์


หากแอปพลิเคชันไคลเอนต์ออก COMMIT แต่ไม่ได้รับการตอบสนองจาก DB จนกว่าจะหมดเวลาในฝั่งไคลเอ็นต์ สิ่งนี้เกี่ยวกับการกระทำ? สำเร็จหรือล้มเหลว วิธีตรวจสอบ
Gab 是好人
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.