C# 在ASP.NET中使用MySql:关闭连接真的会释放表锁吗?

C# 在ASP.NET中使用MySql:关闭连接真的会释放表锁吗?,c#,mysql,asp.net,C#,Mysql,Asp.net,我正在开发一个ASP.NET应用程序,其中,作为某些逻辑的一部分,我希望锁定一些表并对它们进行操作。该方法在一个单独的线程中运行,作为一种后台任务,通过任务生成。问题来自错误处理 代码大致如下所示: MySqlConnection connection = new MySqlConnection(ConfigurationManager.AppSettings["prDatabase"]); try { connection.Open(); MySqlCommand lock_t

我正在开发一个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();
}
非常简单的东西。如果没有什么问题,一切都很好。这是一个很糟糕的假设,所以我故意设置一个情况,在中间会弄脏,然后移动到最后一个块。

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


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

尝试将您的连接和MySqlCommand实例包装到using语句中。这将在对象离开括号后立即释放对象

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

}

使用只是try/finally块的快捷方式。这里应该没什么区别,因为他没有处理MySQlCommand实例。因此,使用块将处理它。使用此方法不需要他在括号外声明实例。如果您的建议解决了问题,我将非常高兴。但我很怀疑这里是否会出现这种情况。虽然上面的示例代码没有处理MySqlCommand是正确的,但我几乎不相信这会解锁表。我认为问题在于连接池机制,当你在代码中关闭连接时,它也会保持连接的活力。嗨,史蒂夫,你可能是对的。但我认为SQLCommand实例在某种程度上仍然是“活动的”。我还认为,由于SqlCommand实例将MySqlConnection作为参数,因此MySqlCommand实例应该失败。然而,情况并非如此,因此我认为异常发生在成功连接和开始执行命令之后。因此,将其包装到using语句中将处理实例,并可能中止/关闭/终止查询。using语句似乎不起作用。我还尝试在finally块中调用connection.Dispose(),但也没有成功。我以前在MS SQL vs entity framework上经历过这些。无论我调用dispose()还是在“using”中编写代码,都仍然连接。然后我不得不写一个程序“杀死这台机器的所有连接,除了当前的”。但同样的代码在服务器上运行时没有任何问题,可能是因为网络的原因?当然,我无法测试这一点,但我怀疑问题在于连接池机制,当您在代码中关闭连接时,它会保持连接的活动性。作为一种可能的测试方法,您可以尝试调用
MySqlConnection.ClearPool(connection)