【问题标题】:SQL Server transaction isolation and atomicitySQL Server 事务隔离和原子性
【发布时间】:2014-05-05 09:41:54
【问题描述】:

我的应用程序中有以下工作流程:

线程 1 执行事务 1:

BEGIN TRANSACTION
    UPDATE Items SET IsReady = 1 WHERE Id = 100
    INSERT INTO ProcessorQueue (ItemId) VALUES (100)
COMMIT TRANSACTION

线程 2 轮询 ProcessorQueue 表以获取要处理的新行。因此,它创建事务 2,在其中选择队列行,如果找到,则从 Items 表中选择相应的项目状态 (IsReady)。

有时它显示 IsReady = 0。为什么?如何解决?

两个事务级别都已读取提交。

【问题讨论】:

    标签: sql sql-server transactions isolation-level


    【解决方案1】:

    我很确定这不会像描述的那样发生,并且只有在线程 2 在read uncommitted 隔离级别下运行时才有可能。

    话虽如此,这两个语句可以写成一个,使用output子句:

    update Items
    set IsReady = 1
    output inserted.Id into ProcessorQueue
    where Id = 100
    

    【讨论】:

    • T1 中的第二条语句确实在单独的上下文中运行。
    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多