SQL Server 事务/并发混乱 - 你必须总是使用表提示吗?

Posted

技术标签:

【中文标题】SQL Server 事务/并发混乱 - 你必须总是使用表提示吗?【英文标题】:SQL Server transactions / concurrency confusion - must you always use table hints? 【发布时间】:2010-10-24 15:51:37 【问题描述】:

创建 SQL Server 事务时,如果不指定表提示,会锁定什么?为了锁定某些东西,您必须始终使用表格提示吗?您可以在事务之外(即在普通查询中)锁定行/表吗?我了解锁定的概念以及您为什么要使用它,我只是不确定如何在 SQL Server 中实现它,任何建议表示赞赏。

【问题讨论】:

【参考方案1】:

您应该仅在万不得已时才使用查询提示,即便如此,也只能在专家分析之后使用。在某些情况下,它们会导致查询性能不佳。因此,除非您真的知道自己在做什么,否则请避免使用查询提示。

每次执行查询时都会自动发生(各种类型的)锁定(除非指定了 NOLOCK)。默认事务隔离级别为READ COMMITTED

你实际上想做什么?

Understanding Locking in SQL Server

【讨论】:

你实际上想做什么? - 我从来没有真正需要做很多事务性或高度并发的 SQL 工作,但看起来我可能很快就得做我只是想掌握我需要理解的广泛概念..【参考方案2】:

“您能否在事务之外(即在普通查询中)锁定行/表?”

您最好了解 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.***.com 禁止,我在哪里可以问这个问题?

【讨论】:

你为什么被禁止进入meta?我想可能是有人取消了对您的一个答案的赞成票(不是我)

以上是关于SQL Server 事务/并发混乱 - 你必须总是使用表提示吗?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server并发和事务

Microsoft SQL Server中的事务(转载)

SQL Server 事务与锁

SQL SERVER中,多个事物间同是并发操作数据时,会发生事务之间数据读取不一致的 情况,

关于SQL Server事务日志的问题汇总

SQL Server 事务与锁