У меня есть эта небольшая проблема с 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', ],