在MySql中回滚对存储过程的调用

时间:2010-06-08 18:26:20

标签: .net mysql stored-procedures transactions

我有一个场景,我需要在几个数据库中插入,调用和删除存储过程。这是在powershell脚本中完成的。我希望能够回滚存储过程所做的更改,如果在脚本中进一步发生某些情况。

问题是我无法回滚存储过程所做的更改。存储过程几乎是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()

2 个答案:

答案 0 :(得分:2)

每次发出DDL语句时,Oracle都会使用隐式COMMIT,例如CREATE PROCEDURE,CREATE TABLE或DROP TABLE。也许MySQL也这样做了吗?我会检查它,特别是因为我们现在知道这是解决方案(参见上面评论的时间戳)。

答案 1 :(得分:0)

感谢MJB提供答案的线索: Implicit commits

  

从MySQL 5.0.13开始,ALTER   程序,创建程序和DROP   PROCEDURE导致隐式提交。