หากฉันมีลอจิกที่เกี่ยวข้องกับการอัปเดตวัตถุหลายรุ่นซึ่งจะอัปเดตบางตารางในฐานข้อมูลวิธีการทำธุรกรรมฐานข้อมูลเพื่อให้แน่ใจว่ามีความสมบูรณ์ของข้อมูล
หากฉันมีลอจิกที่เกี่ยวข้องกับการอัปเดตวัตถุหลายรุ่นซึ่งจะอัปเดตบางตารางในฐานข้อมูลวิธีการทำธุรกรรมฐานข้อมูลเพื่อให้แน่ใจว่ามีความสมบูรณ์ของข้อมูล
คำตอบ:
คุณอาจบันทึกรวมวัตถุที่เชื่อมต่อหลายรายการ ตรวจสอบสิ่งที่วัตถุเหล่านี้เป็นรากเช่น:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
เพิ่มตรรกะการอัปเดตในโมเดลทรัพยากรของรูทและใช้ธุรกรรมที่นั่น
หากคุณต้องการบันทึกอินสแตนซ์ของโมเดลหลายอินสแตนซ์คุณสามารถใช้โมเดลธุรกรรม ฉีดโรงงานทำธุรกรรม\Magento\Framework\DB\TransactionFactory
ในรูปแบบทรัพยากรของคุณและใช้งานเช่นนี้:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Commit หรือ rollback ได้รับการจัดการโดยอัตโนมัติโดยsave()
วิธีการ
หรือคุณสามารถใช้ธุรกรรมโดยตรง (ถ้าคุณใช้การอัพเดทฐานข้อมูลอื่นที่ไม่ใช่$model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
วิธีการของแบบจำลองทรัพยากรภายในดังนั้นแต่ละวิธีจะถูกบันทึกไว้ในธุรกรรมที่แยกต่างหาก ที่เก็บมักจะมีตรรกะการตรวจสอบบางอย่างดังนั้นจึงแนะนำให้ใช้พวกเขาแทนsave()
วิธีการแบบทรัพยากรธรรมดา