什么是脏读

脏读(或未提交读)是由开放事务修改的行的读。

可以通过使用 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