【问题标题】:Is MySQL Temporary table a shared resource?MySQL 临时表是共享资源吗?
【发布时间】:2011-09-27 21:43:51
【问题描述】:

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

CREATE PROCEDURE p()
BEGIN

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

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

DROP TEMPORARY TABLE \`temp\`;

END;

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

【问题讨论】:

  • 我认为您不必删除临时表,因为它只是一个临时表

标签: mysql concurrency temp-tables


【解决方案1】:

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

【讨论】:

  • 我在我的临时表中得到了来自我的网络服务器完成的不同存储过程调用的混合结果。你能想象为什么会这样吗? apache 是否可以对不同的 http 请求使用相同的 mysql 连接?非常感谢
  • @FeidaKila,我猜不出你所说的“混合结果”是什么意思。也许你应该发布一个新问题。
  • 混合的意思是插入同一个临时表中的不同存储过程调用(具有不同参数)的结果。我想我会就这个问题提出一个新问题。假设用户 A 调用 SP(A, B, C);用户B调用SP(D, E, F);同时执行,同时目标表从两个过程调用中插入行。
  • @FeidaKila,临时表的范围仅限于创建它们的会话。两个并发会话不能插入同一个临时表。也就是说,如果你在定义表的时候真的使用了CREATE TEMPORARY TABLE...
  • 这就是我在存储过程中创建表的方式(我还在创建语句之前使用了一个删除表):CREATE TEMPORARY TABLE IF NOT EXISTS tmpfinal (
【解决方案2】:

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

因此,如果您有多个同时进行的会话 - 每个会话都有自己独立的同名临时表。

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

【讨论】:

  • 在池化数据库连接的情况下怎么办?会话根本不重要。
  • @AnveshChecka,在池连接的情况下,一次只有一个会话可以使用该连接。打开连接会将其从可用池中删除(将其标记为正在使用,或任何特定实现将其从可用连接池中删除)。 “关闭”连接只是将其释放回池中,以便另一个会话可以使用它。池连接消除了与从头开始创建它们、创建上下文和在服务器上分配内存等相关的开销。但是池连接永远不会从多个会话中同时使用。
猜你喜欢
  • 2023-03-10
  • 2021-10-10
  • 2015-10-27
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多