【发布时间】:2018-04-24 22:16:36
【问题描述】:
我有一个名为 ProjectActivity 的表 主键:ProjectCode 和 ActivityId 以及 ProjectCode 上的索引 我们的网站在此表上生成查询(不涉及其他表)并始终请求具有相同 ProjectCode 的行
有时我们会在 c# 中启动一项作业,删除具有特定 ProjectCode 的每一行,并在事务中为该特定 ProjectCode 插入新行。
using (var dbContextTransaction = db.Database.BeginTransaction())
{
try
{
db.Database.ExecuteSqlCommand("delete FROM [TS_Repository].[dbo].[ProjectActivities] where ProjectCode = {0} ", project.Code);
LogManager.WriteRequestLog("Deleted Existing Project Activities");
if (ProjectActivities.Count > 0)
{
db.Set<ProjectActivity>().AddRange(ProjectActivities);
db.SaveChanges();
}
dbContextTransaction.Commit();
LogManager.WriteRequestLog("Refresh ProjectActivities succesfully for " + project.Title);
}
catch (Exception exc)
{
dbContextTransaction.Rollback();
throw exc;
}
}
我们的问题是,在处理此事务(3/4 分钟)时,我们的网站无法执行任何查询(整个表被锁定)。 我们应该得到这个场景: 在提交交易之前,网站应该查询“旧”数据。这种场景可以实现吗?我可以弄清楚我们必须使用锁定和隔离级别来欺骗。
提前感谢您的任何提示。
【问题讨论】:
-
也许您应该重新考虑清除然后重新填充您的项目代码集的决定 - 这听起来不是一种有效的方法。
-
我不这么认为。我的活动经常更新。我应该检查每个 id 是否已插入,如果已插入,是否已更新某些列。
标签: sql-server c#-4.0 isolation-level