【问题标题】:mysql transaction error handlingmysql事务错误处理
【发布时间】:2025-12-09 23:45:01
【问题描述】:
 DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
END;
START TRANSACTION;      

    UPDATE tbl_order SET TransactionID="abc" WHERE OrderID=1;
    UPDATE tbl_order SET TransactionID="xyz" WHERE OrderID=;
    UPDATE tbl_order SET TransactionID="zzz" WHERE OrderID=13;


COMMIT;

由于某种原因,订单 1 和 13 被填充而没有回滚,并且我得到退出 hadler 的语法错误。

Query:  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK' at line 1

谁能帮我弄清楚我做错了什么?

提前致谢

编辑

UPDATE tbl_order SET TransactionID="xyz" WHERE OrderID=;

故意的

【问题讨论】:

  • 在黑暗中射击:rollback 之后的分号是否提前结束了退出处理程序?
  • 所以无论如何我继续使用代码而不是使用 mysql 查询来处理错误。假设打开连接 MySqlCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.Transaction = conn.BeginTransaction();尝试{ cmd.CommandText = strSQL; cmd.ExecuteNonQuery(); cmd.Transaction.Commit(); }catch (Exception ex){ cmd.Transaction.Rollback(); dbLog.ErrorFormat("*** 事务回滚: {0}\n 参数: {1}\n Ex: {2}\n", strSQL, ex.InnerException); }
  • 如果 sql 格式正确并且代码在存储过程中,它似乎也没有给我任何错误。

标签: mysql transactions


【解决方案1】:

我相信退出处理程序只能在存储过程中使用。文档没有明确说明这一点,但暗示了

在存储程序执行期间可能会出现需要特殊处理的情况

http://dev.mysql.com/doc/refman/5.1/en/condition-handling.html

【讨论】:

  • 任何处理事务错误和回滚的例子