什麼是髒讀

髒讀(或未提交讀)是由開放事務修改的行的讀。

可以通過使用 2 個單獨的查詢來複制此行為:一個用於開啟事務並將一些資料寫入表而不提交,另一個用於選擇要使用此隔離級別寫入(但尚未提交)的資料。

查詢 1 - 準備事務但未完成事務:

CREATE TABLE dbo.demo (
    col1 INT,
    col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
    INSERT INTO dbo.demo(col1, col2) 
    VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here

查詢 2 - 讀取包括開啟事務的行:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;

返回:

col1        col2
----------- ---------------------------------------
99          Normal transaction
42          Dirty read

PS:別忘了清理這個演示資料:

COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO