锁定 SQL Server 表以进行写入但不用于读取 [重复]

Posted

技术标签:

【中文标题】锁定 SQL Server 表以进行写入但不用于读取 [重复]【英文标题】:Lock SQL Server table for writing but not for reading [duplicate] 【发布时间】:2013-04-16 08:48:59 【问题描述】:

建议的副本没有回答标题中的问题。

我想锁定一个表,使它不能被写入,但可以被读取。这可能吗?

在与IsolationLevel.Serializable 的交易中会发生这种情况吗?还是仅适用于受影响的行? (这也是对读取的锁定吗?)

如果重要的话:我在 C# 中执行此操作。

【问题讨论】:

我想你可能想要 readuncommitted 但我不确定 使用未提交的读取时要非常小心。它不会取出共享锁。在他的情况下,使用它可能是正确的,但他必须注意脏读。 @AndyNichols 同意这意味着您可能会收到永远不会提交的返回数据。 真正的主要问题是:为什么!?!?你想达到什么目的?您可以拒绝每个人的插入、更新和删除权限 - 但是那张表有什么用呢?? @ispiro 建议的重复项回答了您的评论所说的实际 task 是您想要做的,因此它通过与您的标题不同的机制来完成它建议并不真正相关。 【参考方案1】:

您应该在表上创建一个 UNIQUE 约束。即使您设法通过第一个进程锁定表,另一个进程很可能只会被阻塞,直到第一个进程存在。

然后,您可能会开始摆弄超时,以确保第二个进程在访问表之前超时,并且您将自己打开一个痛苦的世界。

迄今为止,涵盖构成重复的任何字段的唯一约束是您的最佳选择 - 并将确保不输入重复项,据我了解,您的问题(以及详细说明 cmets)是最终目标。

【讨论】:

【参考方案2】:

不,不可能。

只有持有锁的会话才能访问表。在释放锁之前,没有其他会话可以访问它。

参考以下链接:

http://msdn.microsoft.com/en-gb/library/ms173763.aspx

【讨论】:

那个链接是 mysql 的。他想要 MSSQL。所以更合适的链接是msdn.microsoft.com/en-gb/library/ms173763.aspx 您的链接与 MySql 服务器有关 uhh..对不起,我会用适当的链接编辑 我假设您指的是IsolationLevel.Serializable - 该链接暗示该表确实没有被锁定。相反,只有某些行被锁定。这不是我要找的。我说对了吗? -1 这不是真的。可以取出表级S锁。【参考方案3】:

您可能想要查找 NOLOCK / ReadUncommitted 选项:http://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/

它可以让您从当前锁定的表中读取数据,但请注意其中的含义:您最终可能会读取“幽灵”数据,即在事务中插入然后回滚的数据。

【讨论】:

所以你说唯一的方法是真正锁定表,然后 ReadUncommitted(而不是选择性锁定)? @ispiro 如果表被锁定,那么您实际上将无法对其进行写入,但您可以使用 ReadUncommitted 从中读取。但是,您到底想达到什么目的?您是否正在考虑故意锁定桌子,如果是,出于什么原因以及锁定多长时间?可能还有其他一些方法可以研究。 我想防止两个相同的行被不同的“作者”写入。每个“作家”都会检查它想要写入的行是否不存在(在写入之前) - 但是如果两者同时检查然后同时写入 - 我会得到两个相同的行。 @ispiro 为什么不在表上创建唯一约束?然后数据库将拒绝潜在的重复。

以上是关于锁定 SQL Server 表以进行写入但不用于读取 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 aws 胶水在 sql server 中创建表/写入表吗?

SQL Server 表隔离级别和锁定问题

Sql Server并发和事务

SQL Server数据库表锁定原理以及如何解除表的锁定

浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题

更新 SQL Server 表以通过存储过程执行此操作