sql-server - 临时表是线程安全的吗?

标签 sql-server multithreading temp-tables

我正在使用 SQL Server 2000,它的许多存储过程广泛使用临时表。数据库流量很大,我担心创建和删除临时表的线程安全性。

假设我有一个存储过程,它创建了一些临时表,它甚至可以将临时表连接到其他临时表等。并且还可以说两个用户同时执行存储过程。

  • 是否有可能一个用户运行 sp 并创建一个名为 #temp 的临时表,而另一个用户运行相同的 sp 但由于数据库中已存在名为 #temp 的表而停止?

  • 如果同一用户在同一连接上执行同一存储过程两次会怎样?

  • 还有其他奇怪的情况可能会导致两个用户的查询相互干扰吗?

最佳答案

对于第一种情况,不,这是不可能的,因为#temp是本地临时表,因此对其他连接不可见(假设您的用户正在使用单独的数据库连接)。临时表名称是生成的随机名称的别名,您在引用本地临时表时会引用该名称。

就您而言,由于您正在存储过程中创建本地临时表,that temp table will be dropped when the scope of the procedure is exited (见“备注部分”)。

A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process which called the stored procedure that created the table.

对于第二种情况,是的,您会收到此错误,因为表已经存在,并且只要连接存在,表就会持续存在。如果是这种情况,那么我建议您在尝试创建表之前检查该表是否存在。

关于sql-server - 临时表是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466947/

相关文章:

sql-server - 分层 SQL 数据(递归 CTE、HierarchyID、闭包表)

java - 对象名称无效

python - 如何在Python中处理具有固定线程数的队列中的多个作业

PostgreSQL 转储临时表

MYSQL 临时表 - 如何查看事件表

sql - 存储过程以及在参数调用中使用 tsql 函数

php - 尽量减少 SQL 语句? - 堆栈 SQL 查询?

asp.net - 如何在类中使用SqlDependency?

c++ - 带有 boost::asio 的 TCP 服务器,线程池的可扩展性与无堆栈协程

mysql - 查询 TEXT 列是否会导致创建临时表?