如何让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,而没有解释确切的原因。
您尝试过使用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次(或者你选择的任何数量)后完成。