Php 在laravel中回滚没有效果
我正在创建备份系统,但导入步骤有问题如果出现任何错误,则无法回滚 我在CLI模式下使用此代码(通过artisan myown命令)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(); // ...
我有一个文件,上面有我所有的指示:
<?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
清除表并填充一些主数据我想应该是这样
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()
尝试{//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