Sql 启用此多读卡器解决方案的适当隔离级别是什么?

Sql 启用此多读卡器解决方案的适当隔离级别是什么?,sql,sql-server,database,Sql,Sql Server,Database,我有一个数据库表,其中包含由多个读卡器并发处理的工作项队列,具有以下要求: 每个项目只能由一个读卡器处理。 如果某个读卡器因任何原因失败,则应将该项返回到队列,以便另一个读卡器处理。 以下是可能的解决方案的伪代码,每个读者都会执行以下操作: 我从队列中读取下一个项目,并将其存储在本地某处 2启动事务 3删除该项目,以防止其他读者看到它。如果删除失败,则意味着另一个工作人员已经提取了该项目,因此请返回步骤1 4处理步骤1中本地存储的项目。这可能会持续很长时间 5提交事务:项目删除已提交,转到步骤1

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

每个项目只能由一个读卡器处理。 如果某个读卡器因任何原因失败,则应将该项返回到队列,以便另一个读卡器处理。 以下是可能的解决方案的伪代码,每个读者都会执行以下操作:

我从队列中读取下一个项目,并将其存储在本地某处

2启动事务

3删除该项目,以防止其他读者看到它。如果删除失败,则意味着另一个工作人员已经提取了该项目,因此请返回步骤1

4处理步骤1中本地存储的项目。这可能会持续很长时间

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

6回滚事务显式回滚或读卡器故障:回滚项删除并返回到另一个读卡器的队列

我的问题是:我需要的最低隔离级别是什么,以确保在步骤3项目删除后,其他读者无法看到它?我的意思是,我希望在保持完整性的同时最大化并发性

注意,我使用的是SQLServer2005,如果有关系的话,我认为这应该是产品无关的,对吗


欢迎对这种方法的任何其他反馈。

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

每个工作项都有一列表示State,另一列表示ReaderID。状态可以是“新”、“活跃”或“完全”。我也用E'error

每个读者都有自己的ID

读取器的第一个操作是使用一条SQL语句更新状态为“N”的第一个排队项,该语句将状态设置为“A”,并为读取器本身设置读取器ID

然后读取器处理工作项,完成后,将状态设置为“C”

出于您的目的,您可以通过在一条语句中执行签出操作来避免隔离问题

SQL将类似于:

更新队列 设置状态='A',ReaderID=@myWorkerID
其中queueid=SELECT MINqueueid FROM queue WHERE state='N'

如果一旦您从“队列”机制中删除了该项目,没有进程可以访问它,那么您不需要在实际处理该项目时保持事务打开

隔离级别:

指定语句不能读取 已修改但未修改的数据 但仍由其他交易承担 没有其他交易可以做到这一点 修改用户已读取的数据 当前事务直到当前 事务完成

在所有数据上放置共享锁 按下列语句阅读: 交易和交易将一直保持到 事务完成。这防止了 其他交易不允许修改任何 已由数据库读取的行 当前交易。另外 事务可以插入 匹配的搜索条件 现任秘书长发表的声明 交易如果当前 事务然后重试该语句 它将检索新行,其中 结果是幻影读取。因为 共享锁保存在一个文件的末尾 交易,而不是被释放 在每句话的结尾, 并发性低于默认值 读取提交的隔离级别。使用 仅在必要时使用此选项


如果在查询中使用行级锁和readpass语句,则可以仅选择未锁定的行

看起来像这样

选择队列 来自具有rowlock、xlock、readpass的队列,其中state='N'


我建议您仔细阅读SQL server中的锁定提示,这将大大有助于您。

使用read COMMITTED默认值是有缺陷的。我想我们已经讨论过了。我仍然认为它没有瑕疵。你测试过了吗?我已经投了。@le dorfier:我现在已经投了反对票,但我会和一些SQL专家谈谈,然后再回复你……相反,我已经删除了downvote,我会问这个问题,然后再回复你。我坚信你错了,但我愿意学习…我也是。唯一比不知道更糟糕的是知道出了什么问题,我和任何人一样敏感。不幸的是,对很多人来说,这似乎也让你困惑。我会保持交易开放,以防读者因某种原因失败,在这种情况下,我希望删除被撤消,以便其他读者可以处理它。为什么读取提交不起作用?您发送的MSDN链接(带有read COMMITED语句)无法读取已修改但未由其他事务提交的数据。这难道不意味着当读卡器在事务中执行删除操作时,其他读卡器无法读取它吗?