我有五个主题。他们同时在同一个表(EXCEL_DATA)中执行 OracleBulkCopy (每个100万条记录)。但是在某个时间点我遇到了错误:
ORA-00604:递归SQL级别1发生错误 ORA-00054:资源繁忙并通过NOWAIT指定获取
我正在使用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();
}
}
}
答案 0 :(得分:4)
听起来像表或部分被锁定(在批量复制期间非常合理,特别是因为您有明确的事务),并且阻止了竞争批量复制的其他插入。这听起来并不令人惊讶。我能说的最好的事情是......“不要那样做”。特别是,这是一个IO绑定操作,您的主要阻塞很可能是网络,次要限制是后端服务器 - 这也是必需来遵守ACID规则已经指定。出于这些原因,并行执行这些操作不太可能带来任何显着的性能优势,但 非常 可能会因阻塞而导致超时。
所以:不要并行地做这些......而是串联起来。