EF e Async: strano scenario live

Sto implementando async su tutto il mio progetto basato su cloud.

Sto cercando ora di capire perché il mio TransactionScope continua a bloccarsi in modo casuale. I messaggi sono “Imansible eseguire questa operazione perché ci sono operazioni in sospeso” o “L’operazione non è valida per lo stato della transazione” un altro simile.
Dico che si blocca casualmente, perché se riprovi l’operazione, alla fine funziona …

Inizialmente ho implementato il sovraccarico TransactionScopeAsyncFlowOption.Enabled … il rapporto di errore è diminuito.
Poi ho fatto l’intera operazione usare lo stesso DbContext (i ragazzi precedenti ne hanno creato uno nuovo per ogni operazione CRUD, come selezionare un nuovo utente per te! Ora vuoi le vendite di quell’utente? Fammi ottenere usando un nuovo contesto! Crea una nuova vendita? Facciamolo in questo nuovo contesto qui … e così via …). il rapporto di errore è diminuito ulteriormente.
Poi ho deciso di await il prima ansible (in precedenza stavo sparando alcune domande all’inizio dell’operazione e aspettavo solo prima di usare il risultato). Ciò ha migliorato significativamente il rapporto di errore.

Ora, ho ricevuto un messaggio nei miei log che segnalava una mancata corrispondenza tra FK … Questo è davvero strano perché questa è un’app molto solida e la logica FK che sta andando male è un errore molto semplice. Guardando il log, vedo qualcosa come “Errore per il client CLIENT_A . Messaggio completo: (bla bla bla) Il conflitto si è verificato nel database db_CLIENT_B ” !!!

Nella mia app multi-tenant, ogni tenant ha il proprio database, quindi CLIENT_A dovrebbe avere problemi solo con db_CLIENT_A . Siamo molto meticolosi su questo.

Questo è un problema molto serio. Ciò significa che o il contenitore di unità sta dando l’istanza sbagliata di DbContext (è configurata per singola istanza per richiesta) oppure si sta verificando un serio problema riguardante le operazioni asincrone / attese e parallele e distinte … Penso che potrebbe essere un mix, prendendo in considerazione che DbContext non è thread-safe e nemmeno Resolve, anche se viene chiamato una sola volta (la risoluzione per DBContext avviene molto presto sulla pipeline)

Quindi la mia domanda è: cosa posso fare per capirlo?

PS : negli ultimi 7 giorni, ho 5 registri per questo. Questo potrebbe essere accaduto più volte (il passaggio), ma se l’altro database ha un FK compatibile … beh, lo farò per questo in un paio di giorni in cui i manager iniziano a emettere rapporti finanziari …

Questo è causato da Unity. Questo accade quando chiamo “Resolve” all’interno di un ambito asincrono.