c# - 多线程存储过程可以访问彼此的临时表吗?

标签 c# sql-server multithreading stored-procedures

我主要是一名软件开发人员,但像大多数软件开发人员一样,我必须时不时地涉足 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);
}

需要注意的重要一点是它每次都会实例化一个新的 rRepository。它是 Entity Framework ,因此这应该意味着每个框架都有一个新的上下文/连接。

这已经运行良好很多年了,从来没有给我们带来任何问题。但今天我在测试过程中一次发射了很多这些,并得到了这个:

The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
There is already an object named '#Exclusions' in the database.

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

我找到了这个答案,这表明临时表不是线程安全的:Are temporary tables thread-safe? - 但仅当多个用户使用同一连接时。就我而言,我有相同的连接字符串,但有多个上下文。我为什么遇到线程问题?

最佳答案

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

声明@t表

关于c# - 多线程存储过程可以访问彼此的临时表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550382/

相关文章:

C#:有什么方法可以抑制类似于抑制警告消息的编译器错误?

mysql - 是否可以将 SELECT-IN-SELECT 查询转换为 JOIN 查询?

sql-server - 如何判断 SQL Server MDF 文件是否已满/可能需要增长?

c - Sleep() 终止 WindRiver 中的线程

java - 如何使用线程池为生产者-消费者解决方案创建动态消费者任务?

objective-c - 如何防止 dispatch_group 卡住?

c# - C#中的字符串常量内存池

c# - 使用 ASP.NET Core MVC 2.0 在中间件中获取 UrlHelper

sql-server - 模糊逻辑搜索全名

c# - SQLite 连接策略