2

在此处输入图像描述我一直在寻找解决方案,但到目前为止还没有运气。

描述:我(在公司中的意思是我)有一个存储过程,可以完成一些相当快速和小型的工作。让我们称之为 SP_Small。它很小,它有一个更新并执行另一个存储过程。因此,试图通过将 SELECTS 和 UPDATES 组合到一个选择中来使其具有原子性并不是真正可行的。(我偶然发现了一个建议的解决方案)

我们有一个导入机制,将几个不同的文档并行导入数据库。每个导入都在一个事务中(由启动导入的应用程序完成)。每次导入都会调用 SP_Small 来执行一些导入和工作。

问题:现在,SP_Small 实际上是原子的,但是它访问的记录(并且是共享的)在提交外部事务之前保持锁定,使得整个过程串行,而不是并行。

要求:使 SP_Small 原子化,确保只有一个进程同时执行它,但在它执行之后,其余的可以并行运行。

这是问题的简单(和丑陋:))绘图,希望有助于澄清:

4

2 回答 2

1

从它的进程的外部事务中实现自治SP_Small是一种选择,但它不是唯一的选择,也可能不是首选的选择。

另外两个选项是 1) 更改SP_Small以便它可以执行其功能而不会自阻塞或“序列化”。这通常是首选选项。

或者 2) 更改隔离级别,使其不再自阻塞。当然,如果不进一步了解SP_Small它以及为什么它当前正在序列化,我们就无法评估其中任何一个的工作能力。

这些也不一定是唯一的选择,同样取决于这里真正发生的事情以及这里真正需要发生的事情的细节。

于 2013-10-18T13:25:52.227 回答
0

您是否需要SP_Small在“外部事务”开始时运行?进程 1 阻止进程 2 的原因是因为进程 1 将对它更新的任何行持有一个排他锁,直到它提交为止。排他锁甚至阻止其他事务读取那些锁定的行。您可以SP_Small在长导入机制之后运行还是会影响导入结果?这样做将使每个进程锁定行的时间要短得多。如果这不可能,您是否可以在调用后立即提交事务SP_Small并在导入机制失败时以其他方式撤消它?

于 2013-10-18T22:00:52.400 回答