doudi2431 2017-10-23 08:05
浏览 796
已采纳

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

I have used DB::transaction function in my controller like this,

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

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

I want to know the way I have used the function is ok and i need to verify is it working correctly?

  • 写回答

1条回答 默认 最新

  • douhua1760 2017-10-23 08:46
    关注

    As the documentation illustrate you have two choices :

    1. Automatic transaction with Closure :

    You may use the transaction method on the DB facade to run a set of operations within a database transaction. If an exception is thrown within the transaction Closure, the transaction will automatically be rolled back. If the Closure executes successfully, the transaction will automatically be committed. You don't need to worry about manually rolling back or committing while using the transaction method

    DB::transaction(function () {
        // Interacting with the database
        DB::insert(...);
        DB::insert(...);
        DB::insert(...);
    });
    
    1. Manually Using Transactions :

    If you would like to begin a transaction manually and have complete control over rollbacks and commits, you may use the beginTransaction method on the DB facade:

    DB::beginTransaction();
    

    You can rollback the transaction via the rollBack method:

    DB::rollBack();
    

    Lastly, you can commit a transaction via the commit method:

    DB::commit();
    

    The manually use of the transactions is linked to the try catch block like this :

    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
    }
    

    For testing the transaction you can run your example without throwing any exception ==> expected result : all fine the Plant will be created.

    And if you throw an exception the transaction will be rollbacked and the Plant will not be created in the database :

    public function store(){        
        $plant = new Plant;
    
        DB::transaction(function()
        {
            Plant::create(request(['name','plant_code','place']));    
            throw new ModelNotFoundException("Just for testing :)");
        });    
    }
    

    Add use Illuminate\Database\Eloquent\ModelNotFoundException; at the top of the controller ;)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)