我一直在寻找一个解决方案,但至今没有运气。做一个存储过程原子而不考虑外部事务
说明: 我(指我在公司)有一个存储过程,做了一些相当快的,小的工作。我们称它为SP_Small。它的功能很小,它有一个更新并执行另一个存储过程。因此,通过将SELECTS和UPDATES合并为一个选择来试图使它成为原子并不是真的可行。 (一个提出的解决方案我偶然)
我们有一个导入机制,即进口几种不同的文档平行到数据库中。 每个导入都在一个事务中(由启动导入的应用程序完成)。 每个导入都会调用SP_Small来执行一些导入和工作。
问题: 现在,SP_Small事实上是原子的,但它访问的记录(和共享的)保持锁定状态,直到外部事务被提交,使得整个过程串行,而不是并行。
要求: 使SP_Small原子化,确保只有一个进程在同一时间执行它,但在其执行后其余部分可以并行运行。
这是问题的一个简单的(和ungly :))绘制,希望有助于澄清:
可你只是没有外部事务?在其自己的根事务中运行每个SP_Small。 – usr
恐怕外层交易是一个给定的,它整体解决方案的一部分。而在理论上它可以改变,改变将被认为是主要的,并且被皱眉并且很可能我们会被告知:找到另一种方式。 –
我会读到你的sql服务器支持的各种类型的锁。它可以帮助您决定您的解决方案。我不明白你的问题。你说sp是“事实上的原子”,但后来说你的要求是使它成为原子。 – Jay