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.
Nội dung bài viết
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: