答案 0 :(得分:1)
这是一个如何通过查看 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 部分的查询正在读取一个脏值。
答案 1 :(得分:1)
要实现脏读,首先要执行如下命令
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
答案 2 :(得分:0)
这不是脏读。这里的详细信息如下:implicit transactions
要获取脏读,需要从dbo.table1 WITH(NOLOCK)中放入select column1。 With(NOLOCK)读取未提交的数据,如果以某种方式回滚事务,这些数据可能会消失并且永远不会存在。
获取脏读的另一种方法是使用:隔离级别读取未提交。