【发布时间】:2015-10-10 01:36:20
【问题描述】:
我正在 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 不会重置自动增量..
【问题讨论】:
标签: mysql laravel laravel-5 lumen illuminate-container