【发布时间】:2015-04-08 18:33:50
【问题描述】:
我有一个 ASP.NET Web 应用程序,它从 SQL Server 2008 R2 数据库中获取数据并将其显示给用户。数据库中的表每 30 分钟会填充一次来自另一个服务的最新数据。该服务运行 5 分钟。
我面临的问题是,每当用户在更新表时访问应用程序时,都会引发以下错误,
System.Web.HttpUnhandledException (0x80004005):引发了“System.Web.HttpUnhandledException”类型的异常。 ---> System.Data.EntityCommandExecutionException:从存储提供程序的数据读取器读取时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: Transaction (Process ID 209) was deadlocked on lock |与另一个进程通信缓冲区资源,并已被选为死锁牺牲品。重新运行事务。
如何克服这种情况?
我遵循的步骤是,
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();
}
【问题讨论】:
-
您是删除并重新创建表,删除所有记录并插入新记录还是其他?
-
我没有删除表格,而是删除所有记录并插入新记录。
-
当您删除所有条目并重新添加时,该应用程序当前如何工作。您在 1 个事务/提交中执行此操作?
-
是的,我在 1 笔交易中执行此操作。我只是添加了代码结构。请验证。
-
并且应用程序可以在更新 TABLE_NAME 的同时,您在逻辑上删除并重新添加一组不同的条目。?哇
标签: c# asp.net sql-server entity-framework entity-framework-6