DB::transaction我在控制器中使用了这样的功能,
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
});
}
Run Code Online (Sandbox Code Playgroud)
我想知道我使用该功能的方式是否正常,我需要验证它是否正常工作?
正如文档所示,您有两种选择:
Closure:您可以使用外观
transaction上的方法DB在数据库事务中运行一组操作。如果事务内抛出异常Closure,事务将自动回滚。如果Closure执行成功,事务将自动提交。 使用该方法时无需担心手动回滚或提交transaction
DB::transaction(function () {
// Interacting with the database
DB::insert(...);
DB::insert(...);
DB::insert(...);
});
Run Code Online (Sandbox Code Playgroud)
如果您想手动开始事务并完全控制回滚和提交,您可以在数据库外观上使用 beginTransaction 方法:
DB::beginTransaction();
Run Code Online (Sandbox Code Playgroud)
您可以通过 rollBack 方法回滚事务:
DB::rollBack();
Run Code Online (Sandbox Code Playgroud)
最后,您可以通过 commit 方法提交事务:
DB::commit();
Run Code Online (Sandbox Code Playgroud)
手动使用交易链接到块,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
}
Run Code Online (Sandbox Code Playgroud)
为了测试事务,您可以运行示例而不抛出任何异常==>预期结果:一切正常,工厂将被创建。
如果抛出异常,事务将回滚,并且不会在数据库中创建 Plant:
public function store(){
$plant = new Plant;
DB::transaction(function()
{
Plant::create(request(['name','plant_code','place']));
throw new ModelNotFoundException("Just for testing :)");
});
}
Run Code Online (Sandbox Code Playgroud)
添加use Illuminate\Database\Eloquent\ModelNotFoundException;在控制器的顶部;)
| 归档时间: |
|
| 查看次数: |
4990 次 |
| 最近记录: |