Sử dụng Transaction trong MySQL và Laravel

Chào anh em!!!

Ở bài viết trước Transaction trong MySQL: Tổng quan, khái niệm, cơ chế chúng ta đã dạo qua về những khái niệm và cơ chế về Transaction rồi. Học thì phải đi đôi với hành, hôm nay chúng ta sẽ sang phần HÀNH các bạn nhé. Hành ở đây là thực hành chứ ko phải ăn hành hay hành hạ đâu nhé :))).

Trong bài viết này mình sẽ hướng dẫn các bạn cách sử dụng transaction trong MySQL và trong Laravel.

Cách dùng transaction trong MySQL

Sử dụng Transaction trong MySQL

Các lệnh cơ bản

MySQL cung cấp cho chúng ta những câu lệnh sau để làm việc với transaction:

  • Để bắt đầu một transaction, các bạn sử dụng câu lệnh START TRANSACTION
  • Để commit một transaction, các bạn sử dụng câu lệnh COMMIT
  • Để rollback một transaction, các bạn sử dụng câu lệnh ROLLBACK
  • Để disable hoặc enable chế độ auto-commit thì các bạn sử dụng SET autocommit

Mặc định MySQL sẽ tự động commit các thay đổi, chúng ta có thể disable hoặc enable bằng cách:

Disable auto-commit:

SET autocommit = 0;

Hoặc

SET autocommit = OFF

Enable auto-commit:

SET autocommit = 1;

Hoặc

SET autocommit = ON;

Ví dụ

-- 1. Disable chế độ auto commit 
SET autocommit = 0;
-- 2. Bắt đầu 
START TRANSACTION;
-- 3. Thao tác thêm/sửa/xóa
INSERT...
UPDATE...
DELETE...
-- 4. Tiến hành COMMIT
COMMIT;
-- 5. Hoặc rollback
ROLLBACK;

Sử dụng transaction trong Laravel

Trong Laravel bạn có thể dùng transaction bằng 2 cách:

Cách thủ công

Để bắt đầu transaction:

DB::beginTransaction();

Để rollback:

DB::rollBack();

Để commit:

DB::commit();

Ví dụ thực tế:

DB::beginTransaction();

try {
    $user = User::findOrFail($id);
    $order = Order::create([
        'user_id' => $user->id,
        'money' => 1000000,
    ]);
    $availableAmount = $user->amount - 1000000;
    $user->update(['amount' => $availableAmount]);
    DB::commit();
} catch (Exception $e) {
    DB::rollBack();
}

Cách tự động:

Nếu có lỗi xảy ra thì sẽ tự động rollback và ngược lại nếu thành công thì sẽ tự động commit:

DB::transaction(function () {
    $user = User::findOrFail($id);
    $order = Order::create([
        'user_id' => $user->id,
        'money' => 1000000,
    ]);
    $availableAmount = $user->amount - 1000000;
    $user->update(['amount' => $availableAmount]);
});

Tham khảo:

https://www.mysqltutorial.org/mysql-transaction.aspx/

https://laravel.com/docs/8.x/database#database-transactions

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *