เหตุใดจึงต้องยกเลิกการทำธุรกรรมที่ไม่มีข้อผูกมัดโดยย้อนหลัง


19

ฉันมีบันทึกฐานข้อมูลซึ่งธุรกรรมบางรายการชนะ เราเรียนรู้ในชั้นเรียนว่าการกระทำของผู้แพ้จะต้องย้อนกลับไป

มีเหตุผลในการทำสิ่งนี้ถอยหลังหรือไม่? ทุกคนสามารถให้ตัวอย่างง่ายๆของบันทึกที่ยกเลิกการส่งต่อจะให้ผลลัพธ์ที่ผิด?


ไม่ควรถามคำถามนี้ในเว็บไซต์อื่นที่เจาะจงกว่านี้ใช่ไหม
nbro

คำตอบ:


35

การทำธุรกรรมเดิม:

  1. แทรกบันทึกRr
  2. อัปเดตบางฟิลด์ของRfr

ยกเลิกการส่งต่อ:

  1. ลบบันทึกRr
  2. ย้อนกลับการปรับปรุงไปยัง - โอ้รอRไม่มีอยู่แล้ว! สิ่งนี้ทำให้เกิดข้อผิดพลาดrr

สิ่งต่าง ๆ จะต้องถูกยกเลิกเป็นรายบุคคลในลำดับกลับกันหรือไม่หากระบบสามารถคิดได้ว่าสิ่งใดที่รัฐจะต้องย้อนกลับไปและสามารถนำการเปลี่ยนแปลงที่จำเป็นทั้งหมดไปใช้ก่อนที่จะดำเนินการอย่างอื่นได้หรือไม่?
supercat

11
การยกเลิกการเปลี่ยนแปลงในลำดับกลับกันทำให้ง่าย ทำไมคุณต้องพยายามทำให้ตัวเองหนักขึ้น?
gnasher729

1
ไม่ระบบจะไม่ทำทุกอย่างแต่จะคิดออกตามลำดับย้อนหลัง
Evil

3
ในระบบฐานข้อมูลในโลกแห่งความเป็นจริงที่ทำไม่ได้ในลำดับย้อนกลับจะไม่สามารถทำได้เนื่องจากข้อ จำกัด ที่สำคัญในตาราง
SeanR

11

หากต้องการเพิ่มคำตอบของ DylanSp พยายามอัปเดตฟิลด์ในระเบียนที่ไม่มีอยู่จะล้มเหลว แต่ผลลัพธ์จะยังคงเป็นผลลัพธ์ที่คาดไว้: บันทึก r ไม่มีอยู่

อย่างไรก็ตามให้พิจารณาสถานการณ์ที่การลบเรคคอร์ดจะล้มเหลวจริง:

  1. แทรกคำสั่งซื้อ
  2. แทรก Orderline L.

สมมติว่าไม่ใช่คำสั่งที่ไม่สมจริงว่าทุกคำสั่งซื้อจะต้องเกี่ยวข้องกับคำสั่งซื้อ

ตอนนี้ย้อนกลับการทำธุรกรรมเริ่มต้นด้วยการลบคำสั่งซื้อจะล้มเหลวเพราะที่จะละเมิดกฎธุรกิจของเรา

ดังนั้นหลังจาก

  1. ลบคำสั่งซื้อ O. (FAIL)
  2. ลบ Ordeline L. (สำเร็จ)

เราอาจท้ายด้วยคำสั่งซื้อที่มีอยู่ (ไม่มีคำสั่งซื้อ)

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


โอเคมันสมเหตุสมผลแล้ว ขอบคุณสำหรับความช่วยเหลือของคุณ
prjctdth

เหมาะสมหรือไม่ที่จะสมมติว่าข้อ จำกัด ไม่ได้ถูกละเมิดก่อนหรือหลังการทำธุรกรรมในสถานการณ์ "ปกติ"? ตามปกติฉันหมายความว่าธุรกรรมจะไม่ล้มเหลวหากมีเพียงคนเดียวที่ใช้ฐานข้อมูล หากเป็นจริงทำไมจึงเป็นเรื่องสำคัญที่จะไม่แนะนำการละเมิดข้อ จำกัด ในระหว่างกระบวนการเลิกทำ ดูเหมือนว่าข้อ จำกัด สามารถปิดได้ที่จุดเริ่มต้นของการเลิกทำและเปิดใช้งานเมื่อการดำเนินการเสร็จสิ้น
Noctis Skytower

2
@NoctisSkytower การปิดข้อ จำกัด ในระหว่างการดำเนินการ I / O ปกติทำให้ไม่มีประโยชน์ พวกเขามีเหตุผล ตัวอย่างของฉันแสดงให้เห็นชัดเจนว่าข้อ จำกัด สามารถพบได้อย่างไรภายใต้สถานการณ์ปกติ แต่ถูกละเมิดในระหว่างการย้อนกลับ การปิดข้อ จำกัด ระหว่างการย้อนกลับเป็นเรื่องที่ซับซ้อนเกินความจำเป็นและแก้ไขปัญหาที่ผิดพลาด ปัญหาไม่ใช่ข้อ จำกัด ปัญหาคือการละเมิดโดยพยายามย้อนกลับอย่างไม่ถูกต้อง
oerkelens

