C# 是否可以锁定一条记录,但仍允许其他用户读取?

C# 是否可以锁定一条记录,但仍允许其他用户读取?,c#,sql-server-2008,tsql,record-locking,C#,Sql Server 2008,Tsql,Record Locking,这可能是一个非常愚蠢的问题,但正如俗话所说,“唯一愚蠢的问题是你没有问的问题” 我有一个SQL Server 2008数据库,我想锁定一条记录进行编辑。但是,另一个用户可能希望同时查看该记录中的信息。所以,我希望第一个人能够锁定记录,因为他们是唯一可以编辑记录的人。但是,如果其他用户愿意,我仍然希望他们看到这些数据 这一切都是从C#前端完成的,因为它将出现在我们的内部网上。不要自己锁定-让SQL Server自己处理 只要您只选择,,您就可以在一行上放置一个所谓的共享锁-其他想要读取该行的用户也

这可能是一个非常愚蠢的问题,但正如俗话所说,“唯一愚蠢的问题是你没有问的问题”

我有一个SQL Server 2008数据库,我想锁定一条记录进行编辑。但是,另一个用户可能希望同时查看该记录中的信息。所以,我希望第一个人能够锁定记录,因为他们是唯一可以编辑记录的人。但是,如果其他用户愿意,我仍然希望他们看到这些数据


这一切都是从C#前端完成的,因为它将出现在我们的内部网上。

不要自己锁定-让SQL Server自己处理

只要您只选择
,您就可以在一行上放置一个所谓的共享锁-其他想要读取该行的用户也可以这样做


只有当您的代码转到更新行时,它才会在该行上放置一个独占锁,以便能够更新该行。在这段时间内,在您提交事务之前,其他用户无法读取您正在更新的一行

读者还可以使用

set transaction isolation Level read uncommitted 

语句强制读取忽略可能存在的任何锁(Sch-M、模式修改、锁除外)。对于不需要绝对再现性的报告,这也是一个有用的设置,因为它可以显著保持这些报告的性能。对于

,除了现有答案外,您还可以启用快照隔离。这为事务提供了一个用于读取的数据库时间点快照。此事务根本不会锁定数据。它不会阻塞。

Ya,不用说,如果这类问题引起任何关注,您希望启用事务模式(而不是自动提交)。@ebyrob:不一定-如果您不执行显式事务,那么每个t-SQL语句都会在其自己的隐式事务中运行。我不记得t-SQL事务的所有奇怪之处,但我确实记得,当我最后一次使用自动提交时,它通常是一个可怕且不可预测的地方。(隐式事务仍然或多或少地手动提交自动提交是完全不同的,而且比这更混乱)您所说的编辑锁定是什么意思?是简单锁定更新的持续时间(几毫秒),还是您希望锁定用户编辑该实体的文本字段的时间(可能永远不会结束)?直到提交为止。我想marc_s给了我一个很好的解释,所以我将继续介绍这些信息。这句话:
我希望第一个进入的人能够编辑记录
听起来像是在谈论用户身份验证,而不是DB行锁定。@ebyrob-不是身份验证,因为第一个人是谁并不重要。我只希望不止一个人能够查看它,而只有第一个打开它的人(不管它是谁)才是唯一可以编辑记录的人。@JohnnyBones哦,好的,
first person**in**
,用于该迭代。我会误读重读。(a)请注意,您可能正在读取最终未提交到数据库的数据!而且:(b)这对所有锁都没有帮助-如果您有一个
Sch-M
(模式修改)锁,那么
读取未提交的
仍将停止,并且不会实际读取数据…@marc_s:我通常认为Sch-M锁在生产数据库中非常罕见。在一个基于分类账的会计软件包中,情况(a)即使不是非常罕见,也是不寻常的。没错——我就是忍不住,因为你写了“忽略任何可能存在的锁”——这有点过于乐观了——它将忽略大多数锁……@marc_s:谢谢——新的改进答案现在可用了。”)