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