SQL Server事务隔离和原子性

时间:2014-05-05 09:41:54

标签: sql sql-server transactions isolation-level

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

线程1执行事务1:

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

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

有时它会读取IsReady = 0.为什么?如何解决?

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

1 个答案:

答案 0 :(得分:1)

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

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

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