我打开了一个应用程序,它使用" 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下的documentation:
对锁定行执行命令时发生异常
这就是我想要的 - 立即获得例外。 我试图更改命令超时,但这只是给出了一个TimeoutException并且没有解释这个准确的原因。
答案 0 :(得分:0)
你尝试过使用try和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;
}
答案 1 :(得分:0)
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.
}
如果你真的想要“锁定行”信息,你可以在15秒(或你选择的任何数量)1秒钟后完成。