Score:1

ธุรกรรมฐานข้อมูลจะย้อนกลับหรือไม่หากเกิดไทม์เอาต์ของ PHP/เกตเวย์ / การเชื่อมต่อหลุด/สูญหาย

ธง ca

ฉันใช้ Drupal อยู่เบื้องหลังเลเยอร์พร็อกซี/แคชแบบย้อนกลับ (เช่น Cloud Front/ Akamai) และบางครั้งบริการก็ทำงานค่อนข้างช้า (ดังนั้นฉันจึงหมดเวลาของเกตเวย์ ด้วยเหตุผลต่างๆ เช่น มีคนใช้เซิร์ฟเวอร์มากเกินไป) หรือมีบางสิ่งที่เลวร้ายเกิดขึ้น ในเซิร์ฟเวอร์ฟาร์ม (นักเทียบท่า micro-architecture) และฉันได้รับ 502 Bad Gateway

เรารู้หรือไม่ว่าธุรกรรมฐานข้อมูลจะย้อนกลับในกรณีดังกล่าวหรือไม่? สิ่งนี้เกี่ยวข้องอย่างยิ่งเมื่อทำการอัปเดตเอนทิตีมากกว่า 800 รายการผ่าน Batch API

เช่น. (ตามรหัสจำลอง: https://www.drupal.org/docs/drupal-apis/database-api/database-transactions)


$transaction = $connection->startTransaction();

พยายาม {
  // ทำบางสิ่งที่เขียนไปยังฐานข้อมูล
  $entity = create_some_entity();
  $entity->save();

  // แสร้งทำเป็นว่า 502 Bad Gateway หรือการหมดเวลาของเกตเวย์เกิดขึ้นที่นี่

  // เขียนฐานข้อมูลอื่นที่ขึ้นอยู่กับฐานข้อมูลแรก
  $dependent_entity = update_dependent_entity($entity->id());
  $dependent_entity->save();
}
จับ (\ ข้อยกเว้น $e) {
  // มีข้อผิดพลาดในการเขียนไปยังฐานข้อมูล ดังนั้นฐานข้อมูลจึงย้อนกลับ
  // ไปยังสถานะเมื่อธุรกรรมเริ่มต้นขึ้น
  // ไม่แน่ใจว่าการจับข้อยกเว้นจะทำอะไรที่นี่
  // (เนื่องจากคาดว่าจะไม่มีข้อยกเว้น)
  $transaction->rollBack();
}

// คอมมิตธุรกรรมโดยยกเลิกการตั้งค่าตัวแปร $transaction
unset(ธุรกรรม$);
Score:2
ธง us

ธุรกรรมจะถูกย้อนกลับก็ต่อเมื่อ ธุรกรรม :: ย้อนกลับ () เรียกโดยชัดแจ้ง. ในกรณีที่หมดเวลาจะไม่เกิดขึ้น
ที่จริงแล้ว ในกรณีนั้น การเปลี่ยนแปลงฐานข้อมูลจะไม่เกิดขึ้นด้วยซ้ำ เนื่องจากสิ่งนั้นจะเกิดขึ้นก็ต่อเมื่อ ธุรกรรม::__destruct() ถูกเรียก.

ฟังก์ชั่นสาธารณะ __destruct () {
  // ถ้าเราย้อนกลับการทำธุรกรรมก็จะถูกป๊อปแล้ว
  ถ้า (! $ this-> ย้อนกลับ) {
    $this->connection->popTransaction($this->name);
  }
}
ca flag
จะทำอย่างไรในกรณีที่ผู้ใช้ (เว็บเบราว์เซอร์) ตัดการเชื่อมต่อหรือ reverse proxy ตัดการเชื่อมต่อ (ดังนั้น PHP จึงยังไม่หมดเวลา)
apaderno avatar
us flag
If the server is set to wait for data from a database connection less than the time required for PHP to time out, the transaction should be rolled-back (assuming that a database connection timeout causes a PHP exception). Otherwise, PHP will time out waiting for a reply that never comes back (and no exception is raised). Also, since it's batch processing, when the browser loses the connection with the server, the batch processing is interrupted.
ca flag
ข้อความเหล่านี้ดูเหมือนจะแนะนำว่าธุรกรรมจะถูกย้อนกลับในกรณีที่กระบวนการ PHP หยุดทำงานหรือการเชื่อมต่อเครือข่ายระหว่าง PHP และเซิร์ฟเวอร์ MySQL ล้มเหลว `นี่คือมาตรการความปลอดภัยเพื่อช่วยหลีกเลี่ยงความไม่สอดคล้องกันในกรณีที่สคริปต์หยุดทำงานโดยไม่คาดคิด - ถ้า คุณไม่ได้ทำธุรกรรมอย่างชัดเจน ดังนั้นจะถือว่ามีบางอย่างผิดพลาด ดังนั้นการย้อนกลับจะดำเนินการเพื่อความปลอดภัยของข้อมูลของคุณ" (https://www.php.net/manual/en/pdo.transactions php). [...]
ca flag
`นั่นหมายความว่าหากเซสชันของคุณยกเลิกการเชื่อมต่อไม่ว่าด้วยเหตุผลใดก็ตาม ไม่ว่าจะด้วยทางเลือกหรืออื่นๆ เนื่องจากมีข้อผิดพลาดเกิดขึ้น เช่น การเชื่อมต่อเครือข่ายล้มเหลว เป็นต้น ธุรกรรมที่กำลังดำเนินอยู่จะถูกย้อนกลับ' (https://dba.stackexchange.com /a/60005), 'ฉันรู้ว่าธุรกรรมจะถูกย้อนกลับหากการเชื่อมต่อหยุดทำงานก่อนที่จะยอมรับ' (https://dba.stackexchange.com/q/215579) 'หากคุณปิดใช้งานการคอมมิตอัตโนมัติ ธุรกรรมที่ไม่ผูกมัดใดๆ ย้อนกลับเสมอเมื่อสิ้นสุดเซสชัน ' (https://stackoverflow.com/a/65213497/5150644)
ca flag
ดังนั้นฉันจึงถูกต้องที่จะแนะนำให้ Drupal ย้อนกลับในกรณีนี้ (ข้อผิดพลาดของ PHP หรือการเชื่อมต่อหลุด) คำตอบของคุณตอบในเชิงยืนยันหรือไม่? (โดยหลักแล้วธุรกรรมจะ 'ย้อนกลับ' เนื่องจากไม่มีการทำรายการบัญชีตั้งแต่แรก) ?

โพสต์คำตอบ

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