laravel中的回滚无效

时间:2016-12-11 01:28:58

标签: php database laravel-5 eloquent rollback

我正在创建一个备份系统但是我遇到了导入步骤的问题。 如果有任何错误,则无法回滚

  

我在CLI模式下使用此代码(通过 artisan myowncommand

我有一个文件,包含我的所有说明:

<?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();
?>

如果我执行此代码,就好像没有回滚:(如果我清理我的表并执行脚本......数据被插入。

根据laravel文档,回滚指令应兼容:

  

使用DB facade的事务方法也可以控制事务   对于查询构建器和Eloquent ORM(https://laravel.com/docs/5.3/database)。

我还尝试使用DB :: transaction()(手动错误(id改为ida)来触发回滚)。没有区别。

你有任何解释吗?或者任何正确执行回滚指令的方法?

谢谢:)

我测试的解决方案

测试1

try {
  DB::beginTransaction();

  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::commit();
  echo sprintf('> Load Backup file `%s` COMPLETED', $file);
}
catch( \Exception $e ) {
  DB::rollback();
  echo sprintf('> Load file `%s` failled - ROLLBACK', $file);
  throw $e;
}

测试2

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();
   ***/
});

测试3&amp; 4

测试1 include $file和所有DB::transactionDB::beginTransaction&amp;相同DB::commit&amp; {$ 1}}直接在此$文件

测试5

我试图:

  • 在try / catch
  • 之外移动DB :: beginTransaction
  • 在try / catch
  • 之外移动DB :: commit

测试用例

  1. DB:rollback清除表格&amp;填充一些masterdata
  2. 在phpmyadmin上,清理(可截断)表(此处为:category)。
  3. 表格上没有结果
  4. 执行代码。 “加载备份失败 - ROLLBACK”已执行
  5. 在phpmyadmin上,检查数据:有记录。 模型:从我执行的代码中截断,但不回滚

3 个答案:

答案 0 :(得分:0)

我认为应该是

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 and DB::commit应位于try-catch块之外。这个对我有用。

你的$文件应该只有try块中你想要的指令 - 没有DB :: beginTransaction(),DB :: commit()或DB :: rollBack()语句。

更新

要遵循的一般逻辑步骤是

  1. 开始交易 - DB::beginTransaction()
  2. 运行数据库查询 - crud操作 - try{//run queries}
  3. 如果出现错误/异常 - 回滚交易 - catch(Exception $e){ DB::rollBack()
  4. 发送/显示错误/异常消息 - //display/send error/exception message }
  5. 如果查询顺利进行 - 提交交易 - DB::commit()
  6. 希望这有帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

出于某种原因,回滚通常需要您运行 composer dump-autoload。如果您的迁移有效。