隔离级别和锁之间的关系

3
我正在尝试理解孤立级别(Isolation Levels)(http://msdn.microsoft.com/en-GB/library/ms173763.aspx)和锁定(Locks)(http://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx)之间的关系。我在这里读到了一个类似的问题,回答者说:

“锁是实现细节。如果您的交易包含一个SELECT语句:”

SELECT * FROM SomeTable

您只需要关心从SomeTable中看到的数据。但是,如果我们不必担心这些问题,为什么还要有表提示(http://msdn.microsoft.com/en-us/library/ms187373.aspx)?我们需要考虑锁定吗?
1个回答

2

嗯,锁在某种程度上是实现细节。它们(在SQL Server中)用于提供标准所提供的隔离级别所给出的保证。例如,SERIALIZABLE会为您提供类似单线程访问数据库的访问方式。这是通过对读取的所有数据进行S锁定以冻结它来实现的。

锁并不纯粹是细节,因为锁定方案的详细信息会泄漏出来。它们是可检测的。此外,您可以使用提示来控制锁定,以创建未在标准中指定的行为。通常,人们会这样做以获得比以前更强的保证。


作为开发人员,可以说你大部分时间不会考虑锁吗?你只需要专注于为需求选择正确的隔离级别吗? - w0051977
一些隔离级别非常直观,而有些则不是。尽可能从高层次思考。因此,大多数情况下,隔离级别是正确的级别。我喜欢识别模式。例如,只读事务在快照隔离级别下始终最佳。低交易量通常最好保持串行化,这样您就不必考虑正确性。并发正确性并非全是或全不是。会计系统需要比博客等更多的思考。有时,您可以简单地忽略并发性,并不关心非常小的数据损坏概率。 - usr
谢谢 +1。当你说高级和低级时,你是指系统类型,比如会计系统,还是需求类型,比如在会计系统中的簿记? - w0051977
我所指的是并发策略。例如,采用只读事务快照的策略是一种非常高级的方式,可以使这些类型的事务100%安全,并消除100%的潜在阻塞问题。然而,应用UPDLOCK提示是一种非常低级的技术,很少是一个好选择。这个建议不仅关乎正确性,更关乎节省开发时间和减少错误。 - usr
最后,每种隔离类型的默认锁定类型是否有记录在某处。我找不到它。我相信我知道每种类型的默认值,但能够清楚地看到它会很好。 - w0051977
我发现文档不够充足。这不仅仅是一个默认类型。锁定的级别取决于锁定的内容和持续时间(锁定是否一直持续到事务结束?)。此外,SERIALIZABLE采用范围锁定,而其他级别则不采用(在可能的情况下)。如果您真的想知道发生了什么,请使用附加了SQL Profiler的简单语句运行。更多信息请参见:http://www.brentozar.com/isolation-levels-sql-server/ - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接