我的应用程序中有以下工作流程:
线程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.为什么?如何解决?
两个事务级别都被读取提交。
答案 0 :(得分:1)
我非常确定这不会像所描述的那样发生,而且只有当线程2在read uncommitted
隔离级别下运行时才有可能。
话虽如此,这两个语句可以用output
子句写成一个:
update Items
set IsReady = 1
output inserted.Id into ProcessorQueue
where Id = 100