我想将一个父项及其所有子项插入数据库。如果任何孩子无法创建,我想中止整个交易。我试过使用以下代码片段:DB::beginTransaction();try{ // Create parent item $one = new ModelOne(); $one->key = 'Parent Key'; $one->title = 'Parent title'; $one->save(); // Create child items foreach ($items as $item) { $two = new ModelTwo(); $two->parent_id = $one->id; $two->content = $item->content; $two->status = $item->status; $two->save(); } DB::commit(); return response(['message'=>'ALL GOOD'], 200);}catch (\ Illuminate\Database\QueryException $e){ DB::rollBack(); return response(['message'=>'FAILURE'], 500);}然而,当抛出异常时(比如因为一个键在孩子之间重复)ModelOne($one)被保存在数据库中,即使DB::commit()从未被调用。我错过了什么?我正在使用 Laravel 5.1。
2 回答
汪汪一只猫
TA贡献1898条经验 获得超8个赞
原来这个问题与我在问题中提供的代码无关。
问题是我的表是使用MyISAM
不支持事务创建的。
使用InnoDB
instead 使代码按预期工作。为此,请添加$table->engine = 'InnoDB';
到您的迁移中。
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
我将此代码用于交易并且它有效:
DB::transaction(function () {
});
使用此代码,您无需提交或回滚。它们被自动调用。
在您的情况下,您将拥有:
try {
DB::transaction(function () use ($items) ({
// ... your inserts
});
catch () {}
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消