可序列化隔離級別對 DDL 語句有什麼影響?
我正在使用 Red Gate SQL Compare 根據 SVN 和數據庫之間的差異創建發布腳本。這會生成一個包含大量表和過程更改的腳本,並且執行良好。然而,讓我感到困惑的一件事是,它使用了可序列化的事務隔離級別。
我知道它對 dml 語句有什麼作用,但我不確定它對 ddl 意味著什麼。有人可以啟發我,也許有一個例子?
我相信它對 DDL 的意義與對 DML 的意義相同。關於該主題的msdn 文章實際上在該部分下為您提供了一個非常清晰的想法
SERIALIZABLE
:此選項與在事務中的所有 SELECT 語句中的所有表上設置 HOLDLOCK 具有相同的效果。
基本上只要您的事務正在執行,就不能對您直接或間接引用的任何對象執行 DDL。
我知道它對 dml 語句有什麼作用,但我不確定它對 ddl 意味著什麼。
一般來說,不多。
DDL 包含大量操作(其中許多都有自己的特殊行為),但大多數 DDL 將
Sch-M
在命令執行期間或在關鍵階段(例如在大多數線上索引建構的結束)。這是限制性最強的鎖類型,可以在任何隔離級別防止任何類型的並發訪問。即使在沒有被佔用的地方,引擎也會在適當的時間
Sch-M
小心地使用正確的鎖,以確保最終結果是正確的。例如,不可能建立一個不能準確反映基礎數據的索引。無論使用者指定的任何會話隔離級別如何,以上所有內容均適用。
就元數據的更改(即視圖等底層視圖的系統結構
sys.tables
)而言,雖然 SQL Server 自動確保正確更改,但僅完全支持並保證在預設鎖定READ COMMITTED
隔離級別下尊重使用者訪問。引用元數據訪問、隔離級別和鎖定提示(已添加重點):
SQL Server 不保證在通過目錄視圖、兼容性視圖、資訊架構視圖、生成元數據的內置函式訪問元數據的查詢中會遵守鎖定提示。
***在內部,SQL Server 數據庫引擎只尊重
READ COMMITTED
元數據訪問的隔離級別。***例如,如果事務具有隔離級別,SERIALIZABLE
並且在事務內,嘗試使用目錄視圖或發出元數據的內置函式來訪問元數據,則這些查詢將一直執行,直到它們以READ COMMITTED
. 但是,在快照隔離下,訪問元數據可能會因為並發 DDL 操作而失敗。這是因為元數據沒有版本化。因此,在快照隔離下訪問以下內容可能會失敗:
- 目錄視圖
- 兼容性視圖
- 資訊模式視圖
- 生成元數據的內置函式
sp_help
儲存過程組- SQL Server Native Client 目錄過程
- 動態管理視圖和功能
從同一頁面:
下表提供了各種隔離級別下的元數據訪問摘要。
儘管沒有得到保證或支持,但在隔離下訪問元數據(例如目錄視圖、DMV)
READ UNCOMMITTED
以避免阻塞問題可能很重要。大多數工具和診斷腳本都大量使用READ UNCOMMITTED
隔離(通常使用同義但名稱誤導的NOLOCK
提示)。例如,請參閱Glenn Berry 的診斷查詢。作為不尊重
READ UNCOMMITTED
訪問的範例,請參閱元數據函式應遵循與關於連接和壞習慣的元數據查詢相同的隔離語義:使用 Aaron Bertrand 的(某些)元數據“幫助器”函式。甚至不尊重以高於已送出讀取的隔離度訪問元數據- 將使用
READ COMMITTED
隔離語義讀取資訊。如果我不得不猜測,我會說問題中的比較工具將隔離設置
SERIALIZABLE
為覆蓋生成腳本中的任何 DML。