【问题标题】:Web application database concurrencyWeb 应用程序数据库并发
【发布时间】:2008-12-05 09:59:34
【问题描述】:

我有一个在后台有一个数据库 (SQL Server) 的 Web 应用程序 (ASP.net 2.0)。如果两个用户同时将相同的数据插入同一个表,我正在考虑如何处理数据库并发。有什么办法可以处理这种情况吗?提前致谢。

吉米

【问题讨论】:

    标签: database concurrency


    【解决方案1】:

    为防止同时插入相同的数据,请在您希望唯一的列上使用唯一索引。第一个INSERT会成功,正确处理失败的INSERT的错误。

    为防止 2 个以上的用户同时修改同一(现有)记录,请使用乐观并发http://en.wikipedia.org/wiki/Optimistic_concurrency_control。使用 SQL Server,使用TIMESTAMP 列很容易实现乐观并发。使用您的数据读取时间戳。更新行时,检查时间戳值是否相同。如果时间戳不匹配,则用户有(正在查看)过时的行。妥善处理这种情况。

    使用 SqlClient 的示例:

    command.CommandText = @"
        UPDATE tbl
        SET LastName = @LastName, FirstName = @FirstName
        WHERE ID = @ID AND Timestamp = @Timestamp
        ";
    
    int rowCount = command.ExecuteNonQuery();
    if (rowCount != 1)
        throw new DBConcurrencyException();
    

    【讨论】:

      【解决方案2】:

      你只需要:

      开始交易; 将 XXXXXX 插入表 1 ...... 将 YYYYY 插入表 2 ........ 犯罪; if (commit_failed) { 告诉用户再试一次!; };

      SQLserver 会处理剩下的事情。

      【讨论】:

        【解决方案3】:

        如果您想防止重复,最简单的答案是在您希望唯一的列上创建一个 UNIQUE 索引。

        如果您试图阻止多个用户同时修改同一记录,最好的办法是在表中添加最后修改的时间戳。当您阅读要在屏幕上显示的记录时,您会阅读时间戳,并且在您编写更改之前再次检查时间戳。如果它已更改,则意味着另一个用户已修改该记录,您应该阻止写入更改。

        【讨论】:

          【解决方案4】:

          如果不知道您的 C# 代码如何与数据库(O/R、ADO.NET...)对话,很难给您一个有用的答案...

          编辑:所有示例都很棒,但如果他使用 SubSonic 示例,它们将无济于事。

          【讨论】:

          • 实际上,对于 INSERT 情况,无论数据库库如何,唯一索引都将起作用。
          • 对于 UPDATE 案例,我希望大多数库都支持乐观并发。 ADO.NET 当然可以,但 LINQ to SQL 也可以。我不能代表 Subsonic,但我相信您可以将时间戳检查编码到您的 Subsonic 查询中。如果不是这样,请告诉我。
          • Brannon - 这是我的观点,如果他使用的是 ORM 工具,它可能会处理并发问题。怎么能这么快回复!刚刚注意到反对票。
          猜你喜欢
          • 2023-04-07
          • 1970-01-01
          • 2015-10-02
          • 2017-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-03
          • 2011-02-21
          相关资源
          最近更新 更多