我似乎在使数据库事务在模型上工作时遇到问题。我已经提到了有关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约束的两次保存。]
答案 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