Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:如何验证DB::transaction函数是否正常工作?_Php_Laravel 5 - Fatal编程技术网

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

Php Laravel:如何验证DB::transaction函数是否正常工作?,php,laravel-5,Php,Laravel 5,我在控制器中使用了DB::transaction函数,如下所示 public function store(){ $plant = new Plant; DB::transaction(function() { Plant::create(request(['name','plant_code','place'])); }); } 我想知道我使用该功能的方式是否正常,我需要验证它是否正常工作?如图所示,您有两种选

我在控制器中使用了
DB::transaction
函数,如下所示

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

    DB::transaction(function()
    {
        Plant::create(request(['name','plant_code','place']));    
    });    
}
我想知道我使用该功能的方式是否正常,我需要验证它是否正常工作?

如图所示,您有两种选择:

  • 自动交易与
    结算
  • 您可以使用
    DB
    facade上的
    transaction
    方法来运行一组 数据库事务中的操作。如果抛出异常 在交易
    关闭
    中,交易将自动
    向后滚。如果
    关闭
    成功执行,则事务 将自动提交您不需要担心 使用
    事务时手动回滚或提交
    方法

  • 手动使用事务:
  • 如果您希望手动开始事务,并且完全控制回滚和提交,则可以在DB facade上使用beginTransaction方法:

    DB::beginTransaction();
    
    您可以通过回滚方法回滚事务:

    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-illumb\Database\Eloquent\ModelNotFoundException位于控制器顶部;)

    AFAIK事务就是这样工作的——一旦抛出异常,事务中的所有内容都将回滚。如果您在Plant::create()函数中进行任何db查询,则应在出现任何异常时回滚该查询。然而,若你们捕捉到异常,我不会期望它会被回滚。文档:看起来很棒。非常感谢您的回答。很乐意帮助:)您能告诉我
    DB::rollback()的用法吗是什么?没有它,如果我们在try中出现异常,就不会提交任何内容。
    
    public function store(){        
        $plant = new Plant;
    
        DB::transaction(function()
        {
            Plant::create(request(['name','plant_code','place']));    
            throw new ModelNotFoundException("Just for testing :)");
        });    
    }