Laravel DB ::事务没有回滚异常

时间:2014-07-24 23:26:30

标签: 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 

我只是尝试在事务闭包中创建用户,并在创建用户之后抛出异常以强制回滚事务。我的问题是,即使抛出异常,事务也不会回滚。每次刷新应用程序时,我都会在数据库中获得新用户。相同的代码在本地计算机上按预期工作,但在计划用于生产的服务器上,它只是不会回滚事务。你有什么想法吗?

编辑:

Server MySql:5.1.73-cll - MySQL社区服务器(GPLv2)

服务器PHP:PHP 5.4.30(cli)(内置:2014年7月19日15:22:18)

本地PHP:5.5.9

Local MySql:5.6.16

服务器位于CentO上,而本地计算机是Windows 7.

3 个答案:

答案 0 :(得分:15)

所以我回答了我自己的问题。在MySql 5.5之前,InnoDb不是默认的存储引擎。在我的情况下,MYISAM是默认的存储引擎,不支持交易。我必须做的是在我的CPanel服务器安装MySQL中启用InnoDB。我必须确保我的Laravel迁移中的每个表都是使用InnoDB引擎创建的。我这样做是通过添加:

     $table->engine = "InnoDB"; 

到每个迁移文件。使用InnoDB引擎设置所有表后,事务按预期工作。

答案 1 :(得分:6)

替代方案可以是

中的设置
  

/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',
        ],

答案 2 :(得分:0)

如果您在项目上使用多个数据库,则需要指定要在哪个数据库中提交和回滚。

git mv