Ho un'applicazione web ASP.NET, che ottiene i dati da un database SQL Server 2008 R2 e li visualizza agli utenti. Le tabelle nel database vengono popolate con i dati più recenti da un altro servizio, ogni 30 minuti. Questo servizio viene eseguito per 5 minuti.
Il problema che sto affrontando è che ogni volta che un utente accede all'applicazione mentre le tabelle vengono aggiornate, viene generato il seguente errore,
System.Web.HttpUnhandledException (0x80004005): è stata generata un'eccezione di tipo 'System.Web.HttpUnhandledException'. ---> System.Data.EntityCommandExecutionException: si è verificato un errore durante la lettura dal lettore di dati del provider del negozio. Vedi l'eccezione interna per i dettagli. ---> System.Data.SqlClient.SqlException: Transaction (ID processo 209) era deadlock in blocco | risorse del buffer di comunicazione con un altro processo ed è stato scelto come vittima del deadlock. Rieseguire la transazione.
Come superare questa situazione?
I passi che seguo sono,
using (SqlConnection con = new SqlConnection(db.Database.Connection.ConnectionString))
{
con.Open();
using (SqlTransaction tran = con.BeginTransaction())
{
string queryText = string.Format("DELETE FROM TABLE_NAME", DataDateTime);
SqlCommand cmd = new SqlCommand(queryText, con, tran);
cmd.ExecuteNonQuery();
SqlBulkCopy bc = new SqlBulkCopy(con,
SqlBulkCopyOptions.KeepNulls, tran);
bc.BatchSize = 5000;
bc.DestinationTableName = "TABLE_NAME";
DataTable data = newIncidentExtractList.ToDataTable();
bc.WriteToServer(data);
string updateText = @"Update TABLE_NAME WITH CONDITION";
SqlCommand cmdActive = new SqlCommand(updateText, con, tran);
cmdActive.ExecuteNonQuery();
string updateTextInactive = @"Update TABLE_NAME WITH CONDITION";
SqlCommand cmdInActive = new SqlCommand(updateTextInactive, con, tran);
cmdInActive.ExecuteNonQuery();
string updateUnAssigned = @"Update TABLE_NAME WITH CONDITION";
SqlCommand cmdUnAssigned = new SqlCommand(updateUnAssigned, con, tran);
cmdUnAssigned.ExecuteNonQuery();
tran.Commit();
insertResult = true;
}
con.Close();
}
L'unica cosa che puoi fare è rivedere il tuo servizio di migrazione dei dati. Mantenere le transazioni il più brevi possibile. Non aprire la transazione fino a quando non avrai veramente intenzione di scrivere i dati e chiuderli subito dopo la scrittura. Questo può essere utile.