Sql 具有并发读写访问权限的表的锁定提示

Sql 具有并发读写访问权限的表的锁定提示,sql,transactions,locking,sql-server-2000,Sql,Transactions,Locking,Sql Server 2000,我见过一些类似的问题,但没有一个能完全解决这个问题 我有一个在线评估应用程序,向用户提出问题,每页一个问题,并记录他们的答案。用户可以在问题之间导航,并自动保存他们的回答 当从一个页面(问题Q1)导航到另一个页面(问题Q2)时,数据库必须: 更新此用户对Q1的响应(如果存在)或插入对Q1的响应 选择此用户对Q2的响应(如果存在)以填充页面 [RESPONSE]表是许多用户并发读写的争用点。但是,每个用户只能对自己的行进行读写操作 这让我觉得我可以安全地使用(READUNCOMMITTED)和

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

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

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

  • 更新此用户对Q1的响应(如果存在)或插入对Q1的响应
  • 选择此用户对Q2的响应(如果存在)以填充页面
[RESPONSE]表是许多用户并发读写的争用点。但是,每个用户只能对自己的行进行读写操作

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

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


我们目前使用的是SQL2000。

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

站点的安全设置是否可以防止同一用户同时登录?如果不是,您可能会对锁定提示有问题……什么是“使用(NOLOCK)更新”呢?更新将始终使用锁
NOLOCK
仅适用于
SELECT
查询。@JNK:是的,同一用户ID只会登录一次。@Martin:谢谢提醒。我总是让SQL server来做它自己的事情。所以说清楚一点,不需要使用NOLOCK选择,因为只有正在写入的行才会被锁定。只要有适当的索引(在userID上),其他用户行上的行锁就不会影响我的选择。@GC-是。只要他们在不同的行集合上使用行锁,就不会有问题(可能会有来自并发更新的页面闩锁上的轻微争用,但可能不值得提前担心),您可以使用SQL Profiler跟踪查询所使用的锁。