ฉันมีบันทึกฐานข้อมูลซึ่งธุรกรรมบางรายการชนะ เราเรียนรู้ในชั้นเรียนว่าการกระทำของผู้แพ้จะต้องย้อนกลับไป
มีเหตุผลในการทำสิ่งนี้ถอยหลังหรือไม่? ทุกคนสามารถให้ตัวอย่างง่ายๆของบันทึกที่ยกเลิกการส่งต่อจะให้ผลลัพธ์ที่ผิด?
ฉันมีบันทึกฐานข้อมูลซึ่งธุรกรรมบางรายการชนะ เราเรียนรู้ในชั้นเรียนว่าการกระทำของผู้แพ้จะต้องย้อนกลับไป
มีเหตุผลในการทำสิ่งนี้ถอยหลังหรือไม่? ทุกคนสามารถให้ตัวอย่างง่ายๆของบันทึกที่ยกเลิกการส่งต่อจะให้ผลลัพธ์ที่ผิด?
คำตอบ:
การทำธุรกรรมเดิม:
ยกเลิกการส่งต่อ:
หากต้องการเพิ่มคำตอบของ DylanSp พยายามอัปเดตฟิลด์ในระเบียนที่ไม่มีอยู่จะล้มเหลว แต่ผลลัพธ์จะยังคงเป็นผลลัพธ์ที่คาดไว้: บันทึก r ไม่มีอยู่
อย่างไรก็ตามให้พิจารณาสถานการณ์ที่การลบเรคคอร์ดจะล้มเหลวจริง:
สมมติว่าไม่ใช่คำสั่งที่ไม่สมจริงว่าทุกคำสั่งซื้อจะต้องเกี่ยวข้องกับคำสั่งซื้อ
ตอนนี้ย้อนกลับการทำธุรกรรมเริ่มต้นด้วยการลบคำสั่งซื้อจะล้มเหลวเพราะที่จะละเมิดกฎธุรกิจของเรา
ดังนั้นหลังจาก
เราอาจท้ายด้วยคำสั่งซื้อที่มีอยู่ (ไม่มีคำสั่งซื้อ)
แน่นอนในกรณีนี้เราสามารถใช้การลบแบบเรียงซ้อน แต่นั่นหมายถึงขั้นตอนที่ 2 จะล้มเหลว (โดยไม่มีผลกระทบ) ยิ่งไปกว่านั้นมันอาจเป็นพฤติกรรมที่ไม่พึงประสงค์ในการใช้การลบแบบเรียงซ้อนตามคำสั่งซื้อ
ลองไปเปรียบเทียบ: สมมติว่าคุณกำลังออกไปทานอาหารเย็น
จากนั้นคุณจะได้รับโทรศัพท์ แผนอาหารค่ำถูกยกเลิก
มีบางอย่างผิดปกติในนั้น คุณอาจเดินทางและทำร้ายตัวเอง หรือเป็นไปได้ว่าคุณจะรู้ว่าการกระทำบางอย่างไม่สามารถยกเลิกได้จนกว่าการกระทำในภายหลังจะถูกยกเลิกก่อน
การยกเลิกสิ่งสุดท้ายที่คุณทำจะทำให้คุณกลับไปยังจุดที่คุณอยู่เมื่อเกิดขั้นตอนถัดไปจนถึงขั้นตอนสุดท้าย จากนั้นคุณเลิกทำขั้นตอนนั้นและทำซ้ำย้ายกลับจนกว่าจะไม่มีสิ่งใดเหลืออยู่ ในทางกลับกันขั้นตอนแรกอาจเป็นไปไม่ได้เนื่องจากรัฐทำตามขั้นตอนในภายหลัง
การพูดทางคณิตศาสตร์: การกระทำอาจไม่เดินทางดังนั้นเมื่อใดก็ตามที่สำคัญกับขั้นตอนที่คุณทำครั้งแรกหรือครั้งที่สองลำดับที่คุณยกเลิกขั้นตอนจะสำคัญ
สิ่งนี้ถูกต้องเพราะการทำธุรกรรมถูกสร้างขึ้นบนกันและกันและผลลัพธ์ของการทำธุรกรรมนั้นขึ้นอยู่กับสถานการณ์เป็นอย่างมากก่อนที่มันจะเกิดขึ้น
ลองดูธุรกรรมทางการเงิน:
(ที่จุดเริ่มต้นก่อนการทำธุรกรรมเป็นa
หนี้ฉัน 100 USD)
a
เป็นหนี้ฉัน 100 USD (ตอนนี้เป็นหนี้ทั้งหมด 200)a
รับส่วนลด 10% สำหรับสิ่งที่เขาเป็นหนี้ฉัน (ตอนนี้รวมหนี้ 180)สมมติว่าฉันต้องการยกเลิกธุรกรรมทั้งสอง
หากเรายกเลิกครั้งแรกก่อนเราจะจบลงด้วย:
นี่เป็นความผิดพลาดเราต้องคืนหนี้ให้ 100 ซึ่งจะถูกต้องหากเรายกเลิกการทำธุรกรรมในลำดับย้อนกลับ
สมมติว่ามีตาราง T ที่มีเพียงหนึ่งคอลัมน์เท่านั้น
สมมติว่า "undo log" เป็นไฟล์ฐานข้อมูลที่มีการทำธุรกรรมที่ไม่มีข้อผูกมัดและ "redo log" เป็นไฟล์ฐานข้อมูลที่มีทั้งการทำรายการที่ไม่ผูกมัดและการทำธุรกรรมที่ยังไม่ได้นำไปใช้กับ datafiles
At 8:00 A.M., Transaction 100 inserts rows with values 101, 102 and 103
into table T.
At 8:10 A.M., Transaction 100 is committed and the commit for
transaction 100 completes.
At 8:15 A.M., Transaction 200 updates row 101 to 201, 102 to 202
and 103 to 203.
At 8:20 A.M., Transaction 200 has not been committed and remains
in the undo log of the database.
At 8:25 A.M., Transaction 300 increments each row by 50,
changing row 201 to 251, 202 to 252, and 203 to 253.
At 8:30 A.M., Transaction 300 has not been committed and remains
in the undo log of the database.
At 8:35 A.M., The instance providing access to the database crashes.
At 8:40 A.M., The instance is restarted, and the database files are
opened as the instance is started:
The committed values in T are still 101, 102 and 103.
Since 201, 202, and 203, and 251, 252 and 253
are not committed, if they are written into the "redo
log" of the database, there is a need to "roll back"
the transactions AFTER the "redo log" is applied.
Since 201, 202, and 203, and 251, 252 and 253
are not committed, they are in the "undo log"
of the database.
The undo log of the database is used BOTH to (1) roll
back a transaction that is deliberately rolled
back in the memory structure of the database instance,
and also (2) during the instance recovery at 8:40 A.M.
At 8:41 A.M., The redo log has been applied, and the T table
contains values 251, 252 and 253 in the instance memory.
The undo log has not yet been applied.
At 8:42 A.M., The undo log is applied in the reverse order:
Uncommitted transaction 300 is undone, and
Uncommitted transaction 200 is undone.
เหตุใดทั้งข้อผูกมัดและการทำธุรกรรมที่ไม่มีข้อผูกมัดเขียนลงในไฟล์บันทึกการทำซ้ำ เหตุผลสำหรับสิ่งนี้คือการให้การกู้คืน ณ จุดเวลา
ซึ่งหมายความว่าเนื้อหาของไฟล์ "ทำซ้ำบันทึก" ไม่สอดคล้องกับการทำธุรกรรม ด้วยเหตุผลนี้เมื่อใดก็ตามที่มีการใช้บันทึกการทำซ้ำเพื่อใช้ธุรกรรมที่กำหนดไว้กับไฟล์ข้อมูลจะต้องใช้ "เลิกทำบันทึก" เพื่อย้อนกลับธุรกรรมที่ไม่มีข้อผูกมัด
ทำไมการทำธุรกรรมใน "ยกเลิกการบันทึก" ย้อนกลับในลำดับย้อนกลับ? ธุรกรรม 300 ได้เพิ่ม 50 ลงในค่าที่มีอยู่ของแต่ละคอลัมน์ของแต่ละแถว ดังนั้นหากธุรกรรม 200 ถูกย้อนกลับก่อนค่าจะเปลี่ยนจาก 251, 252 และ 253 เป็น 201, 202 และ 203 หากมีการย้อนกลับธุรกรรม 300 แล้วค่าสุดท้ายจะเป็น 151, 152 และ 153 - ที่ไม่ตรงกัน ค่าที่กำหนดไว้ดั้งเดิม
ข้อมูลอ้างอิง:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1670195800346464273
มันไม่เป็นความจริงเลย การย้อนกลับอาจใช้บล็อกที่แคชในบันทึกเลิกทำใหม่อีกครั้งเพื่อให้สถานะสุดท้ายเหมือนกับสถานะเริ่มต้น เนื่องจากบันทึกถูกเขียนขึ้นตามลำดับฉันจึงทำให้การย้อนกลับของฉันมีผลกับลำดับต่อไปด้วย คำสั่งซื้อไม่สำคัญเลยเพราะการย้อนกลับจะลองอีกครั้งจนกว่าไฟล์บันทึกจะถูกทำเครื่องหมายว่าถูกตัดสิน