為什麼 NOLOCK 是這樣實現的?
最近我
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 的員工
使用
NOLOCK
orRead Uncommitted
通常不適合用於嚴重的生產用途,因為它可能在修改查詢正在進行時允許臟讀和其他意外工件。
要決定如何管理您的阻塞問題,請先閱讀:
SET TRANSACTION ISOLATION LEVEL (Transact-SQL) 如果您閱讀了這篇 MSDN 文章,您會發現有幾種不同的配置來管理如何使用您的數據和吞吐量。
在高度活躍的伺服器上,我使用了Read Committed Snapshot Isolation,但通常Read Committed隔離對於壓力較小的系統就足夠了。
你做出的每一個決定都有副作用。