sql - 使存储过程原子化而无需考虑外部事务

标签 sql multithreading tsql stored-procedures

我一直在寻找解决方案,但到目前为止还没有运气。
描述:
我(意味着我在公司中)有一个存储过程,可以完成一些相当快且很小的工作。让我们称之为SP_Small。它很小,但是有一个更新并执行另一个存储过程。因此,试图通过将SELECTS和UPDATES组合到一个选择中来使其原子化实际上是行不通的。 (我偶然发现了一个建议的解决方案)
我们有一个导入机制,可以将几个不同的文档并行导入数据库。
每次导入都在事务内部(由启动导入的应用程序完成)。
每次导入都会调用SP_Small进行一些导入和工作。
问题:
现在,SP_Small实际上是原子的,但是它所访问(和共享)的记录一直保持锁定,直到提交外部事务为止,从而使整个过程成为串行而不是并行。
要求:
使SP_Small原子化,确保只有一个进程同时执行它,但是在执行完之后,其余进程可以并行运行。
这是问题的简单描述(并且很费劲:),希望有助于阐明:

最佳答案

从进程的外部事务中使SP_Small自治是一种选择,但这不是唯一的选择,也不是首选的选择。

另外两个选项是:1)更改SP_Small,使其可以执行其功能而不会被自动阻止或“序列化”。通常这是首选。

或2)更改隔离级别,使其不再具有自锁性。当然,如果不进一步了解SP_Small及其当前进行序列化的原因,我们就无法评估这两种方法的工作能力。

这些也不一定是唯一的选择,这再次取决于此处实际发生的事情以及此处实际需要发生的事情的细节。

关于sql - 使存储过程原子化而无需考虑外部事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449214/

相关文章:

mysql - 如果条目已存在,则使用第二个表中的字段

mysql - 有无 SQL 查询

sql - 在数据库设计和查询方面,学习集合论有什么样的投资返回?

sql - 将 postgres 交叉表查询转换为 SQL

mysql - 从 Excel 文件自动导入数据存储过程

sql - 在时间 block 内获取不同的值

不能在 pthread 之间共享变量,值不同

.net - AutoResetEvents/ManualResetEvents 在内部使用 Win32 信号量或互斥体吗?

java - 使用单例和多线程实现共享资源算法

sql - 向 t-sql 中的所有用户表添加一列