Lumen / Laravel 5.1 - 调用存储过程似乎提交事务

时间:2015-07-20 19:30:31

标签: mysql laravel laravel-5 lumen illuminate-container

我正在Lumen 5.1.3中构建集成测试。我的大多数测试都回滚了他们的交易。以下是成功回滚的概述(我正在简化代码 - 实际上事务管理是通过我附加到PHPUnit的@before注释的特性完成的):

DB::beginTransaction();
DB::table('user')->insert(
            [
                'guid' => $guid,
                'username' => $username,
                'email' => $email,
                'status' => USER_STATUS_ACTIVE,
                'type' => USER_TYPE_REGULAR,
                'created_on' => $currentDateTime
            ]
        );
DB::rollBack();

一切都很好。此测试后用户表为空。

现在 - 这是我感到困惑的地方。如果我在混合中添加一个SP,那么事情就不会被回滚:

DB::beginTransaction();
DB::table('user')->insert(
            [
                'guid' => $guid,
                'username' => $username,
                'email' => $email,
                'status' => USER_STATUS_ACTIVE,
                'type' => USER_TYPE_REGULAR,
                'created_on' => $currentDateTime
            ]
        );

DB::statement('CALL s_generate_leaderboards(?)', [$oneWeekAgo]);
DB::rollBack();

现在确实提交了新的用户记录。我执行存储过程后,DB::rollBack();无效。

没有错误 - 一切都成功了。我甚至确保达到DB::rollBack();命令。

那么 - 为什么我的交易在时被提交,并且只有我打电话给SP?太令人沮丧了...... :(

编辑1:

你的怀疑是爆炸的。这是SP(它很大,所以我已经崩溃了90%):

CREATE PROCEDURE s_generate_leaderboards (IN week_ago_date DATETIME)
BEGIN

-- Empty and regenerate the all-time leaderboard:

TRUNCATE TABLE all_time_leaderboard;

INSERT INTO all_time_leaderboard (...)
...;

-- Empty and regenerate last week's leaderboard:

TRUNCATE TABLE last_week_leaderboard;

INSERT INTO last_week_leaderboard (...)
...;

END

那么也许不是SP本身提交,而只是SP中的TRUNCATE语句?

正在使用

TRUNCATE,因为排行榜中有一个position列会自动递增,需要重置。 DELETE FROM table不会重置自动增量..

1 个答案:

答案 0 :(得分:2)

某些MySQL语句会导致隐式提交,从而结束当前会话中处于活动状态的任何事务。因此,您的问题可能是由存储过程的一部分语句引起的。

根据程序的名称,我猜你可能正在使用handleSubmit()来清空你需要刷新信息的表,但我可能错了:)。在任何情况下,您都可以查看我在下面链接的官方MySQL文档,看看是否确实如此(因为可能导致此行为的语句列表有点长):

  

Statements That Cause an Implicit Commit

由于您的列具有自动增量并且需要重置它们,因此您可能会失败。因为只有两种方式(我知道)可以通过以下方式重置:

TRUNCATE TABLE

TRUNCATE TABLE tablename

但是ALTER TABLE tablename AUTO_INCREMENT = 1 TRUNCATE TABLE都是触发隐式提交的语句。