【问题标题】:Lavavel/Eloquent 5 transactions rolling back not backing saveLaravel/Eloquent 5 事务回滚不支持保存
【发布时间】:2018-07-14 17:00:16
【问题描述】:

我确实在让数据库事务在模型上工作时遇到了问题。我已经参考了 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 约束的情况下进行两次保存。]

【问题讨论】:

  • 您查看交易状态了吗?
  • @GaurangJoshi 在哪里查看?
  • DB::rollback(); 一定会被处决吗?
  • @JonasStaudenmeir 是的,肯定会抛出异常。
  • 你能把整个交易包在\DB::enableQueryLog(); dd(\DB::getQueryLog());中并发布结果吗?

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

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

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

【讨论】:

  • 做到了。我不知道有多个数据库连接。
【解决方案2】:

看到你的问题,我记得很久以前,我有同样的问题。

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

【讨论】:

  • 好收获!改变了它,它似乎没有任何区别。想知道为什么它没有在 DB::rollback() 上呕吐。
【解决方案3】:

检查您的事务级别并确认您正在使用单个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2015-04-23
    • 2020-06-05
    • 2013-02-12
    相关资源
    最近更新 更多