Intereting Posts
Защитить мое приложение PHP Несколько полей для одного атрибута Memcache для работы с API-интерфейсами с высоким временем ожидания – хорошая идея? Сеятель работает отлично в первый раз, но не выполняет некоторые задачи в последующих циклах в Laravel 5? Как скрыть ключ API на стороне клиента Javascript Как я могу обнаружить избыточные строки в таблице? Использовать PHP в скрипте для отправки данных также Диспетчер тегов Google Почему PDO_MySQL не возвращает целое число? Лучший способ получить имя хоста с php mysql_connect VS mysql_pconnect Почему мои данные SQL приводят к тому, что ось Y моей диаграммы переходит в бесконечность? Ошибка анализа: синтаксическая ошибка, неожиданный «public» (T_PUBLIC) Обновление строк в цикле while php Обрезаемая фатальная ошибка: объект класса PDOStatement не может быть преобразован в строку в строке 114 Преимущества использования конструктора?

Laravel DB :: транзакция не отказывается от исключения

У меня есть эта небольшая проблема с Laravel 4.2 и DB :: transaction. У меня возникла проблема с откатными транзакциями, поэтому я попробовал самый простой фрагмент кода и поместил его в route.php для тестирования:

routes.php:

DB::transaction(function(){ $user = App::make("User"); $user->save(); throw new Exception("Should not create users"); }); ... ... ... Some other code here 

Просто я пытаюсь создать пользователя при закрытии транзакции и после создания пользователя я делаю исключение для принудительного откат транзакции. Моя проблема заключается в том, что даже вы выбрали исключение, транзакция не откат. Я получаю нового пользователя в базе данных каждый раз, когда обновляю приложение. Тот же код работает как на локальном компьютере, но на сервере, который я планирую использовать для его производства, он просто не откатывает транзакцию. У вас есть идеи, почему?

РЕДАКТИРОВАТЬ:

Сервер MySql: 5.1.73-cll – Сервер сообщества MySQL (GPLv2)

Сервер PHP: PHP 5.4.30 (cli) (построено: 19 июля 2014 15:22:18)

Локальный PHP: 5.5.9

Местный MySql: 5.6.16

Сервер находится на CentOs, а локальный компьютер – Windows 7.

Поэтому я отвечаю на свой вопрос. InnoDb не был механизмом хранения по умолчанию до MySql 5.5. В моем случае MYISAM был механизмом хранения по умолчанию и не поддерживал транзакции. То, что мне нужно было сделать, – включить InnoDB в моей установке сервера CPanel MySQL. Чем я должен был убедиться, что каждая из таблиц в моих миграциях с Laravel была создана с помощью механизма InnoDB. Я сделал это, добавив:

  $table->engine = "InnoDB"; 

для каждого файла миграции. После того, как все таблицы были настроены с помощью механизма InnoDB, транзакции работают по назначению.

Альтернативой могут быть настройки в

/config/database.php

изменить значение двигателя от нуля до InnoDB

 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => 'InnoDB', ],