gpt4 book ai didi

sql - 启用此多读取器解决方案的适当隔离级别是多少?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:02 24 4
gpt4 key购买 nike

我有一个数据库表,其中包含多个读取器并发处理的工作项队列,具有以下要求:

  • 每个项目只能由一个读者处理。
  • 如果读取器因任何原因失败,则应将项目返回队列以供其他读取器处理。

这是一个可能的解决方案的伪代码,每个读者都会做以下事情:


1) 从队列中读取下一项并将其存储在本地某处。

2) 开始交易

3) 删除项目,以防止其他读者看到它。如果删除失败,则说明其他工作人员已经拉取了该项目,因此返回步骤 1。

4) 处理项目(在步骤 1 中存储在本地)。这可能会运行很长时间。

5) COMMIT TRANSACTION : 项目删除已提交,转到步骤 1 处理下一个项目

6) ROLLBACK TRANSACTION(显式回滚或读取器故障):项目删除被回滚并返回到另一个读取器的队列


我的问题是:我需要确保在第 3 步(项目删除)之后其他读者看不到它的最低隔离级别是多少?最低,我的意思是我想在保持完整性的同时最大限度地提高并发性。

请注意,如果重要的话,我使用的是 SQL Server 2005(我认为这应该与产品无关,对吧?)

一般而言,欢迎对此方法提出任何其他反馈。

最佳答案

我使用的另一种处理方法是:

  1. 每个工作项都有一列用于 State,另一列用于 ReaderID。状态可以是"new"、“事件”或“完成”。 (我也用'E'rror。)

  2. 每个读者都有自己的 ID。

  3. Reader 的第一个操作是使用单个 SQL 语句更新状态为“N”的第一个排队项目,该语句将状态设置为“A”并为其自身设置 ReaderID。

  4. 然后 Reader 处理工作项,完成后将状态设置为“C”。

为了您的目的,您可以通过在一个语句中执行结帐操作来避免隔离问题。

SQL 应该是这样的:

更新队列
SET State = 'A', ReaderID = @myWorkerID
WHERE queueid = (SELECT MIN(queueid) FROM queue WHERE state = 'N')

关于sql - 启用此多读取器解决方案的适当隔离级别是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/608852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com