Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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中回滚没有效果_Php_Database_Laravel 5_Eloquent_Rollback - Fatal编程技术网

Php 在laravel中回滚没有效果

Php 在laravel中回滚没有效果,php,database,laravel-5,eloquent,rollback,Php,Database,Laravel 5,Eloquent,Rollback,我正在创建备份系统,但导入步骤有问题如果出现任何错误,则无法回滚 我在CLI模式下使用此代码(通过artisan myown命令) 我有一个文件,上面有我所有的指示: <?php // @generated 2016-12-11 01:05:25 use Illuminate\Support\Facades\DB; use App\Category; // ... DB::beginTransaction(); Category::truncate(); // ...

我正在创建备份系统,但导入步骤有问题如果出现任何错误,则无法回滚

我在CLI模式下使用此代码(通过artisan myown命令)


我有一个文件,上面有我所有的指示:

<?php
// @generated 2016-12-11 01:05:25

use Illuminate\Support\Facades\DB;
use App\Category;
// ...

DB::beginTransaction();
  Category::truncate();
  // ...

  // LOAD MODEL `Category` (CLASS `App\Category`)
  Category::unguard();
  Category::create(array (
    'id' => 1,
    'name' => 'Holidays',
    'descr' => 'Holidays & sick & off',
    'color' => 'default',
    'created_at' => '2016-12-11 01:05:21',
    'updated_at' => '2016-12-11 01:05:21',
  ));
  // ...
  Category::reguard();

  // ...

DB::rollback();
?>
测试2 测试3和4 与测试1相同,
将$file
和所有
DB::transaction
DB::beginTransaction
&
DB::commit
&
DB:rollback
直接包含在此$file文件中

测试5 我试图:

  • 将DB::beginTransaction移到try/catch之外
  • 将DB::commit移到try/catch之外
测试用例
  • php-artian-migrate:refresh--seed
    清除表并填充一些主数据
  • 在phpmyadmin上,清洁(truncable)表(此处:类别)
  • 表上没有结果
  • 执行代码。执行“加载备份失败-回滚”
  • 在phpmyadmin上,检查数据:有记录。模型:执行代码中的truncable,但不回滚

  • 我想应该是这样

    DB::beginTransaction();
    try
    {
        //code for processing multiple related transactions
        include $file;
    }
    catch(\Exception $e)
    { 
        DB::rollBack();
        //echo error message
    }
    DB::commit();
    //echo success message  
    
    DB::beginransaction
    和DB::commit
    应该在try-catch块之外。它对我有用

    并且,$文件应该只有try块中所需的指令-没有DB::beginTransaction()、DB::commit()或DB::rollBack()语句

    更新

    遵循的一般逻辑步骤如下:

  • 开始事务-
    DB::beginTransaction()
  • 运行数据库查询-crud操作-
    尝试{//Run querys}
  • 如果出现错误/异常-回滚事务-
    catch(异常$e){DB::Rollback()
  • 发送/显示错误/异常消息-
    //显示/发送错误/异常消息}
  • 如果查询运行顺利-提交事务-
    DB::Commit()

  • 希望这有帮助。

    我也遇到了同样的问题,我开始仔细阅读文档,它是mysql版本,必须是5.7+。

    某些原因回滚通常需要运行composer dump autoload。如果迁移成功。

    您在catch块中抛出另一个异常的任何原因。这不是在创建一个异常循环吗?II抛出异常以使用Laravel的标准错误捕获。在核心源代码中还有另一个级别的try/catch:)您是否尝试将
    DB::beginTransaction()
    DB::commit()
    移动到try-catch块之外?根据DB:transaction的构造方式,commit应该在try部分执行(它是:回滚或commit;不是两者都执行)。无论如何,我测试了这个解决方案,但没有结果:(是的,没有冲突,这是为了演示(我编辑了我以前的帖子)。使用DB指令或模型:指令对您有效?@GeorgesO。是的,使用eloquent对我有效。我已使用用于手动控制事务的逻辑流更新了答案。该流对我有效。您使用的是哪个laravel版本?回滚方法重命名为
    DB::rollback()
    从L5.0中的L5.1开始,它是
    DB::rollback()
    只是一个检查的小指针。Laravel Framework版本5.3.26:)我认为php对函数不区分大小写,即使是静态函数。我尝试了你的解决方案和流程,但不起作用:(真奇怪。我遵循流程(流程)这对我很有用。事实上,我从@fideloper at的一篇好文章中了解了这个流程-你也可以看一看。php artian migrate:fresh——seedfresh你的数据库这并没有提供问题的答案。若要评论作者或要求作者澄清,请在他们的帖子下方留下评论-
    DB::transaction(function() {
      include $file;
      /*** File is:
       * use Illuminate\Support\Facades\DB;
       * use App\Category;
       * 
       * Category::truncate();
       * Category::unguard();
       * Category::create(array ('id' => 1, 'name' => 'Holidays'));
       * // create error by changing 'id' by 'ida'
       * Category::reguard();
       ***/
    });
    
    DB::beginTransaction();
    try
    {
        //code for processing multiple related transactions
        include $file;
    }
    catch(\Exception $e)
    { 
        DB::rollBack();
        //echo error message
    }
    DB::commit();
    //echo success message