MySQL临时表是共享资源吗?

Ehs*_*hmi 32 mysql concurrency temp-tables

我有一个使用临时表的MySQL存储过程.假设我的表名是'temp',我用它来存储一些中间数据.它将在程序开始时创建,并将在最后删除.

CREATE PROCEDURE p()
BEGIN

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

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

DROP TEMPORARY TABLE \`temp\`;

END;
Run Code Online (Sandbox Code Playgroud)

问题是这个存储过程可能会被不同的用户同时使用,所以我想知道这是否会导致任何问题(即临时表中插入数据的任何冲突).换句话说临时表是对同一个SP的不同调用内的共享资源吗?

Bil*_*win 51

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

  • @FeidaKila,临时表的范围仅限于创建它们的会话。两个并发会话不能插入到同一个临时表中。也就是说,如果您在定义表时实际上使用了“CREATE TEMPORARY TABLE...”。 (2认同)

zer*_*kms 14

临时表仅对当前会话可见.

因此,如果您有几个同时进行的会话 - 每个会话将拥有自己的具有相同名称的独立临时表.

文档:http://dev.mysql.com/doc/refman/5.1/en/create-table.html,ctrl + f表示"你可以使用TEMPORARY"

  • @AnveshChecka,在池连接的情况下,一次只有一个会话可以使用该连接.打开连接会将其从可用池中删除(将其标记为正在使用,或将特定实现从可用连接池中删除它)."关闭"连接只是将其释放回池中,以便另一个会话可以使用它.池连接消除了与从头创建它们,创建上下文和在服务器上分配内存等相关的开销.但是,池连接永远不会同时来自多个会话. (2认同)