Laravel 即使在';它向后滚动
我发送了一个请求,试图一次保存多个文档 这是我的密码Laravel 即使在';它向后滚动,laravel,laravel-5,transactions,Laravel,Laravel 5,Transactions,我发送了一个请求,试图一次保存多个文档 这是我的密码 DB::beginTransaction(); try { foreach ($request->documents as $index => $documentInfo) { // Check if (// some statement) { $documentExists = Document::where([ // some
DB::beginTransaction();
try {
foreach ($request->documents as $index => $documentInfo) {
// Check
if (// some statement) {
$documentExists = Document::where([
// some checks
])
->exists();
if ($documentExists) {
throw new \Exception("Error Processing Request", 1);
}
}
// Assign document properties
$document->save();
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
if ($request->ajax()) {
return response()->json([
'success' => false,
'document' => $index,
'message' => '// message',
]);
}
return redirect()->back()->with('error', '// message');
}
发生的事情是,我检查每个文档是否有其唯一的值。如果两个具有相同值的文档试图保存,我想返回一个错误。
我尝试上载两个具有相同值的文档,第二个文档返回错误,事务必须失败,但第一个文档保存到数据库中。
我不希望出现这种情况,如果出现错误,我不希望任何文档保存到数据库中。第一个文档被保存,因为如果($documentExists),您没有进入您的警卫
if($documentExists){
,因此不会引发任何异常。您可能希望创建一个临时数据结构,以便在持久化之前进行验证。根据提供的示例,引发的任何异常都应回滚整个事务。您确定当前的数据库引擎支持事务吗?例如,InnoDB支持事务,而MyISAM不支持事务。@matticustard是的,我肯定,因为我的应用程序中的其他事务工作得非常好。引擎是Innod的。我没有看到您的代码中有任何错误,这会让我相信问题出在其他地方。您确定没有混淆您的路由或方法吗?您是否可以发布整个方法而不仅仅是事务?您是否尝试过向事务添加Log::debug(…);
条目以查看它是否触发了两次?