Lavavel / Eloquent 5事务回滚不支持保存

时间:2018-07-14 17:00:17

标签: php mysql laravel laravel-5 eloquent

我似乎在使数据库事务在模型上工作时遇到问题。我已经提到了有关SO的相关文章,但还没有运气。

在我的示例中,我在数据库中创建了一条新记录。我应该能够回滚,新记录应该消失了吗?

        try{
            DB::beginTransaction();

            $oNewMap = $oMap->replicate();
            $oNewMap->name = "[test] " . $oNewMap->name;
            $oNewMap->save();  // works

            DB::rollBack();  / /record still in db
        }
        catch(\Exception $e){       
            DB::rollBack();
            /* Transaction failed. */
        }

发生回滚时,为什么保存的记录不会从数据库中消失?我在模型如何与事务一起工作方面缺少某些东西吗?

物理表都是InnoDB,顺便说一句。

[编辑:将问题简化为简单的保存和回滚,而不执行第二次保存违反FK约束的两次保存。]

3 个答案:

答案 0 :(得分:2)

如果模型不使用默认的数据库连接,则必须在事务上指定它:

DB::connection('name')->beginTransaction();
DB::connection('name')->commit();
DB::connection('name')->rollBack();

答案 1 :(得分:1)

很久以前,我记得看到您的问题时,我遇到了同样的问题。

最后我发现该函数名为rollBack而不是rollback-请注意大写的B

答案 2 :(得分:0)

检查您的交易级别并确认您正在使用单个beginTransaction(),所以,您可能会找到理想的解决方案。

DB::beginTransaction()
DB::beginTransaction()
DB::transactionLevel() // will return 2
DB::commit() // doesn't commit
DB::transactionLevel() // will return 1
DB::commit() // finally, it commits to the database
DB::transactionLevel() // will return 0