ฉันใช้ 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(ธุรกรรม$);