Откат в Laravel не имеет никакого эффекта

Я создаю систему резервного копирования, но у меня возникла проблема с шагом импорта. Невозможно откатить, если есть какая-либо ошибка.

Я использую этот код в режиме CLI (через ремесленник моя команда)


У меня есть файл со всеми моими инструкциями:

<?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, инструкция отката должна быть совместимой:

Использование методов транзакций фасада БД также контролирует транзакции
для построителя запросов и Eloquent ORM (https://laravel.com/docs/5.3/database).

Я также пытался использовать DB ::action () (с ошибкой вручную (изменено) 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 & 4

Такой же как тест 1, include $file и все DB::transaction, DB::beginTransaction & DB::commit & DB:rollback прямо в этом файле $ file

Тест 5

Я пытался:

  • переместить DB :: beginTransaction за пределы try / catch
  • переместить DB :: commit вне try / catch
  1. php artian migrate:refresh --seed Очистить таблицы & заполнить некоторыми masterdata
  2. На phpmyadmin, чистая (усеченная) таблица (здесь: категория).
  3. Там нет результата на столе
  4. Выполните код. «Ошибка резервного копирования — ROLLBACK» выполняется
  5. На phpmyadmin проверьте данные: есть записи. Модель: усеченная из моего кода выполнена, но не откат

3

Решение

Я думаю, что это должно быть

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. Выполнить запросы к базе данных — грубые операции — try{//run queries}
  3. Если есть ошибка / исключение — откат транзакции — catch(Exception $e){ DB::rollBack()
  4. Отправить / показать сообщение об ошибке / исключении — //display/send error/exception message }
  5. Если запросы выполняются гладко — зафиксируйте транзакцию — DB::commit()

Надеюсь это поможет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]