使用通用DbCommand執行更新時,如果正在更新的行被鎖定,它將無限期地掛起。有沒有辦法使用通用DbCommand來執行異步更新?
使用的基本連接是Devart的Oracle提供,Devart.Data.Oracle.OracleConnection
設置DbCommand.CommandTimeOut沒有任何效果可言,更新永不超時。
DbCommand沒有實現BeginExecuteNonQuery,所以似乎沒有辦法以異步的方式使用DbConnection/DbCommand。
我能夠通過使用Devart的OracleCommand和BeginExecuteQuery來解決這個問題,但它確實如此。
有沒有辦法以通用的方式做到這一點?
爲Oracle特定的邏輯簡化代碼:
public bool TestAsyncUpdateRowOracle(string key, OracleConnection con, string sql)
{
const int timoutIterations=10;
bool updateOk=false;
OracleCommand cmd = new OracleCommand(sql, con);
cmd.Parameters.Add(Util.CreateParameter(dbSrcFactory, DbType.String, 16, "key"));
cmd.CommandType = CommandType.Text;
cmd.Parameters[0].Value = key.ToString();
IAsyncResult result = cmd.BeginExecuteNonQuery();
int asyncCount = 0;
while (!result.IsCompleted)
{
asyncCount++;
if (asyncCount > timeoutIterations)
{
break;
}
System.Threading.Thread.Sleep(10);
}
if (result.IsCompleted)
{
int rowsAffected = cmd.EndExecuteNonQuery(result);
Console.WriteLine("Done. Rows affected: " + rowsAffected.ToString());
}
else
{
try
{
cmd.Cancel();
Console.WriteLine("Update timed out, row is locked");
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.WriteLine("Unable to cancel update");
}
}
cmd.Dispose();
}