【问题标题】:asp.net lock page method until action finishedasp.net 锁定页面方法,直到操作完成
【发布时间】:2012-03-18 12:04:25
【问题描述】:

我有一个对 db 执行一些更新的 asp.net 页面。更新需要 2-3 秒,所有这些都发生在首先从 db 读取数据并进行一些更新的方法中。当这些动作的页面请求小于2秒时,db读取代码,读取db中相同状态的记录,asp.net页面请求的所有更新动作都会更新相同的记录。

我怎样才能防止这些,最新的请求等到最旧的请求完成它们的执行?

有什么想法吗?

【问题讨论】:

  • 要同步访问相同数据的不同页面(或任何客户端),您需要使用数据库锁。你用的是什么数据库?
  • 我正在使用 MS SQL 2008,使用 ADO.NET 数据集读取数据和更新。
  • 这些可以在源代码中完成吗?

标签: c# asp.net


【解决方案1】:

如果我对您的理解正确,您希望在该过程完成之前阻止对特定方法集的访问。

很简单...创建一个静态方法并实现一个lock()。您可以使用共享锁、升级到读/写锁等来获得真正的乐趣……但基本原则是您锁定共享代码的关键部分,以便其他用户无法进入这些部分。

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx

lock 关键字通过获取给定对象的互斥锁、执行语句然后释放锁来将语句块标记为临界区。

static object lockObject = new Object();
static bool inProgress = false;

static void MyProcess()
{
  if(inProgress) return;

  lock(lockObject)
  {
    try{
      inProgress = true;
      // critical code here
    }
    finally
    {
      inProgress = false;
    }
  }
}

【讨论】:

    【解决方案2】:

    使用适当的隔离级别和数据库锁:这将确保正确处理任何客户端(准确地说是任何事务)并保留数据完整性(检查isolation levels)。

    我建议使用 READ COMMITTED,它确保您永远不会读取未提交的数据,并且事务在更新同一记录期间排队。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      相关资源
      最近更新 更多