Sql-Server

為什麼 NOLOCK 是這樣實現的?

  • February 23, 2017

最近我NOLOCK在 SQL Server 中搜尋了選項。我發現,當事務在表上處於活動狀態時,SQL Server 甚至不允許從特定表中讀取,直到事務送出或回滾(據我所知,當你應該使用“with (無鎖)”)。

同時,其他 RDBMS,例如 PostgreSQL,允許您從具有活動寫入事務的行中讀取值。他們只會給你在寫作之前的價值觀。特別是這似乎是 PostgreSQL MVCC 的行為(正如我從第 13 章的介紹中了解到的那樣。並發控制)。

我有這個迫切的問題。為什麼在 SQL Server 中可能出現死鎖,而在其他 RDBMS 中,您只是在寫入新值之前獲得舊值?

注意:我問是因為我可能理解不正確。

預設情況下,SQL Server 在Read Committed隔離狀態下執行。

如果您希望 SQL Server 的行為更像其他實現,那麼您正在尋找的是Read Committed Snapshot Isolation, 或Snapshot Isolation.

你可以在這裡閱讀更多關於它們的資訊。

全面披露,我是 Brent Ozar Unlimited 的員工

使用NOLOCKorRead Uncommitted通常不適合用於嚴重的生產用途,因為它可能在修改查詢正在進行時允許臟讀和其他意外工件。

要決定如何管理您的阻塞問題,請先閱讀:

SET TRANSACTION ISOLATION LEVEL (Transact-SQL) 如果您閱讀了這篇 MSDN 文章,您會發現有幾種不同的配置來管理如何使用您的數據和吞吐量。

在高度活躍的伺服器上,我使用了Read Committed Snapshot Isolation,但通常Read Committed隔離對於壓力較小的系統就足夠了。

你做出的每一個決定都有副作用。

引用自:https://dba.stackexchange.com/questions/165216