【问题标题】:Mssql 2012 Row LockingMssql 2012 行锁定
【发布时间】:2013-03-22 08:24:48
【问题描述】:

我在数据库上有很多数据,很多用户正在通过异步 JS 更新这些数据。 我想防止多个用户修改数据库上的同一行。当用户 1 单击网页中的编辑行时,我想向服务器发送信号并锁定该行。因此其他用户将无法访问同一行的编辑模式。当用户完成编辑行时,他/她将单击确定,将提交更新并解锁行。我在谷歌上搜索了这种方法,但所有 sql 锁都是针对单个事务的。有没有办法做到这一点?我很乐意在不改变我的数据库设计的情况下解决这个问题。但如果没有改变就没有解决方案,很多工作将等着我:)

【问题讨论】:

    标签: database entity-framework


    【解决方案1】:

    尝试一下:http://en.wikipedia.org/wiki/Optimistic_concurrency_control

    每当保存该行时,就会对 lock_version 字段进行计数。每当在这一行上发生保存时,它都会查看数据库上的 lock_version 是否与内存中保存的相同。如果版本不同,则该行已被其他用户更改。在这里你可以做任何事情:

    1. 从数据库中重新加载行并添加更改,然后重新保存
    2. 只要抛出一个异常,让用户自己处理

    如果您真的想要对您的建议有所帮助,您将需要在行上使用某种标志来处理此问题,您在用户编辑行时设置该标志。

    1. 用户开始编辑行 -> 将标记锁定为真
    2. 另一个用户尝试编辑该行 -> 标志将阻止此操作
    3. 用户结束编辑行 -> 将标记锁定为 false

    然而,这会给你带来各种各样的问题......尽量避免这种复杂的锁处理,并使用像乐观锁这样简单的东西

    【讨论】:

    • 你在想什么样的问题?关于你的第二个建议
    • 现在只能想到一个 :)。并发问题:第一个用户想要打开该行进行编辑,所以他读取该行然后将其保存回来并将锁定标志设置为 true,同时另一个用户已读取该行,而第一个用户的保存尚未完成。现在您有两个用户正在编辑同一行。您可能需要将这些步骤包装到事务中以防止此类问题(在此期间需要锁定行以进行其他读取或写入操作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2016-12-09
    • 2015-09-23
    相关资源
    最近更新 更多