2010-06-08 56 views
2

我有一個場景,我需要在多個數據庫中插入,調用和刪除存儲過程。這是在PowerShell腳本中完成的。我希望能夠回滾由存儲過程所做的更改,如果在腳本中發生某些情況。在MySql中回撥存儲過程

問題是我無法回滾存儲過程所做的更改。存儲過程幾乎是6 KB,並進行了一些更新和插入,所以我想知道是否對於事務來說太多了。當只在交易中進行SP呼叫時,我可以將其回滾。

任何幫助將不勝感激。

 
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand('', $mysqlConn) 
$cmd.Transaction = $mysqlConn.BeginTransaction([System.Data.IsolationLevel]'ReadCommitted') 

$cmd.CommandText = [IO.File]::ReadAllText($mySqlStoredProcedurePath) 
[Void]$cmd.ExecuteNonQuery() 

$cmd.CommandText = "CALL storedProcedureX($startHierarchyId)" 
[Void]$cmd.ExecuteNonQuery() 

$cmd.CommandText = "DROP PROCEDURE IF EXISTS storedProcedureX" 
[Void]$cmd.ExecuteNonQuery() 

$cmd.Transaction.Rollback() 
+0

當您嘗試回滾時,您得到的錯誤是什麼?你使用的是什麼桌子類型? – David 2010-06-08 18:31:53

+0

在測試腳本中運行時,我完全沒有收到任何錯誤消息。也許我應該嘗試直接在mysql中執行它,看看它是否是連接器。該表是InnoDb。 (剛剛編輯我的帖子關於'只回滾通話'部分,順便說一句)。 – Polymorphix 2010-06-08 18:36:23

+0

似乎每當我包含SP的創建或刪除時,回滾都不會發生。我嘗試在與SP調用相同的事務中插入更小的更新,這似乎工作正常。感謝您的幫助! – Polymorphix 2010-06-08 18:38:07

回答

1

Oracle在您每次發出DDL語句(例如CREATE PROCEDURE,CREATE TABLE或DROP TABLE)時用於執行隱式COMMIT。也許MySQL也這樣做?我會檢查它,特別是因爲我們現在知道這是解決方案(請參閱上面的註釋時間戳)。

+0

嘿,我知道它很便宜,但幾天後我沒有得分,我感覺很低。 – MJB 2010-06-09 13:24:49

+0

如果我被允許,我會給你一個。我是新來的,所以我有很多限制。 – Polymorphix 2010-06-10 10:51:55

+0

Not enough rep ... – Polymorphix 2010-06-10 10:52:28

0

感謝MJB提供線索答案: Implicit commits

與MySQL 5.0.13開始,ALTER PROCEDURE,CREATE PROCEDURE和DROP 程序造成隱式提交。

+1

黨,沒有代表點,因爲我回答了評論。也許我應該創建一個答案,然後穿過我的手指... – MJB 2010-06-08 20:58:51

+0

呵呵,你這樣做。你當然應該得到它。爲我節省了很多時間! – Polymorphix 2010-06-09 06:39:23