我正在流明5.1.3中構建集成測試。我的大部分測試都很好地回滾了他們的交易。這是一個什麼樣的成功回滾可能看起來像一個總結(我簡化了代碼 - 真正的事務管理是通過我連接到PHPUnit的@Before註釋的特質完成):流明/ Laravel 5.1 - 調用存儲過程似乎提交事務
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
不會重置自動增量。
是的,我相信是的。你可以嘗試用'DELETE FROM all_time_leaderboard'替代'TRUNCATE TABLE all_time_leaderboard'語句(當然對'last_week_leaderboard'也是如此)。這將清除數據表(儘管它具有不將主鍵自動增量值重置爲1的缺點)。但要測試這是否確實是它必須要做的問題。 – Bogdan
我已經用解釋更新了我的答案,但不幸的是沒有解決方案。如果你可以發佈存儲過程的全部內容,也許我可以以另一種方式提供另一種產生位置值的解決方案,儘管我不能承諾任何東西:)。 – Bogdan
謝謝,我要給SP調整一下,去除'''TRUNCATE''',看看你的理論是否正確。在那之後,我(或許有你的幫助?:))會擔心如何重新工作SP。無論哪種方式,如果確實是'''TRUNCATE''',我會給你答案,因爲我會知道到底是什麼問題! –