Câu trả lời:
Bạn có thể làm được việc này:
DB::transaction(function() {
//
});
Mọi thứ bên trong Closure thực hiện trong một giao dịch. Nếu một ngoại lệ xảy ra, nó sẽ tự động khôi phục.
Discussed in more detail here
liên kết đã chết.
Nếu bạn không thích các chức năng ẩn danh:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
Cập nhật : Đối với laravel 4, pdo
đối tượng không còn công khai nữa nên:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
DB::beginTransaction()
& DB::commit()
& DB::rollback()
. Như vậy sẽ sạch hơn một chút.
DB::connection()->getPdo()->beginTransaction();
DB::transaction
với callback thậm chí còn sạch hơn nhưng nhược điểm là nếu bạn cần phải xác định xử lý khác nhau đối với trường hợp ngoại lệ khác nhau, bạn sẽ phải quay trở lại để cố gắng / catch kỹ thuật
Nếu bạn muốn sử dụng Eloquent, bạn cũng có thể sử dụng
Đây chỉ là mã mẫu từ dự án của tôi
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
question->id
biểu hiện ở các callback giao dịch trả về zero.
Nếu bạn muốn tránh đóng cửa và thích sử dụng mặt tiền, những điều sau đây sẽ giữ cho mọi thứ luôn đẹp và sạch sẽ:
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
Nếu bất kỳ câu lệnh nào không thành công, commit sẽ không bao giờ được thực hiện và giao dịch sẽ không được xử lý.
Tôi Chắc chắn bạn không tìm kiếm giải pháp đóng cửa, hãy thử giải pháp này để có giải pháp nhỏ gọn hơn
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
Vì một số lý do, rất khó tìm thấy thông tin này ở bất cứ đâu, vì vậy tôi quyết định đăng nó ở đây, vì vấn đề của tôi, trong khi liên quan đến các giao dịch Eloquent, đã chính xác thay đổi điều này.
Sau khi đọc NÀY câu trả lời stackoverflow , tôi nhận ra rằng các bảng cơ sở dữ liệu của mình đang sử dụng MyISAM thay vì InnoDB.
Để các giao dịch hoạt động trên Laravel (hoặc bất kỳ nơi nào khác có vẻ như), các bảng của bạn được đặt để sử dụng InnoDB
Tại sao?
Trích dẫn tài liệu về Giao dịch MySQL và Hoạt động nguyên tử ( tại đây ):
MySQL Server (phiên bản 3.23-max và tất cả các phiên bản 4.0 trở lên) hỗ trợ các giao dịch với các công cụ lưu trữ giao dịch InnoDB và BDB. InnoDB cung cấp sự tuân thủ ACID đầy đủ. Xem Chương 14, Động cơ lưu trữ. Để biết thông tin về sự khác biệt của InnoDB so với SQL tiêu chuẩn liên quan đến việc xử lý lỗi giao dịch, hãy xem Phần 14.2.11, “Xử lý lỗi InnoDB”.
Các công cụ lưu trữ không giao dịch khác trong MySQL Server (chẳng hạn như MyISAM) tuân theo một mô hình khác về tính toàn vẹn dữ liệu được gọi là “hoạt động nguyên tử”. Về mặt giao dịch, các bảng MyISAM luôn hoạt động hiệu quả ở chế độ autocommit = 1. Các hoạt động nguyên tử thường cung cấp tính toàn vẹn có thể so sánh được với hiệu suất cao hơn.
Vì MySQL Server hỗ trợ cả hai mô hình, bạn có thể quyết định xem các ứng dụng của mình có được phục vụ tốt nhất hay không nhờ tốc độ hoạt động nguyên tử hoặc việc sử dụng các tính năng giao dịch. Sự lựa chọn này có thể được thực hiện trên cơ sở từng bảng.
Nếu có bất kỳ ngoại lệ nào xảy ra, giao dịch sẽ tự động khôi phục.
Định dạng giao dịch cơ bản của Laravel
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}