การใช้ธุรกรรมอย่างถูกต้อง

Webman ใช้ธุรกรรมฐานข้อมูลเช่นเดียวกับเฟรมเวิร์กอื่น ๆ ที่นี่มีข้อควรระวังที่ต้องทราบ

โครงสร้างโค้ด

โครงสร้างโค้ดคล้ายกับเฟรมเวิร์กอื่น ๆ เช่น วิธีการของ Laravel (think-orm คล้ายกัน)

Db::beginTransaction();
try {
    // ..การประมวลผลธุรกิจโดยย่อ...

    Db::commit();
} catch (\Throwable $exception) {
    Db::rollBack();
}

สิ่งที่ต้อง注意โดยเฉพาะคือ ต้องใช้ \Throwable และ ไม่สามารถใช้ \Exception ได้ เนื่องจากในระหว่างการประมวลผลธุรกิจอาจเกิด Error ขึ้น ซึ่งไม่จัดอยู่ในประเภท Exception

การเชื่อมต่อฐานข้อมูล

เมื่อทำงานกับโมเดลในธุรกรรม จำเป็นต้องตรวจสอบว่าโมเดลได้ตั้งค่าการเชื่อมต่อไว้หรือไม่ หากโมเดลตั้งค่าการเชื่อมต่อ ขณะเปิดธุรกรรมต้องระบุการเชื่อมต่อ มิฉะนั้นธุรกรรมจะไม่ถูกต้อง (think-orm คล้ายกัน) ตัวอย่างเช่น

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // ที่นี่ได้ระบุการเชื่อมต่อให้กับโมเดล
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

เมื่อโมเดลได้ตั้งค่าการเชื่อมต่อแล้ว การเปิดธุรกรรม การยืนยันธุรกรรม และการย้อนกลับธุรกรรมจะต้องระบุการเชื่อมต่อ

Db::connection('mysql')->beginTransaction();
try {
    // การประมวลผลธุรกิจ
    $user = new User;
    $user->name = 'webman';
    $user->save();
    Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
    Db::connection('mysql')->rollBack();
}

ค้นหาคำร้องขอที่มีธุรกรรมที่ยังไม่ถูกยืนยัน

บางครั้งข้อบกพร่องในโค้ดธุรกิจอาจทำให้ธุรกรรมของคำร้องขอใดคำร้องขอหนึ่งไม่ได้รับการยืนยัน เพื่อช่วยในการหาตำแหน่งที่ถูกต้องว่าเมธอดของคอนโทรลเลอร์ใดที่ไม่ยืนยันธุรกรรม สามารถติดตั้ง webman/log คอมโพเนนต์ ซึ่งจะทำการตรวจสอบอัตโนมัติว่ามีธุรกรรมที่ยังไม่ได้รับการยืนยันหรือไม่หลังจากคำร้องขอเสร็จสิ้น และบันทึกลงในบันทึก โดยมีคีย์เวิร์ดในบันทึกว่า Uncommitted transactions

วิธีการติดตั้ง webman/log

composer require webman/log

หมายเหตุ
หลังจากติดตั้งต้องทำการ restart ใหม่ เพื่อให้มีผล ข้อมูลที่ reload จะไม่มีผล