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

时间:2017-10-23 08:05:06

标签: php laravel-5

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

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

    DB::transaction(function()
    {
        Plant::create(request(['name','plant_code','place']));    
    });    
}

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

1 个答案:

答案 0 :(得分:3)

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

  1. 使用Closure进行自动交易:
  2.   

    您可以使用transaction外观上的DB方法来运行一组   数据库事务中的操作。如果抛出异常   在交易Closure内,交易将自动进行   回滚。如果Closure成功执行,则为事务   将自动提交。 您不必担心   使用transaction时手动回滚或提交   方法

    DB::transaction(function () {
        // Interacting with the database
        DB::insert(...);
        DB::insert(...);
        DB::insert(...);
    });
    
    1. 手动使用交易
    2. 如果您想手动开始交易并且完全控制回滚和提交,您可以在数据库外观上使用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;;)