如何让C#ExecuteReader抛出异常而不是挂起

时间:2014-10-17 07:36:16

标签: c# mysql .net-4.0

我打开了一个应用程序,它使用" 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并且没有解释这个准确的原因。

2 个答案:

答案 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秒钟后完成。