2013-10-18 55 views
2

enter image description here我一直在寻找一个解决方案,但至今没有运气。做一个存储过程原子而不考虑外部事务

说明: 我(指我在公司)有一个存储过程,做了一些相当快的,小的工作。我们称它为SP_Small。它的功能很小,它有一个更新并执行另一个存储过程。因此,通过将SELECTS和UPDATES合并为一个选择来试图使它成为原子并不是真的可行。 (一个提出的解决方案我偶然)

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

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

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

这是问题的一个简单的(和ungly :))绘制,希望有助于澄清:

+0

可你只是没有外部事务?在其自己的根事务中运行每个SP_Small。 – usr

+0

恐怕外层交易是一个给定的,它整体解决方案的一部分。而在理论上它可以改变,改变将被认为是主要的,并且被皱眉并且很可能我们会被告知:找到另一种方式。 –

+0

我会读到你的sql服务器支持的各种类型的锁。它可以帮助您决定您的解决方案。我不明白你的问题。你说sp是“事实上的原子”,但后来说你的要求是使它成为原子。 – Jay

回答

1

从它制作SP_Small自治的过程的外部事务是一种选择,但不是唯一的选择,也不是它可能是首选的一个。

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

或2)更改隔离级别,使其不再视为自我封锁。当然,如果不知道更多有关SP_Small以及它为什么正在序列化的信息,我们无法评估其中任何一种的可用性。

这些也不一定是唯一的选择,再次取决于这里真正发生的细节以及真正需要在这里继续。

0

你需要在你的“外交易”开始运行SP_Small?过程1阻止过程2的原因是,过程1将对其更新的任何行保持排它锁定,直到它提交。独占锁定可以阻止其他事务读取这些锁定的行。您可以在长时间导入机制后运行SP_Small,否则会影响导入结果?这样做会使每个进程在更短的时间内锁定行。如果这不可行,您是否可以在调用SP_Small后立即提交事务,并在导入机制失败时以其他方式撤销它?