我想將一個父項及其所有子項插入數(shù)據(jù)庫。如果任何孩子無法創(chuàng)建,我想中止整個交易。我試過使用以下代碼片段: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);}然而,當(dāng)拋出異常時(比如因為一個鍵在孩子之間重復(fù))ModelOne($one)被保存在數(shù)據(jù)庫中,即使DB::commit()從未被調(diào)用。我錯過了什么?我正在使用 Laravel 5.1。
2 回答

汪汪一只貓
TA貢獻1898條經(jīng)驗 獲得超8個贊
原來這個問題與我在問題中提供的代碼無關(guān)。
問題是我的表是使用MyISAM
不支持事務(wù)創(chuàng)建的。
使用InnoDB
instead 使代碼按預(yù)期工作。為此,請?zhí)砑?code>$table->engine = 'InnoDB';到您的遷移中。

翻過高山走不出你
TA貢獻1875條經(jīng)驗 獲得超3個贊
我將此代碼用于交易并且它有效:
DB::transaction(function () {
});
使用此代碼,您無需提交或回滾。它們被自動調(diào)用。
在您的情況下,您將擁有:
try {
DB::transaction(function () use ($items) ({
// ... your inserts
});
catch () {}
- 2 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消