【发布时间】:2010-10-24 15:51:37
【问题描述】:
创建 SQL Server 事务时,如果不指定表提示,会锁定什么?为了锁定某些东西,您必须始终使用表格提示吗?您可以在事务之外(即在普通查询中)锁定行/表吗?我了解锁定的概念以及您为什么要使用它,我只是不确定如何在 SQL Server 中实现它,任何建议表示赞赏。
【问题讨论】:
标签: sql-server concurrency transactions
创建 SQL Server 事务时,如果不指定表提示,会锁定什么?为了锁定某些东西,您必须始终使用表格提示吗?您可以在事务之外(即在普通查询中)锁定行/表吗?我了解锁定的概念以及您为什么要使用它,我只是不确定如何在 SQL Server 中实现它,任何建议表示赞赏。
【问题讨论】:
标签: sql-server concurrency transactions
您应该仅在万不得已时才使用查询提示,即便如此,也只能在专家分析之后使用。在某些情况下,它们会导致查询性能不佳。因此,除非您真的知道自己在做什么,否则请避免使用查询提示。
每次执行查询时都会自动发生(各种类型的)锁定(除非指定了 NOLOCK)。默认事务隔离级别为READ COMMITTED
你实际上想做什么?
【讨论】:
“您能否在事务之外(即在普通查询中)锁定行/表?”
您最好了解 SQL Server 中没有普通的查询或操作,它们都是事务性的,没有任何例外。这就是 ACID-ness 是如何实现的,例如,参见 [1]。如果客户端工具或开发人员以交互方式未使用 BEGIN TRANSACTION 和 COMMIT/ROLLBACK 显式指定事务,则使用隐式事务。
此外,事务不是锁定/锁定参与的同义词。有很多机制可以在没有锁定的情况下控制并发(例如,版本控制等)以及 READ UNCOMMITTED 事务“隔离”(在这种情况下,没有任何隔离)级别根本无法控制它。
更新2:
为了锁定某些东西,你必须总是使用表格提示吗?
就事务隔离级别而言,不是 READ UNCOMMITTED 或行版本控制(快照)隔离级别之一,例如,默认 READ COMMITTED 或由设置,例如,
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
锁已发出(我不知道从哪里开始以及如何结束这个话题[2])。可在语句中使用的表提示会覆盖这些设置。
[1]
保罗·S·兰德尔。了解 SQL Server 中的日志记录和恢复
什么是日志记录?
http://technet.microsoft.com/en-us/magazine/2009.02.logging.aspx#id0060003
[2]
单击此链接后插入尾随 )
http://en.wikipedia.org/wiki/Isolation_(database_systems)
更新:
5 分钟前,我的声望为 784(与 24 小时前相同),现在,没有任何明显的反对票,它降至 779。
如果我被 meta.stackoverflow.com 禁止,我在哪里可以问这个问题?
【讨论】: