gpt4 book ai didi

c# - 在 ASP.NET 中使用 MySql : Does closing a connection really release table locks?

转载 作者:行者123 更新时间:2023-11-29 12:34:19 25 4
gpt4 key购买 nike

我正在开发一个 ASP.NET 应用程序,作为某些逻辑的一部分,我想锁定一些表并对其进行处理。该方法在一个单独的线程中运行,该线程作为一种后台任务运行,通过任务生成。问题出在错误处理上......

代码看起来或多或少像这样:

MySqlConnection connection = new MySqlConnection(ConfigurationManager.AppSettings["prDatabase"]);
try
{
connection.Open();
MySqlCommand lock_tables = new MySqlCommand(Queries.lockTables(), connection);
lock_tables.ExecuteNonQuery();

// do a bunch of work here

MySqlCommand unlock_tables = new MySqlCommand(Queries.unlockTables(), connection);
unlock_tables.ExecuteNonQuery();
}
catch (MySqlException mex)
{
// Mostly error logging here
}
finally
{
connection.Close();
}

非常简单的东西。一切都运转良好,假设没有出现任何问题。不过,这是一个糟糕的假设,所以我故意设置了一种情况,让事情在中间出错并移动到最后的 block 。

结果是我的表锁一直保留到我关闭应用程序为止,这是我通过在方法完成后尝试使用不同的客户端访问表来了解到的。不用说,这不是我的意图,特别是因为在我处理完这些表后,还有另一个应用程序应该访问它们。

我可以通过在关闭连接之前显式释放锁来快速解决问题,但我仍然对某些事情感到好奇。我之前读过的所有内容都宣誓关闭连接应该隐式释放表锁。显然在这种情况下并非如此。这是为什么? connection.Close() 实际上并没有完全关闭连接吗?我有更好的方法来关闭我的连接吗?

最佳答案

尝试将 Connection 和 MySqlCommand 实例包装在 using 语句中。一旦对象离开括号,就会释放对象。

    using(MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
using(MySqlCommand command = new MySqlCommand("command to execute",conn))
{
//Code here..
}

}

关于c# - 在 ASP.NET 中使用 MySql : Does closing a connection really release table locks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com