Bạn có thể sử dụng phương thức transaction
của DB
facade để chạy tập hợp các câu lệnh trong một database transaction. Nếu một exception
xảy ra trong transaction Closure
, transaction sẽ tự động được rolled back
. Nếu Closure
thực thi thành công, transaction
sẽ tự động được committed
. Bạn không cần lo lắng về việc phải thực hiện rolling back thủ công trong khi sử dụng phương thức transaction
:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
Handling Deadlocks
Phương thức transaction cho phép một tham số thứ 2 để định nghĩa số lần mà transaction sẽ được reattempted
khi mà deadlock xảy ra. Khi có hiện tượng deadlock, một exception sẽ được đưa ra
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }, 5);
Manually Using Transactions
Nếu bạn muốn quản lý transaction thủ công, bạn có thể sử dụng phương thức beginTransaction
trong DB
facade:
DB::beginTransaction();
Bạn có thể rollBack
transaction qua phương thức rollBack:
DB::rollBack();
Cuối cùng bạn có thể commit qua phương thức commit:
DB::commit();
Ví dụ
try { DB::beginTransaction(); $this->saveList($request->input('id'), $request->get('list'), 0); $result = ['success' => trans('backend/common.success'), 'status' => 200]; DB::commit(); return response()->json(json_encode($result)); } catch (\Exception $ex) { DB::rollBack(); $result = ['error' => trans('backend/common.error'), 'status' => 500, 'message' => $ex->getMessage()]; return response()->json($result); } Xem thêm