mysql中的事务

本文关键字:事务 mysql | 更新日期: 2023-09-27 18:12:53

我正在开发一个Mysql数据库(5.5版)的c#应用程序。我正面临着一个问题,我需要捕捉Mysql中发生的异常。不管它是在Mysql还是在dotNet中捕获的。问题是,我想回滚所有我以前的工作时,发生异常/错误;无论是MySqlException还是自定义的。是的,我尝试使用TransactionScopeMySqlTransaction,但它没有回滚我的工作。如果任何人有任何想法或建议,请指导我。谢谢。

编辑:代码

        MySqlConnection con = new MySqlConnection(cnstring);
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
        con.Open();
        MySqlCommand cmd;
        TransactionScope ob = new TransactionScope();
        try
        {
            cmd = new MySqlCommand("testProcedureSignal", con);
            cmd.Parameters.Add(new MySqlParameter("pval", 1));
            cmd.Parameters.Add(new MySqlParameter("@intException", MySqlDbType.Int32) { Direction = ParameterDirection.Output });
            cmd.Parameters.Add(new MySqlParameter("@strErrorMessage", MySqlDbType.VarChar) { Direction = ParameterDirection.Output });
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            con.Close();
            ob.Dispose();
            return;
        }
        ob.Complete();
        con.Close();

程序如下:

CREATE PROCEDURE `testProcedureSignal`(
pval INT,
OUT intException INT,
OUT strErrorMessage VARCHAR(255)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
ROLLBACK;
END;
SET intException = 100;
START TRANSACTION;
INSERT INTO demo (data) values (intException);
SET intException = intException + 10;
INSERT INTO demo (data) values (intException);
DROP TABLE teeeee;-- this table does not exist
INSERT INTO demo2 (data1,data2) values ('demo2',intException + 10);
SET intException = 111;
SET intException = 2;
COMMIT;
END

mysql中的事务

我向上级报告了这件事。好吧,我们现在有MySQL 5.6版本,其中有一个简单易行的方法来实现TRY-CATCH场景。现在,我在所有存储过程中使用以下代码:

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
ROLLBACK;
GET DIAGNOSTICS CONDITION 1
strErrorMessage = MESSAGE_TEXT;
SET intException = 53300;
END;

请查看这篇文章(我通过谷歌找到的,没有隐藏):http://zetcode.com/db/mysqlcsharptutorial/

向下滚动到"事务支持"部分。您的代码中没有使用。commit()或。rollback()方法。

您必须使用MySqlTransaction类来实现您正在寻找的结果。您可以相应地调用.Commit().Rollback(),请参阅我上面发布的所有必要信息和片段的链接。

也可以查看此链接:http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html。它描述了MySqlTransaction类及其方法和一些最佳实践。