Trong Laravel, bạn có thể sử dụng database transactions bằng cách sử dụng facade DB.
Ví dụ để sử dụng transaction bạn khai báo như sau:
use Illuminate\Support\Facades\DB; class SomeClass { public function someMethod() { DB::transaction(function () { //Thực hiện các thao tác xử lý dữ liệu tại đây. }); } }
Trong phương thức trên nếu có lỗi xảy ra mặc định các thao tác trong transaction sẽ bị hủy bỏ.
Để tự động commit hoặc rollBack bạn có thể truyền một tham số callback vào hàm DB::transaction() và gọi commit() hoặc rollBack() khi xử lý dữ liệu.
use Illuminate\Support\Facades\DB; class SomeClass { public function someMethod() { DB::transaction(function () { //Thực hiện các thao tác xử lý dữ liệu tại đây. if (/* some condition */) { DB::commit(); } else { DB::rollBack(); } }); } }
Ví dụ sử dụng tham số callback với hàm DB::transaction() trong someMethod() bằng cách tạo một đối tượng User. Sau đó gọi hàm DB::transaction() với tham số $user và tạo một đối tượng Profile với thông tin $user để lưu trữ. Trong quá trình thực thi lệnh này nếu có lỗi thì toàn bộ transaction sẽ được hủy bỏ và ngược lại.
use Illuminate\Support\Facades\DB; class SomeClass { public function someMethod() { $user = new User(); $user->name = 'PolyXGO'; $user->email = 'polyxgo@gmail.com'; $user->password = bcrypt('password'); DB::transaction(function () use ($user) { $user->save(); $profile = new Profile(); $profile->user_id = $user->id; $profile->bio = 'Dịch vụ code thuê giá rẻ'; $profile->save(); }); } }
Để đảm bảo transaction được hủy bỏ khi có lỗi xảy ra bạn có thể sử dụng từ khóa try-catch:
use Illuminate\Support\Facades\DB; class SomeClass { public function someMethod() { try { DB::transaction(function () { //Thực hiện các thao tác xử lý dữ liệu tại đây. }); } catch (\Exception $e) { throw $e; } } }