我正在创建一个备份系统但是我遇到了导入步骤的问题。 如果有任何错误,则无法回滚。
我在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
)来触发回滚)。没有区别。
你有任何解释吗?或者任何正确执行回滚指令的方法?
谢谢:)
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;
}
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();
***/
});
与测试1 ,include $file
和所有DB::transaction
,DB::beginTransaction
&amp;相同DB::commit
&amp; {$ 1}}直接在此$文件
我试图:
DB:rollback
清除表格&amp;填充一些masterdata 答案 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()语句。
更新
要遵循的一般逻辑步骤是
DB::beginTransaction()
try{//run queries}
catch(Exception $e){ DB::rollBack()
//display/send error/exception message }
DB::commit()
希望这有帮助。
答案 1 :(得分:0)
我遇到了同样的问题,我开始仔细阅读文档,它是 mysql 版本,必须是 5.7+。
答案 2 :(得分:0)
出于某种原因,回滚通常需要您运行 composer dump-autoload。如果您的迁移有效。