多线程存储过程是否可以相互访问';s临时表

本文关键字:临时表 访问 是否 存储过程 多线程 | 更新日期: 2023-09-27 18:27:40

我主要是一名软件开发人员,但和大多数软件开发人员一样,我不得不不时地涉足SQL。我的理解是,当您运行一个存储过程时,在该过程中创建的任何变量和临时表都属于运行的,并在执行结束时处理掉。

在我当前的应用程序中,有一个Windows服务,它一次从队列中提取几个"作业",并为每个作业执行一个存储过程。它为每个作业创建一个新线程,并同时运行它们。这是运行作业的代码:

var job = (Job)e.Argument;
rRepository rThread = new rRepository(); 
try
{
    rThread.spJob(job.JobID);
}
catch (Exception ex)
{
    logging.LogError(ex, "Error Running SP", job.JobID, true);
}

需要注意的重要一点是,它每次都会实例化一个新的r存储。它是实体框架,所以这应该意味着每个框架都有一个新的上下文/连接。

这已经运行了很长时间,从来没有给我们带来任何问题。但今天我在测试中一次发射了很多这样的东西,得到了这个:

当前事务无法提交,并且无法支持写入日志文件的操作。回滚交易
数据库中已存在名为"#Exclusions"的对象。

所以#Exclusions是存储过程中使用的一个临时表。看起来这些同时运行的过程都可以访问彼此的临时表。

我找到了这个答案,这表明临时表不是线程安全的:临时表是线程安全的吗?-但仅当多个用户正在使用同一连接时。在我的例子中,我有相同的连接字符串,但有多个上下文。我怎么会出现线程问题?

多线程存储过程是否可以相互访问';s临时表

您可以创建表变量,这些变量仅可用于创建它们的存储过程:

声明@t表