2015-07-20 29 views
1

我正在流明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不會重置自動增量。

回答

2

某些MySQL語句導致隱式提交,該提交會在當前會話中結束任何事務處於活動狀態。所以你的問題可能是由作爲存儲過程一部分的語句引起的。

基於程序的名稱,我猜你可能正在使用TRUNCATE TABLE來清空需要刷新信息的表格,但我可能是錯的:)。在任何情況下,你可以檢查我下面鏈接的MySQL官方文檔,看看這是真實的情況(可能導致此行爲,因爲語句的列表是有點長):

Statements That Cause an Implicit Commit


由於您具有自動增量的列和需要重置它們的列,因此您可能會失敗。因爲只有兩種方式(即我所知道的),以重置是或者使用:

TRUNCATE TABLE tablename 

ALTER TABLE tablename AUTO_INCREMENT = 1 

但兩者TRUNCATE TABLEALTER TABLE是觸發式提交報表。

+0

是的,我相信是的。你可以嘗試用'DELETE FROM all_time_leaderboard'替代'TRUNCATE TABLE all_time_leaderboard'語句(當然對'last_week_leaderboard'也是如此)。這將清除數據表(儘管它具有不將主鍵自動增量值重置爲1的缺點)。但要測試這是否確實是它必須要做的問題。 – Bogdan

+0

我已經用解釋更新了我的答案,但不幸的是沒有解決方案。如果你可以發佈存儲過程的全部內容,也許我可以以另一種方式提供另一種產生位置值的解決方案,儘管我不能承諾任何東西:)。 – Bogdan

+0

謝謝,我要給SP調整一下,去除'''TRUNCATE''',看看你的理論是否正確。在那之後,我(或許有你的幫助?:))會擔心如何重新工作SP。無論哪種方式,如果確實是'''TRUNCATE''',我會給你答案,因爲我會知道到底是什麼問題! –

相關問題