共用方式為


記憶體優化數據表中的交易隔離等級

存取記憶體優化數據表的交易支援下列隔離等級。

  • 快照

  • 可重複讀取

  • 可序列

  • READ COMMITTED(已讀取提交)

交易隔離等級可以指定為原生編譯預存程序的原子區塊。 如需詳細資訊,請參閱 CREATE PROCEDURE (Transact-SQL)。 從解譯的 Transact-SQL 存取記憶體優化數據表時,可以使用數據表層級提示來指定隔離等級。

當您定義原生編譯預存程式時,必須指定交易隔離等級。 從解譯型 Transact-SQL 中的使用者交易作業存取記憶體優化資料表時,您必須在資料表提示中指定隔離等級。 如需詳細資訊,請參閱 使用 Memory-Optimized 數據表的交易隔離等級指導方針

具有自動提交交易的記憶體優化數據表支援隔離等級 READ COMMITTED。 READ COMMITTED 在使用者交易或原子區塊中無效。 READ COMMITTED 不支援明確或隱含的使用者交易。 只有在查詢未存取任何磁碟數據表時,具有自動提交交易的記憶體優化數據表才支援隔離等級READ_COMMITTED_SNAPSHOT。 此外,使用解譯標記 Transact-SQL 並以 SNAPSHOT 隔離開始的交易,無法存取記憶體優化的資料表。 使用解譯 Transact-SQL 搭配 REPEATABLE READ 或 SERIALIZABLE 隔離的交易必須使用 SNAPSHOT 隔離來存取記憶體優化數據表。 如需此案例的詳細資訊,請參閱 跨容器交易

READ COMMITTED 是 SQL Server 中的預設隔離等級。 當工作階段的隔離等級為 READ COMMITED (或更低層級)時,您可以執行下列其中一項作業:

  • 明確使用較高的隔離等級提示來存取記憶體優化數據表(例如WITH(SNAPSHOT))。

  • 指定 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT set 選項,這會將記憶體優化數據表的隔離等級設定為 SNAPSHOT(就如同您已將 WITH(SNAPSHOT)提示包含在每一個記憶體優化數據表中一樣)。 如需更多詳細資訊MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT,請參閱ALTER DATABASE SET 選項(Transact-SQL)

或者,如果會話的隔離等級是 READ COMMITTED,您可以使用自動提交交易。

在解譯 Transact-SQL 中啟動的 SNAPSHOT 交易無法存取記憶體優化數據表。

記憶體優化數據表所支援的交易隔離等級提供與磁碟數據表相同的邏輯保證。 用來提供隔離等級保證的機制不同。

針對磁碟數據表,大部分的隔離等級保證都是使用鎖定來實作,這可防止透過封鎖發生衝突。 針對記憶體優化數據表,會使用衝突偵測機制強制執行保證,以避免需要鎖定。 例外狀況是磁碟數據表上的 SNAPSHOT 隔離。 這是透過衝突偵測機制,在記憶體優化的資料表上實施 SNAPSHOT 隔離的類似方法。

快照
此隔離等級指定交易中任何語句所讀取的數據,將會是交易開始時所存在之數據的交易一致版本。 交易只能識別在交易開始之前已提交的數據修改。 在當前交易開始後,其他交易所做的數據修改,在當前交易中執行的語句中是不可見的。 交易中的語句會取得已認可數據在交易開始時的狀態快照。

寫入作業(更新、插入和刪除)一律與其他交易完全隔離。 因此,SNAPSHOT 交易中的寫入作業可能會與其他交易的寫入作業衝突。 當目前交易嘗試更新或刪除一筆已被其他在此交易啟動後提交的交易更新或刪除的資料列時,該交易會以下列錯誤訊息終止。

錯誤 41302。 目前交易嘗試更新自此交易開始以來已更新的數據表 X 中的記錄。 交易已中止。

當目前交易嘗試插入一行,而該行的主鍵值已由另一個已提交的交易插入時,交易將無法提交並出現下列錯誤訊息。

錯誤 41325。 目前的交易無法認可,因為可序列化驗證失敗。

如果一筆交易寫入到在交易認可之前被刪除的資料表,交易就會以下列錯誤訊息終止:

錯誤 41305。 目前的交易無法認可,因為可重複的讀取驗證失敗。

可重複讀取
此隔離等級包含 SNAPSHOT 隔離等級所提供的保證。 此外,REPEATABLE READ 保證交易讀取的任何資料列,在交易提交時該資料列尚未被任何其他交易變更。 交易中的每個讀取作業最多可重複到交易結尾。

如果目前交易已讀取任何資料列,而該資料列已被在目前交易之前已提交的其他交易更新,那麼提交會失敗,並出現下列錯誤訊息。

錯誤 41305。 目前的交易無法認可,因為可重複的讀取驗證失敗。

可序列化
此隔離等級包含 REPEATABLE READ 所提供的保證。 快照集與交易結尾之間沒有出現虛設的數據列。 虛設數據列符合選取、更新或刪除的篩選條件。

交易的執行方式就像沒有並行交易一樣。 所有動作幾乎都發生在同一序列化點(提交時間)。

如果違反上述任何保證,交易將無法完成,並出現下列錯誤訊息:

錯誤 41325。 目前的交易無法認可,因為可序列化驗證失敗。

另請參閱

瞭解 Memory-Optimized 數據表上的交易
具有 Memory-Optimized 數據表的交易隔離等級指導方針
Memory-Optimized 數據表上交易的重試邏輯指導方針