5

I have five threads. They are doing OracleBulkCopy(1 million records each) into the same table (EXCEL_DATA) at same time. But at some point in time I am getting below error:

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

I am using below code for 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

1 に答える 1

4

テーブルまたはセクションがロックされているように聞こえます(特に明示的なトランザクションがあるため、一括コピー中は非常に合理的です)、競合する一括コピーからの他の挿入をブロックしています。それはあまり驚くべきことではありません。私が言える最善のことは...「それをしないでください」です。特に、これは IO バウンド操作であり、主なブロックはネットワークである可能性が非常に高く、2 番目の制限はバックエンド サーバーです。これは、指定した ACID ルールを遵守するためにも必要です。これらの理由により、これらの操作を並行して実行しても、パフォーマンスが大幅に向上する可能性は低く、ブロッキングによるタイムアウトが発生する可能性が非常に高くなります。

つまり、これらを並行して行うのではなく、順番に行います。

于 2012-09-11T06:52:26.697 に答える