MySQL 临时表是共享资源吗?

40

我有一个使用临时表的MySQL存储过程,假设我的表名为“temp”,我用它来存储一些中间数据。 它将在过程开始时创建,并将在结束时删除。

CREATE PROCEDURE p()
BEGIN

CREATE TEMPORARY TABLE \`temp\`(...);

INSERT INTO \`temp\` VALUES(...);

DROP TEMPORARY TABLE \`temp\`;

END;

问题在于这个存储过程可能会被不同的用户并发使用,因此我想知道这是否会引起任何问题(即临时表中插入数据的任何冲突)。换句话说,临时表是否是在调用相同SP的不同调用之间共享的资源?


我认为你不必删除临时表,因为它只是一个临时表。 - Ryan
2个回答

62

不,临时表限定在您的数据库连接范围内。您可以在同一数据库连接期间的后续存储过程调用中使用临时表,但其他连接无法访问它。他们可以创建相同名称的表,但每个临时表都是独立的。当您关闭连接时,临时表将消失。


作为混合,我指的是从不同存储过程调用(使用不同参数)的结果插入到同一个临时表中。我想我会就这个问题创建一个新的问题。想象一下用户A同时调用SP(A,B,C);和用户B调用SP(D,E,F);,因此执行是同时进行的,并且目标表从两个过程调用中插入了行。 - Packet Tracer
2
@FeidaKila,临时表的作用范围仅限于创建它们的会话。两个并发会话不能向同一个临时表插入数据。也就是说,如果您在定义表时实际使用了CREATE TEMPORARY TABLE... - Bill Karwin
这是我在存储过程中创建表的方式(在创建语句之前,我还使用了一个删除表的语句):CREATE TEMPORARY TABLE IF NOT EXISTS tmpfinal()。 - Packet Tracer
谢谢Bill,我已经开了一个新的问题来讨论这个问题,让我们看看是否有人知道发生了什么-> http://stackoverflow.com/questions/14769653/stored-procedure-mixing-results-into-temp-tables-from-different-invokations - Packet Tracer
似乎MySQL,或者可能是.NET提供程序,并不总是删除临时表,或者删除得不够快,因此当启用连接池时,后续的连接可以访问它们。请参见这个问题这个问题以获取两个示例。 - Kenny Evitt
显示剩余5条评论

15

1
在使用池化数据库连接的情况下呢?会话并不重要。 - Anvesh Checka
2
在池化连接的情况下,每次只能有一个会话使用该连接。打开连接会将其从可用池中移除(标记为正在使用或执行特定实现以将其从可用连接池中移除)。“关闭”连接只是将其释放回池中,以便另一个会话可以使用它。汇集连接消除了与从头开始创建连接、在服务器上创建上下文并分配内存等操作相关的开销。但汇集连接从未同时用于多个会话。 - Craig Tullis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接