【问题标题】:SQL SERVER 2008 R2 Transaction Snapshot Isolation Level Not Working As ExpectedSQL SERVER 2008 R2 事务快照隔离级别未按预期工作
【发布时间】:2013-04-04 17:19:49
【问题描述】:

我创建了一个名为“test_isolation”的数据库并创建了一个包含数据的表“人”

name    age
----    ---
test1    1
test2    2
test3    3
test4    4
test5    5
test6    6

现在数据库已更改为允许在 session1

中进行快照隔离
ALTER DATABASE test_isolation
SET ALLOW_SNAPSHOT_ISOLATION ON
GO 

现在我在 会话 2

中创建一个事务
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRAN
SELECT * FROM PERSON
GO
DELETE FROM PERSON WHERE name = 'test6'
GO
SELECT * FROM PERSON
GO

结果符合预期。 (注意我们还没有提交这个交易!)

现在我在 session 3

中执行以下查询
SELECT * FROM PERSON

会话 3 中的查询继续无限运行,这意味着表已锁定。

如果我返回会话 2 并提交事务。我可以在会话 3 上运行查询,结果符合预期。

事务隔离级别SNAPSHOT不应该锁定表吧?是我做错了什么还是我对事务SNAPSHOT隔离的理解有误?

请帮忙..

【问题讨论】:

    标签: sql-server sql-server-2008 tsql transaction-isolation


    【解决方案1】:

    您必须在会话 3 中显式声明 SET TRANSACTION ISOLATION LEVEL SNAPSHOT,否则会话 3 仍将作为 READ_COMMITTED 运行并阻止更新。

    也可以在数据库级别设置此选项,以将 READ_COMMITTED 替换为 SNAPSHOT。

    ALTER DATABASE MyDatabase
    SET READ_COMMITTED_SNAPSHOT ON
    

    【讨论】:

    • +1 来自msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx: Setting the READ_COMMITTED_SNAPSHOT ON option allows access to versioned rows under the default READ COMMITTED isolation level. If the READ_COMMITTED_SNAPSHOT option is set to OFF, you must explicitly set the Snapshot isolation level for each session in order to access versioned rows.
    猜你喜欢
    • 2014-09-27
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多