我在我的控制器中使用了DB::transaction
这样的功能,
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
});
}
我想知道我使用该功能的方式还可以,我需要验证它是否正常工作?
答案 0 :(得分:3)
正如documentation所示,您有两种选择:
Closure
进行自动交易: 您可以使用
transaction
外观上的DB
方法来运行一组 数据库事务中的操作。如果抛出异常 在交易Closure
内,交易将自动进行 回滚。如果Closure
成功执行,则为事务 将自动提交。 您不必担心 使用transaction
时手动回滚或提交 方法强>
DB::transaction(function () {
// Interacting with the database
DB::insert(...);
DB::insert(...);
DB::insert(...);
});
如果您想手动开始交易并且完全控制回滚和提交,您可以在数据库外观上使用beginTransaction方法:
DB::beginTransaction();
您可以通过rollBack方法回滚事务:
DB::rollBack();
最后,您可以通过提交方法提交事务:
DB::commit();
手动使用交易链接到 try catch
块,如下所示:
DB::beginTransaction();
try {
// Interacting with the database
DB::insert(...);
DB::insert(...);
DB::insert(...);
DB::commit(); // Commiting ==> There is no problem whatsoever
} catch (\Exception $e) {
DB::rollback(); // rollbacking ==> Something went wrong
}
为了测试交易,您可以运行您的示例而不会抛出任何异常==>预期结果:所有工厂都将被创建。
如果您抛出异常,事务将被回滚,并且不会在数据库中创建工厂:
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
throw new ModelNotFoundException("Just for testing :)");
});
}
在控制器顶部添加use Illuminate\Database\Eloquent\ModelNotFoundException;
;)