sql >> Database >  >> RDS >> Sqlserver

Threading en SqlFileStream. Het proces heeft geen toegang tot het opgegeven bestand omdat het is geopend in een andere transactie

De transactie stroomt niet door naar de Parallel.ForEach , moet u de transactie handmatig invoeren.

//Switched to a thread safe collection.
var documents = new ConcurrentQueue<ExtractedContent>();
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    var attachments = await dao.GetAttachmentsAsync();
    //Grab a reference to the current transaction.
    var transaction = Transaction.Current;
    Parallel.ForEach(attachments, a =>
    {
        //Spawn a dependant clone of the transaction
        using (var depTs = transaction.DependentClone(DependentCloneOption.RollbackIfNotComplete))
        {
            documents.Enqueue(a.ToDbDocument());
            depTs.Complete();
        }
    });

    ts.Complete();
}

Ik ben ook overgestapt van List<ExtractedContent> naar ConcurrentQueue<ExtractedContent> omdat je niet mag bellen .Add( op een lijst van meerdere threads tegelijk.




  1. PARTITIE DOOR met en zonder KEEP in Oracle

  2. Optimaal aantal verbindingen in verbindingspool

  3. Ruby on Rails-databasemigratie maakt geen externe sleutels in MySQL-tabellen

  4. Oracle - RETURNING gecombineerd met geaggregeerde functies