2013-04-18 43 views
3

在我的网站,我有事件日历:允许在SQL事务中读取吗?

enter image description here

现在你会发现他们有良好的组织到天。

这是管理员用来组织项目的功能。

这是问题所在。

虽然发生这种情况,我用一个交易范围,因为它修改的多个事件和可能失败:

例如:

//needs id '9999' 
public string Explode() 
{ 
    string eid = Request.Form["id"]; 

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new System.TimeSpan(2, 45, 0))) 
      { 
    try 
    { 
     int id = int.Parse(eid); 

     Project p = ProjectManager.GetProject(id); 
     int resID = p.Schedule.Employee.EmployeID; 
     Employee e = ResourceManager.GetEmployee(resID); 
     if (e == null) 
     throw new Exception(); 

     var tasks = ProjectManager.GetProjectTasks(id); 
     var ordered = SyncManager.Instance.GetTasks((int)p.PaymoID); 

     Task firstTask = null; 

     foreach (Paymo.Task t in ordered) 
     { 
     Task tsk = (from obj in tasks where obj.PaymoID != null && obj.PaymoID.Value == t.ID select obj).FirstOrDefault(); 
     if (tsk != null && t.UserName == e.EmployeName 
      && tsk.Schedule == null) 
     { 
      if (firstTask == null) 
      { 
       firstTask = tsk; 
      } 

      int scheduleID = ScheduleManager.CreateSchedule(p.Schedule.DateFrom.Value 
       ,t.BudgetHours <= 0 ? 1.0M : t.BudgetHours , e.EmployeID); 

      if (scheduleID == -1) 
       throw new Exception(); 

      if (!ScheduleManager.ChangeTaskSchedule(tsk.TaskID, scheduleID)) 
       throw new Exception(); 

      if (!ScheduleManager.GiveLowestPriority(ScheduleManager.GetSchedule(scheduleID))) 
      { 
       throw new Exception(); 
      }       
      } 
     } 

     ScheduleManager.ChangeProjectSchedule(p.ProjectID, null); 
     if (firstTask != null) 
     { 
      Bump b = new Bump(); 
      b.DoBump(firstTask.Schedule); 
     } 
     scope.Complete(); 
    } 

    catch (Exception) 
    { 
     return "fail"; 
    } 
    } 
    return ""; 
} 

现在的问题是,当交易发生的事情,如果用户试图要以只读模式访问日历,他们必须等待才能看到它。

有没有某种方式可以让网站在交易过程中仍可以加载? 我使用LINQ SQL和SQL Server 2008和VS 2012

+2

嗯,我不知道是什么可笑的限制LINQ可能在这个战略中的地位,但你可以执行你的使用读取读取提交的快照隔离,这将防止它们被作者阻止 - 假设这是你想要的。如果有人正在对时间表进行更改,读者可以看到预先更改的版本,还是希望他们等待更新? –

+0

他们可以看到prechange版本...我不希望他们必须等待... – jmasterx

+0

这并不真正回答@AaronBertrand的问题。很明显,你不希望他们等待 - 但是你希望他们能够读取预先翻译的版本(即,尽管是反向的脏读取:D) –

回答

2

更改您的使用到:

new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted,Timeout = new System.TimeSpan(2, 45, 0) }));