Sử dụng giao dịch đúng cách

webman sử dụng giao dịch cơ sở dữ liệu giống như các framework khác, dưới đây là một số điểm cần lưu ý.

Cấu trúc mã

Cấu trúc mã tương tự như các framework khác, ví dụ cách sử dụng của Laravel (tương tự think-orm)

Db::beginTransaction();
try {
    // .. xử lý kinh doanh略...

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

Cần đặc biệt lưu ý là phải sử dụng \Throwablekhông thể sử dụng \Exception, bởi vì trong quá trình xử lý kinh doanh có thể phát sinh Error, nó không thuộc về Exception.

Kết nối cơ sở dữ liệu

Khi thao tác với model trong giao dịch, đặc biệt cần chú ý xem model có thiết lập kết nối hay không. Nếu model đã thiết lập kết nối thì khi mở giao dịch cần chỉ định kết nối, nếu không giao dịch sẽ không hợp lệ (tương tự think-orm). Ví dụ:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // Ở đây đã chỉ định kết nối cho model
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

Khi model đã chỉ định kết nối, mở giao dịch, cam kết giao dịch và rollback giao dịch phải chỉ định kết nối.

Db::connection('mysql')->beginTransaction();
try {
    // xử lý kinh doanh
    $user = new User;
    $user->name = 'webman';
    $user->save();
    Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
    Db::connection('mysql')->rollBack();
}

Tìm kiếm yêu cầu chưa được cam kết giao dịch

Đôi khi bug trong mã kinh doanh dẫn đến một yêu cầu giao dịch không được cam kết, để nhanh chóng xác định phương thức controller nào chưa cam kết giao dịch, có thể cài đặt thành phần webman/log, thành phần này sẽ tự động kiểm tra xem có giao dịch nào chưa được cam kết sau khi yêu cầu hoàn tất và ghi lại nhật ký, từ khóa nhật ký là Uncommitted transactions.

Cách cài đặt webman/log

composer require webman/log

Lưu ý
Sau khi cài đặt cần phải restart lại, reload sẽ không có hiệu quả.