当前位置: 首页 > 知识库问答 >
问题:

是否可以在事务中使用SELECT语句锁定SQLSERver

郑燕七
2023-03-14

是否可以在 SQL SERVER 中的事务中使用 SELECT 语句锁定行?我想锁定该行,以便外部的其他事务无法访问该行。

提交或回滚事务后,应释放该行。这就是我的意思。。。

BEGIN TRANSACTION TRAN1

SELECT * FROM HR.Employees WITH (UPDLOCK) WHERE empid=1
...
...
...
...
COMMIT TRANSACTION

有人有建议吗?我应该执行 UPDATE 语句来锁定该行吗?

请不要将此问题标记为重复问题。因为,我不是在问UPDATE语句,而是在问SELECT

编辑:我试图“设置事务隔离级别串行化”,但这锁定了太多东西。我的SP很大,它有很多SELECT语句。”“SET TRANSACTION ISOLATION LEVEL SERIALIZABLE”锁定SP中所有SELECT的行。但是,我只想锁定一个表中的行。

共有2个答案

令狐烨烨
2023-03-14

我想HOLDLOCK表提示就是你要找的。从文档中:

HOLDLOCK相当于SERIALIZABLE。有关更多信息,请参见本主题后面的可序列化。HOLDLOCK只适用于为其指定的表或视图,并且只在使用它的语句所定义的事务期间有效。在包含FOR BROWSE选项的SELECT语句中不能使用HOLDLOCK。

柳项明
2023-03-14

UPDATE锁是一种特殊的锁,当更新语句搜索要更新的行时使用。它与SHARED锁兼容,因此它提高了并发性,并且在转换为XLOCK时最大限度地减少了转换死锁的机会。

您可以在SELECT语句中对表使用XLOCK提示,但请注意,根据索引和数据的物理路径,它的锁定可能会超出预期。

此外,使用RCSI,它不会阻止读者。

在这里使用一些其他应用程序控制的逻辑可能会更好,而不是依赖SQL服务器的锁定机制。

 类似资料:
  • 问题内容: 到目前为止,我已经写了Aggregate函数,后跟Group By子句,以基于SUM,AVG和其他Aggregate函数查找值。我对Group By子句有些困惑。当我们使用Aggregate函数时,我需要在Group By子句中指定哪些列。否则,有没有使用Group By子句的方法来使用Aggregate函数。 问题答案: SELECT子句中没有聚合的所有列都必须位于GROUP BY中

  • 问题内容: 我正在尝试对输入的SQL字符串进行一些基本验证。我想确保查询的第一个单词是否则将引发错误。这里有些例子: 和其他各种。也许这更多是一个正则表达式解决方案或string.replace。但是,查看是否已输入SQL SELECT语句的一种好方法是什么? 问题答案: 我将为作业使用适当的工具-SQL解析器,获取第一个语句对象,并检查其类型是否正确:

  • 问题内容: 我对对象使用开关盒有疑问: 例如:我的问题可以用Java复制: 如何使用实施? 问题答案: 这是子类型多态性有帮助的典型方案。请执行下列操作 然后,你可以简单的调用上。 如果你不能随意更改,和,则可以应用访问者模式来实现相同目的。

  • 问题内容: 我只想在运行操作系统早于的设备上执行代码块。我不能: 我现在使用的解决方案是: ,但感觉笨拙。还有另一种方法可以用Swift优雅地否定声明吗? 问题答案: 语句周围没有逻辑。 实际上,编译器使用该语句来推断可以在其包含的范围内调用哪些方法,因此在运行时无法执行有条件地执行该块的操作。 可以使用逗号组合条件,如下所示

  • 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 MyS

  • 问题内容: 可以从python中的单行方法返回 寻找这样的东西 尝试过,并且语法无效 我可以轻松做到: 但只是好奇我是否可以将上述if语句合并为一行 问题答案: 可以在一行上编写标准的“ if”语句: 但是pep 8样式指南建议不要这样做: 通常不建议使用复合语句(同一行上有多个语句)