Possiedo un'applicazione che potenzialmente esegue migliaia di inserimenti in un database di SQL Server 2005. Se un inserto non riesce per qualsiasi motivo (vincolo di chiave esterna, lunghezza del campo, ecc.) L'applicazione è progettata per registrare l'errore di inserimento e continuare.SqlTransaction ha completato
Ogni inserto è indipendente dagli altri, pertanto le transazioni non sono necessarie per l'integrità del database. Tuttavia, desideriamo usarli per il guadagno in termini di prestazioni. Quando uso le transazioni otterremo il seguente errore su circa 1 su 100 commit.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
per cercare di rintracciare la causa ho messo tracciare dichiarazioni ad ogni operazione di transazione in modo da poter garantire la transazione non era stato chiuso prima di chiamare il commit. Ho confermato che la mia app non ha chiuso la transazione. Ho quindi eseguito nuovamente l'app utilizzando gli stessi dati di input e ci riesce.
Se si disattiva la registrazione, fallisce nuovamente. Riaccendilo e ci riesce. Questo interruttore on/off viene eseguito tramite app.config senza la necessità di ricompilare.
Ovviamente l'atto di registrazione cambia i tempi e fa sì che funzioni. Ciò indicherebbe un problema di threading. Tuttavia, la mia app non è multi-thread.
Ho visto una voce MS KB che indica un bug con .Net 2.0 framework potrebbe causare problemi simili (http://support.microsoft.com/kb/912732). Tuttavia, la correzione fornita non risolve questo problema.
Utilizzare le transazioni "per il guadagno di prestazioni"? In che modo l'utilizzo delle transazioni migliora le prestazioni? – LukeH
Concordato con luke, perché vedi o pensi di avere un guadagno in termini di prestazioni? – eglasius
avere una transazione intorno a più inserti, in generale, aumenterà le prestazioni, testarlo tu stesso e vedere. effettuando una transazione si riduce il numero di blocchi da acquisire prima degli inserimenti –