我有一个场景,我需要在几个数据库中插入,调用和删除存储过程。这是在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()
答案 0 :(得分:2)
每次发出DDL语句时,Oracle都会使用隐式COMMIT,例如CREATE PROCEDURE,CREATE TABLE或DROP TABLE。也许MySQL也这样做了吗?我会检查它,特别是因为我们现在知道这是解决方案(参见上面评论的时间戳)。
答案 1 :(得分:0)
感谢MJB提供答案的线索: Implicit commits
从MySQL 5.0.13开始,ALTER 程序,创建程序和DROP PROCEDURE导致隐式提交。