我一直在寻找解决方案,但到目前为止还没有运气。
描述: 我(意思是我在公司里)有一个存储过程,可以做一些相当快速和小的工作。让我们称之为SP_Small。它的fass很小,它有一个更新并执行另一个存储过程。因此,尝试通过将SELECTS和UPDATES组合成一个选择来使其成为原子并不是真的可行。 (我偶然发现了一个提议的解决方案)
我们有一个导入机制,可以将几个不同的文档并行导入数据库。 每个导入都在一个事务中(由启动导入的应用程序完成)。 每次导入都会调用SP_Small来执行一些重要的工作。
问题: 现在,SP_Small事实上是原子的,但是它访问的记录(以及共享的记录)在提交外部事务之前一直处于锁定状态,使整个进程串行,而不是并行。
要求: 使SP_Small成为原子,确保只有一个进程同时执行它,但在执行后其余进程可以并行执行。
这是一个简单的(并且可以:)绘制问题,希望有助于澄清:
答案 0 :(得分:1)
使SP_Small
自主进程的外部交易是一种选择,但它不是唯一的选择,也不是首选的选择。
另外两个选项是1)更改SP_Small
以便它可以执行它的功能而不会自我阻止或“序列化”。这通常是首选方案。
或2)更改隔离级别,使其不再自我阻止。当然,如果不了解SP_Small
以及它目前正在序列化的原因,我们无法评估其中任何一项的工作能力。
这些也不一定是唯一的选择,再次取决于这里真正发生的事情的细节以及需要在这里发生的事情。
答案 1 :(得分:0)
您是否需要在“外部交易”开始时运行SP_Small
?进程1阻止进程2的原因是因为进程1将对其更新的任何行保持独占锁定,直到它提交为止。独占锁定甚至可以阻止其他事务读取锁定的行。您可以在长导入机制后运行SP_Small
还是会影响导入的结果?这样做会使每个进程在很短的时间内锁定行。如果那是不可能的,你可以在调用SP_Small
后立即提交事务,如果导入机制失败则以其他方式撤消它吗?