2012-09-11 28 views
4

我有五個線程。他們是在同一時間做OracleBulkCopy(1元每記錄)到同一個表(EXCEL_DATA)。但是,在某個時間點,我收到以下錯誤:OracleBulkCopy與多個線程

ORA-00604: error occurred at recursive SQL level 1 ORA-00054: resource busy and acquire with NOWAIT specified

我使用下面的代碼爲OracleBulkCopy:

using (OracleConnection con = new OracleConnection(ConnectionString)) 
       { 
        con.Open(); 
        using (var bulkcopy = new OracleBulkCopy(con, options)) 
        { 
         OracleTransaction tran = 
          con.BeginTransaction(IsolationLevel.ReadCommitted); 
         bulkcopy.DestinationTableName = DestinationTable; 
         foreach (var mapping in columnMappings) 
          bulkcopy.ColumnMappings.Add(mapping); 
         bulkcopy.BulkCopyTimeout = TimeOut.Value; 
         try 
         { 
          bulkcopy.WriteToServer(dataTable); 
          tran.Commit(); 
         } 
         catch (Exception ex) 
         { 
          tran.Rollback(); 
         } 
        } 
       } 

回答

4

這聽起來像表或批量過程中部分被鎖定(相當合理-copy,特別是因爲你有一個明確的事務),並且阻止來自競爭批量副本的其他插入。這聽起來並不令人驚訝。我能說的最好的事情是......「不要那樣做」。特別是,這是一個IO綁定操作,與你的主堵塞很可能是網絡,與二次限爲後端服務器 - 這也是需要觀察到您指定的ACID規則。由於這些原因,並行執行這些操作是不可能給任何顯著的性能優勢,但非常容易造成由於阻塞超時。

所以:不是並行做這些...做他們的系列。