ใช่มันสมเหตุสมผล แต่ทำไมต้องตรวจสอบข้อ จำกัด ระหว่างการย้อนกลับ สมมติว่าการย้อนกลับได้รับการออกแบบให้รับประกันว่าจะเสร็จสมบูรณ์โดยไม่มีปัญหาเหตุใดจึงเสียเวลาโดยไม่จำเป็นในการตรวจสอบข้อ จำกัด หากทราบว่าพวกเขาจะไม่ถูกละเมิดภายในเวลาที่การย้อนกลับเสร็จสิ้น BTW นั้นควรเป็นการรับประกันเพราะถ้าการย้อนกลับล้มเหลวฐานข้อมูลจะต้องหมุนไปข้างหน้าซึ่งไม่สามารถทำได้
Noctis Skytower

1
@ NoctisSkytower ควรเป็นไปไม่ได้ที่ DB จะอยู่ในสถานะที่ถูกละเมิดข้อ จำกัด แม้ว่าจะเป็นสถานะชั่วคราว หากการย้อนกลับทั้งหมดเป็นอะตอมมันก็ไม่สำคัญว่าจะเกิดอะไรขึ้นเพราะไม่มีคำสั่งมันเป็นคำสั่งเดียวที่ "เกิดขึ้นพร้อมกัน" หากมีธุรกรรมสองรายการขึ้นไปที่ถูกย้อนกลับแยกกันในบางออเดอร์ก็เป็นข้อบังคับว่าคำสั่งนั้นจะทำให้ผู้สังเกตการณ์ที่อ่านข้อมูลตรงกลางสามารถเห็นสถานการณ์ที่มีข้อ จำกัด ทั้งหมดเท่านั้น
Peteris

6

ลองไปเปรียบเทียบ: สมมติว่าคุณกำลังออกไปทานอาหารเย็น

  1. ใส่ถุงเท้า
  2. ใส่รองเท้า
  3. ยืนขึ้น.
  4. เดินไปที่ประตู

จากนั้นคุณจะได้รับโทรศัพท์ แผนอาหารค่ำถูกยกเลิก

  1. ถอดถุงเท้า
  2. ถอดรองเท้า
  3. นั่งลง.
  4. เดินออกไปจากประตู

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

การยกเลิกสิ่งสุดท้ายที่คุณทำจะทำให้คุณกลับไปยังจุดที่คุณอยู่เมื่อเกิดขั้นตอนถัดไปจนถึงขั้นตอนสุดท้าย จากนั้นคุณเลิกทำขั้นตอนนั้นและทำซ้ำย้ายกลับจนกว่าจะไม่มีสิ่งใดเหลืออยู่ ในทางกลับกันขั้นตอนแรกอาจเป็นไปไม่ได้เนื่องจากรัฐทำตามขั้นตอนในภายหลัง

การพูดทางคณิตศาสตร์: การกระทำอาจไม่เดินทางดังนั้นเมื่อใดก็ตามที่สำคัญกับขั้นตอนที่คุณทำครั้งแรกหรือครั้งที่สองลำดับที่คุณยกเลิกขั้นตอนจะสำคัญ


3

สิ่งนี้ถูกต้องเพราะการทำธุรกรรมถูกสร้างขึ้นบนกันและกันและผลลัพธ์ของการทำธุรกรรมนั้นขึ้นอยู่กับสถานการณ์เป็นอย่างมากก่อนที่มันจะเกิดขึ้น

ลองดูธุรกรรมทางการเงิน:

(ที่จุดเริ่มต้นก่อนการทำธุรกรรมเป็นaหนี้ฉัน 100 USD)

  1. a เป็นหนี้ฉัน 100 USD (ตอนนี้เป็นหนี้ทั้งหมด 200)
  2. aรับส่วนลด 10% สำหรับสิ่งที่เขาเป็นหนี้ฉัน (ตอนนี้รวมหนี้ 180)

สมมติว่าฉันต้องการยกเลิกธุรกรรมทั้งสอง

หากเรายกเลิกครั้งแรกก่อนเราจะจบลงด้วย:

  1. หนี้ต่ำกว่า 100 (ตอนนี้มีหนี้ 80)
  2. ยกเลิกส่วนลด 10% (ตอนนี้มีหนี้ 80 / 0.9 = 88)

นี่เป็นความผิดพลาดเราต้องคืนหนี้ให้ 100 ซึ่งจะถูกต้องหากเรายกเลิกการทำธุรกรรมในลำดับย้อนกลับ

  1. ยกเลิกส่วนลด - ตอนนี้เป็นหนี้ 200
  2. หนี้ต่ำกว่า 100 - ตอนนี้เป็นหนี้ 100

2

สมมติว่ามีตาราง 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


0

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

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