2009-05-11 3 views
1

일반 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(); 
} 

답변

2

슬프게도 아니요, 비동기 작업이있는 ADO.NET에는 인터페이스 나 기본 클래스가 없습니다 (예 : BeginExecuteNonQuery/EndExecuteNonQuery). 그것들은 단지 소수의 ADO.NET 공급자 구현에서만 존재합니다. (SqlClient, Devart Oracle).

즉, CommandTimeOut이 설정 될 때 시간 초과되지 않으면 제 생각에는 공급자의 버그입니다.

0

당신이 NOWAIT 옵션으로 LOCK 표를 발행 할 수 있습니까? 잠금 실패시 오류가 발생하면 즉시 제어권이 반환됩니다. 예 :

LOCK TABLE employees 
    IN EXCLUSIVE MODE 
    NOWAIT; 

여러 가지 방법으로 테이블을 잠글 수 있습니다. Here은 잠금에 대한 개발자 안내서 섹션입니다. This은 LOCK TABLE 명령에 대한 SQL 참조 페이지입니다.

또 다른 옵션은 SELECT .. FOR UPDATE NOWAIT 문을 사용하여 업데이트 할 행을 잠그는 것입니다. 두 옵션 모두 update 문 외에 Oracle에 추가 명령을 내 보내야합니다.

관련 문제