lavavel/elofunt 5事务回滚而不是备份保存

wnrlj8wa  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(296)

我似乎在让数据库事务在模型上工作时遇到了问题。我已经在网上看过相关的帖子了,但是还没找到。
在我的示例中,我在db中创建了一个新记录。我应该能够回滚,新记录应该已经消失了,不是吗?

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约束的情况下执行两次保存。]

brjng4g3

brjng4g31#

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

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

v9tzhpje2#

看到你的问题,我记得很久以前,我也有同样的问题。
最后我发现,这个函数被调用了 rollBack 而不是 rollback -注意大写的b

mtb9vblg

mtb9vblg3#

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

相关问题