設定隔離級別的示例

設定隔離級別的示例:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM Products WHERE ProductId=1;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; --return to the default one
  1. READ UNCOMMITTED - 表示當前事務中的查詢無法從另一個尚未提交的事務中訪問修改後的資料 - 沒有髒讀! 但是,不可重複的讀取和幻像讀取是可能的,因為資料仍然可以被其他事務修改。

  2. REPEATABLE READ - 意味著當前事務中的查詢無法從另一個尚未提交的事務中訪問修改後的資料 - 沒有髒讀! 在完成之前,沒有其他事務可以修改當前事務正在讀取的資料,從而消除了 NONREPEATABLE 讀取。但是,如果另一個事務插入 NEW ROWS 並且查詢執行了一次以上,那麼幻像行可以從第二次讀取開始出現(如果它與查詢的 where 語句匹配)。

  3. SNAPSHOT - 只能返回查詢開頭存在的資料。確保資料的一致性。它可以防止髒讀,不可重複的讀取和幻像讀取。要使用它 - 需要 DB 配置:

ALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON;GO;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
  1. READ COMMITTED - SQL 伺服器的預設隔離。它可以防止在提交之前讀取由另一個事務更改的資料。它在表上使用共享鎖定和行版本控制,以防止髒讀。它取決於資料庫配置 READ_COMMITTED_SNAPSHOT - 如果啟用 - 使用行版本控制。啟用 - 使用此:
ALTER DATABASE DBTestName SET ALLOW_SNAPSHOT_ISOLATION ON;GO;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --return to the default one
  1. SERIALIZABLE - 使用獲取並保持到事務結束的物理鎖,這可以防止髒讀,幻讀,不可重複讀。但是,它會影響 DataBase 的效能,因為併發事務是序列化的並且是逐個執行的。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;