这会是脏读的例子吗?
T1 & T2 交易
SET IMPLICIT_TRANSACTIONS OFF
这不是脏读。详细信息在这里:隐式交易
要获得脏读,您需要将 select column1 from dbo.table1 WITH (NOLOCK)。With (NOLOCK) 读取未提交的数据,如果事务以某种方式回滚,这些数据可能会消失并且永远不会真正存在。
另一种获得脏读的方法是使用:隔离级别读未提交。
这是一个如何通过查看构建“脏读”的示例MyCleanTable
Id | Value
----------
1 | I am clean!
2 | I am clean!
使用未提交的隔离级别执行简单查询 transaction_a
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
SELECT * FROM [MyCleanTable]
输出:
Id | Value
----------
1 | I am clean!
2 | I am clean!
使用 transaction_b 使用脏值更新表:
BEGIN TRAN
UPDATE [ConcurrencyDemo].[dbo].[MyCleanTable]
SET [Value] = 'I am dirty'
WHERE [Id] = 1
在 transaction_a 中执行另一个查询并提交它:
SELECT * FROM [ConcurrencyDemo].[dbo].[MyCleanTable]
COMMIT;
输出:
Id | Value
----------
1 | I am dirty! ------> "dirty read"
2 | I am clean!
回滚 transaction_b 的更新:
ROLLBACK;
在这个阶段,表被回滚到它的原始值:
Id | Value
----------
1 | I am clean!
2 | I am clean!
但是第 3 节的查询正在读取一个脏值。