【问题标题】:Concurrent updates handling in ASP.NET or SQL Server 2008ASP.NET 或 SQL Server 2008 中的并发更新处理
【发布时间】:2012-11-06 02:48:22
【问题描述】:

有一个名为Accounts 的表如下所示:

AccountID   AccountName   AccountTotalMoney
-------------------------------------------
  1           Steven           600
  3           Scott            800

但用户现在可以同时更新行记录,如下所示:

User A:UPDATE Accounts SET AccountTotalMoney=700 WHERE AccountID=1;
User B:UPDATE Accounts SET AccountTotalMoney=900 WHERE AccountID=1;
User C:UPDATE Accounts SET AccountTotalMoney=1000 WHERE AccountID=1;
.
.
.

所以我想防止多个用户同时更新同一条记录。 一个接一个。

我是这方面的新手。对不起,我的英语不好。提前致谢!

【问题讨论】:

    标签: asp.net sql-server asp.net-mvc sql-server-2008


    【解决方案1】:

    有很多可能性。

    [观点:我认为大多数 Web 应用程序都进行乐观并发处理]:

    这里有一个关于乐观并发处理的好教程: http://msdn.microsoft.com/en-us/library/bb404102.aspx

    小摘要:

    同样,当两个用户访问一个页面时,一个用户可能正在更新一条记录,而该记录被另一用户删除。或者,在用户加载页面和单击“删除”按钮之间,另一个用户可能已经修改了该记录的内容。

    有三种可用的并发控制策略:

    • 什么都不做 - 如果并发用户正在修改同一记录,则让最后一次提交获胜(默认行为)。 •
    • 乐观并发——假设虽然有时可能会出现并发冲突,但绝大多数情况下不会出现这种冲突;因此,如果确实发生了冲突,只需通知用户他们的更改无法保存,因为另一个用户修改了相同的数据。
    • 悲观并发 - 假设并发冲突很普遍,并且用户不会容忍被告知他们的更改由于另一个用户的并发活动而没有保存;因此,当一个用户开始更新记录时,将其锁定,从而防止任何其他用户编辑或删除该记录,直到用户提交他们的修改。

    【讨论】:

      【解决方案2】:

      我认为 Pleuns 的回答很好。更具体一点:

      • Optimistic concurrencey - 检查行是否更改,如果更改则回滚。示例:添加每次更新后增加的版本列,并检查更新时版本号是否相同。

      • 悲观并发:更复杂。使用事务级别 IsolationLevel.Serializable 来锁定行,但是当事务跨越多个 Web 请求时,这不是一个好主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多