일반 DbCommand를 사용하여 업데이트를 수행하는 경우 업데이트중인 행이 잠겨 있으면 무기한 정지됩니다. 사용되는 기본 연결이비동기 업데이트를 수행하기 위해 일반 DbCommand를 사용하는 방법이 있습니까?
는 전혀 밖으로 업데이트 결코 시간을 영향을 DbCommand.CommandTimeOut을했다 설정하지 Devart.Data.Oracle.OracleConnection
Devart의 오라클 제공 업체입니다.
DbCommand는 BeginExecuteNonQuery를 구현하지 않으므로 비동기 방식으로 DbConnection/DbCommand를 사용할 방법이없는 것으로 보입니다.
Devart의 OracleCommand 및 BeginExecuteQuery를 사용하여이 문제를 해결할 수 있지만 그럴 수 있습니다.
일반적인 방법으로이를 수행 할 수있는 방법이 있습니까? 오라클 특정 로직
단순화 된 코드 :
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();
}