Sql-Server

為什麼 - 如果 tempdb 數據庫空間不足,讀取但不更新操作會失敗?

  • December 13, 2013

MSDN 線上文章“ Choosing Row Versioning-based Isolation Levels ”指出:

  • " tempdb必須有足夠的磁碟空間用於版本儲存。如果有非常長時間執行的事務,則必須將更新事務在此期間生成的所有版本保存在tempdb. 如果tempdb空間不足,更新操作不會失敗,而是讀取使用行版本控制的操作可能會失敗”

你能解釋一下為什麼嗎?

考慮到(引用同一篇文章):

  • “當READ_COMMITTED_SNAPSHOTALLOW_SNAPSHOT_ISOLATION數據庫選項為 ON 時,特定數據庫的更新和刪除事務必須維護行版本,即使沒有使用基於行版本控制的隔離級別的事務……因為記錄版本儲存在tempdb中”

也就是說,更新(但不是讀取)操作需要空間來進行行版本控制,IMO 應該由於空間不足而失敗。

如果它們不需要tempdb中的版本儲存,為什麼讀取操作會失敗?

(將我的評論轉換為答案。我不知道這是否是確定的,但這對我來說很有意義。如果你能證明它是錯誤的,請在評論中告訴我。)

實際上並不需要行版本來完成寫操作;只有出現並需要這些版本的行的讀者才需要它們。如果他們需要的話。

如果tempdb在版本生成過程中空間不足,雖然這不好,但如果沒有讀者需要這些版本,它可能最終會解決。僅當讀取操作需要不在tempdb.

此外,出於顯而易見的原因,任何寫操作都被認為比 a 更重要SELECT(與死鎖監視器確定在死鎖時要終止哪個程序的想法相同),因此SELECT如果可能,最好使 a 失敗。

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