如何让C#执行阅读器抛出异常而不是挂起

本文关键字:抛出异常 挂起 执行 | 更新日期: 2023-09-27 18:26:48

我打开了一个应用程序,该应用程序调用并使用"FOR UPDATE"执行了SELECT,锁定了行。

当第二个应用程序尝试访问同一行时,应用程序将挂起(直到超时):

// Simplified code
var connection = new MySqlConnection(connectionString);
connection.Open();
var transaction = connection.BeginTransaction();
MySqlCommand command = new MySqlCommand(sqlQuery, connection, transaction);
MySqlDataReader dataReader = command.ExecuteReader(); // HANGS

根据SqlException下的文档:

针对锁定行执行命令时发生异常

这就是我想要的——立即得到一个例外。我试图更改命令超时,但这只是给出了一个TimeoutException,而没有解释确切的原因。

如何让C#执行阅读器抛出异常而不是挂起

您尝试过使用try-and-catch吗?

var connection = new MySqlConnection(connectionString);
try
{

connection.Open();
var transaction = connection.BeginTransaction();
MySqlCommand command = new MySqlCommand(sqlQuery, connection, transaction);
MySqlDataReader dataReader = command.ExecuteReader(); 
}
catch (Exception)
        {
            throw;
        }

SqlException SQL连接的默认超时时间大约为15或30秒。当您的代码试图读取数据时,它会等待答案或超时。这样做的一种方法(我不确定它有多实用——只是SQL的初学者)是缩短超时时间并尝试重新连接,同时刷新程序:

connection.ConnectionTimeout = 1; //timeout in seconds
//initialize command, connection etc
bool commited;
while(!commited){
   try{
      MySqlDataReader dataReader = command.ExecuteReader(); 
      commited = true;
   }catch(SqlException e) {
      commited = false;
   }
   //code to force program update.
}

如果你真的想要"锁定行"消息,你可以在1秒的超时15次(或者你选择的任何数量)后完成。