Mik*_*eWu 8 php mysql database laravel
我在Laravel 4.2和DB :: transaction中遇到了这个小问题.我遇到的问题是没有回滚的事务,所以我尝试了最简单的代码片段并将其放入routes.php进行测试:
routes.php文件:
DB::transaction(function(){
$user = App::make("User");
$user->save();
throw new Exception("Should not create users");
});
...
...
...
Some other code here
Run Code Online (Sandbox Code Playgroud)
我只是尝试在事务闭包中创建用户,在创建用户之后,我抛出异常来强制回滚事务.我的问题是,即使抛出异常,事务也不会回滚.每次刷新应用程序时,我都会在数据库中获得新用户.相同的代码在本地计算机上按预期工作,但在我计划用于生产的服务器上,它根本不会回滚事务.你有什么想法吗?
编辑:
Server MySql:5.1.73-cll - MySQL社区服务器(GPLv2)
服务器PHP:PHP 5.4.30(cli)(内置:2014年7月19日15:22:18)
本地PHP:5.5.9
本地MySql:5.6.16
服务器位于CentO上,而本地计算机是Windows 7.
Mik*_*eWu 17
所以我回答了我自己的问题.在MySql 5.5之前,InnoDb不是默认的存储引擎.在我的情况下,MYISAM是默认的存储引擎,不支持交易.我必须做的是在我的CPanel服务器安装MySQL中启用InnoDB.我必须确保我的Laravel迁移中的每个表都是使用InnoDB引擎创建的.我这样做是通过添加:
$table->engine = "InnoDB";
Run Code Online (Sandbox Code Playgroud)
到每个迁移文件.使用InnoDB引擎设置所有表后,事务按预期工作.
另一种选择可能是设置
/config/database.php
将引擎的值从null更改为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',
],
Run Code Online (Sandbox Code Playgroud)
小智 6
如果在项目中使用多个数据库,则需要指定要在哪个数据库中提交和回滚。
DB::connection('name_of_database')->beginTransaction();
try {
//Do something
DB::connection('name_of_database')->commit();
} catch (Exception $e) {
DB::connection('name_of_database')->rollback();
}
Run Code Online (Sandbox Code Playgroud)