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

4

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

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

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

我想知道我使用的函数是否正确,我需要验证它是否正常工作?

据我所知,事务的工作方式是这样的 - 一旦抛出异常,事务中的所有操作都将被回滚。如果在您的Plant::create()函数内部进行任何数据库查询,那么在发生任何异常时都应该进行回滚。然而,如果您捕获了异常,我不会期望它会被回滚。文档链接:https://laravel.com/docs/5.5/database#database-transactions - ElChupacabra
1个回答

5
根据文档说明,您有两个选择:
  1. 使用闭包自动处理事务:

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

DB::transaction(function () {
    // Interacting with the database
    DB::insert(...);
    DB::insert(...);
    DB::insert(...);
});
  1. 手动使用事务:

如果您想要手动开始一个事务并且完全控制回滚和提交,可以在DB门面上使用beginTransaction方法:

DB::beginTransaction();

您可以通过调用rollBack方法来回滚事务:
DB::rollBack();

最后,您可以通过commit方法提交一个事务:
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; ;)

1
{btsdaf} - Udara Herath
Happy to help :) - Maraboc
你能告诉我 DB::rollback(); 的用法吗?如果在 try 中出现异常,没有它就不会提交任何内容。 - Daniyal Javani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接