Laravel:如何验证 DB::transaction 函数是否正常工作?

Uda*_*ara 4 php laravel-5

DB::transaction我在控制器中使用了这样的功能,

public function store(){        
    $plant = new Plant;

    DB::transaction(function()
    {
        Plant::create(request(['name','plant_code','place']));    
    });    
}
Run Code Online (Sandbox Code Playgroud)

我想知道我使用该功能的方式是否正常,我需要验证它是否正常工作?

Mar*_*boc 5

正如文档所示,您有两种选择:

  1. 自动交易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)
  1. 手动使用事务:

如果您想手动开始事务并完全控制回滚和提交,您可以在数据库外观上使用 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;在控制器的顶部;)