【问题标题】:Locking hints for table with concurrent read and write access具有并发读写访问权限的表的锁定提示
【发布时间】:2011-02-07 13:59:11
【问题描述】:

我见过一些类似的问题,但没有一个能完全解决这种情况。

我有一个在线评估应用程序,它向用户提出问题,每页一个问题,并记录他们的答案。用户可以在问题之间导航,他们的回答会自动保存。

当从一个页面(问题 Q1)导航到另一个页面(问题 Q2)时,数据库必须:

  • 更新此用户对 Q1 的响应(如果存在)或插入对 Q1 的响应。
  • 选择此用户对 Q2 的响应(如果存在)以填充页面。

[RESPONSE] 表是许多用户同时读写的争论点。但是,每个用户只会读取和写入他们自己的行

这让我认为我可以安全地使用 (READUNCOMMITTED)、 和 UPDATE with (NOLOCK)。我担心的是,我不希望出现用户前进一个页面,然后跳转回来并在更新之前获取旧数据的情况。我可以将这两个操作放在一个事务中,但如果我使用 NOLOCK 提示,会有什么不同吗?

我可以使用什么锁定策略来缓解此表的争用?

我们目前使用的是 SQL2000。

【问题讨论】:

  • 是否设置了站点的安全性以防止同一用户同时登录?如果不是,您可能会遇到锁定提示问题...
  • “使用 (NOLOCK) 更新”是什么意思?更新将始终锁定。 NOLOCK 仅适用于 SELECT 查询。
  • @JNK:是的,同一个用户ID只会登录一次。
  • @Martin:感谢您的提醒。我一直让 SQL Server 做它的事情。

标签: sql transactions locking sql-server-2000


【解决方案1】:

您应该只需要使用rowlock 提示并确保您具有适当的索引,以便可以直接查找行,而无需扫描属于不同用户的其他行。

【讨论】:

  • 所以为了清楚起见,不需要使用 NOLOCK 进行 SELECT,因为只有正在写入的行会被锁定。只要有适当的索引(在 userID 上)到位,其他用户行上的行锁定就不会影响我的选择。
  • @GC - 是的。只要他们对不同的行集进行行锁,就不会有问题(并发更新可能会轻微争用页面锁存器,但可能不值得事先担心)顺便说一句,您可以使用 SQL Profiler跟踪查询所占用的锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2020-06-13
  • 1970-01-01
  • 2010-10-25
  • 2023-04-03
  • 2011-06-07
相关资源
最近更新 更多