Sql-Server
未送出的事務更新列;不同的交易如何看到舊的列值?
讓我們假設以下情況。
有一個
students
表:編號 | 姓名 ----------------- 1 | 馬特烏斯
“使用者 A”在不送出事務的情況下執行以下語句:
update students set name = 'Gustavo' where id = 1
然後“使用者 B”執行以下查詢:
select * from students with (nolock) where id = 1
使用者 B 將獲得 name
Gustavo
,這是預期的行為。DB會因為with(nolock)
指令返回未送出的值。
Mateus
即使有未送出的事務,有沒有辦法獲取舊名稱(先前送出的值)?
您可以在數據庫上使用 Read Committed Snapshot Isolation (RCSI),它使用 TempDB 中的空間來跟踪數據的已送出版本。
請注意,RCSI 為每個版本化的行添加 14 個字節,因此您可能會在數據庫中看到一些額外的頁面拆分。它還要求監視 TempDB 的空間和 I/O,以確保它不會減慢速度。
閱讀更多由Paul White和在這個問題中。