Ciao a tutti, vorrei raccontarvi, nel breve, l’esperienza che abbiamo avuto con l’errore di deadlock.
L’applicazione web è fatta con InDe Foundation 21.5, C#, .NET 2.0, che lavora con un db MSSQL, ed è stata creata nell’ambito dell’industria 4.0, riceve i dati dalla macchina, li elabora e li visualizza a video tramite un timer impostato con un tick al secondo.
Scendendo nel dettaglio:
. Una smartbox è in attesa che la macchina gli fornisca dei dati. Appena ricevuti apre una connessione al DB, esegue la insert e chiude la connessione. I valori passati dalla macchina sono memorizzati in formato grezzo in un campo Text.
. La procedura eseguita dall’applicazione InDe, ad ogni tick, esegue una foreach readwrite dei dati non trattati, ne ricava i valori e li memorizza in ulteriori campi dello stesso record. Dopodiché legge ciò che gli interessa e lo mostra a video.
Abbiamo faticato parecchio per ottimizzare il tutto (transazioni, indici, semafori, danza della pioggia…), ma senza risultati. Attivando (dal cliente) il profiler del management studio di SQL, per i soli deadlock, abbiamo scoperto questo:
Le operazioni che vanno in deadlock sono la SELECT dei dati non trattati e la INSERT della smartbox.
La SELECT applica un lock di tipo ‘S’ alla Pagina:1, e rimane in attesa di poter accedere alla Pagina:2.
La INSERT applica un lock di tipo ‘IX’ alla Pagina:2, e rimane in attesa di poter accedere alla Pagina:1.
I lock "S’ e ‘IX’ non sono compatibili, e il DB uccide la SELECT.
Supponiamo che il problema sia nel fatto che la INSERT debba lavorare su due pagine, Stackoverflow suggerisce che sia un problema di indici che contengono la stessa chiave, ma noi non abbiamo questa situazione. Forse invece la colpa è del campo Text. Allo stato attuale, non lo sappiamo.
La soluzione che abbiamo in mente di adottare è rendere l’applicazione web resistente ai deadlock, intercettando questo specifico errore e riprovando per un numero finito di volte, magari con un ritardo di qualche millisecondo.
A voi è mai capitato? Quali soluzioni avete adottato?
![]()