[Bài đọc] Database transaction
Ví dụ tình huống đặt ra: Trong một giao dịch chuyển 1 tỷ đồng trong ngân hàng từ tài khoản A sang tài khoản B. Sẽ có ít nhất 2 hoạt động sẽ diễn ra đó là trừ 1 tỷ đồng trong tài khoản A và cộng 1 tỷ đồng trong tài khoản B. Vấn đề xảy ra, giả sử nếu hoạt động trừ 1 tỷ đồng tại tài khoản A thành công nhưng khi hoạt động cộng 1 tỷ đồng vào tài B gặp lỗi không thể thực hiện. Khi đó số tiền 1 tỷ sẽ bị biến mất.Phương án giải quyết, phải đảm bảo rằng 2 hoạt động cùng được thực hiện thành công, nếu có bất kỳ hoạt động nào trong chuỗi hoạt động gặp lỗi thì tất cả các hoạt động đều được hủy, nếu các hoạt động phía trước đã thành công thì sẽ được khôi phục (rollback). Trong Laravel, phương thức transaction của façade DB sẽ thực hiện công việc đó.
Bạn có thể sử dụng phương thức transaction của façade DB để thực thi một tập các lệnh trong một database transaction. Nếu một ngoại lệ được ném ra trong transaction Closure, transaction sẽ tự động rollback. Nếu Closure thực thi thành công, transaction sẽ tự động commit. Bạn không cần phải lo lắng về việc thực hiện thủ công thao tác rollback hoặc commit khi sử dụng phương thức transaction:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
Tự xử lý transaction
Nếu bạn muốn tự thực hiện một transaction và quản lý việc rollbank hay commit, bạn có thể sử dụng phương thức beginTransaction() của façade DB:
DB::beginTransaction();
Sử dụng phương thức rollback() để huỷ một transaction:
DB::rollBack();
Cuối cùng, bạn sử dụng phương thức commit() để hoàn tất một transaction:
DB::commit();
Lưu ý: Sử dụng các phương thức transaction của façade DB cũng có thể quản lý được các transaction cho query builder và Eloquent ORM.
Leave a Reply