我想將一個父項及其所有子項插入數據庫。如果任何孩子無法創建,我想中止整個交易。我試過使用以下代碼片段: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 關注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消