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(…);
条目以查看它是否触发了两次?