mysql中的事务
本文关键字:事务 mysql | 更新日期: 2023-09-27 18:12:53
我正在开发一个Mysql数据库(5.5版)的c#应用程序。我正面临着一个问题,我需要捕捉Mysql中发生的异常。不管它是在Mysql还是在dotNet中捕获的。问题是,我想回滚所有我以前的工作时,发生异常/错误;无论是MySqlException还是自定义的。是的,我尝试使用TransactionScope
和MySqlTransaction
,但它没有回滚我的工作。如果任何人有任何想法或建议,请指导我。谢谢。
编辑:代码
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 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
类及其方法和一些最佳实践。