MySQL临时表是共享资源吗?

17 浏览
0 Comments

MySQL临时表是共享资源吗?

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

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

0
0 Comments

MySQL临时表是一个共享资源吗?

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

我从我的Web服务器中的不同存储过程调用中的临时表中得到了混合的结果。你能想象为什么会这样吗?是不是我的Apache在不同的HTTP请求中使用了同一个MySQL连接?非常感谢。

我不能猜到你所说的“混合的结果”是什么意思。也许你应该发表一个新的问题。

混合的意思是来自不同存储过程调用(具有不同参数)插入到同一个临时表中的结果。我认为我会就这个问题创建一个新的问题。想象一下,用户A同时调用SP(A, B, C);用户B调用SP(D, E, F);因此执行是同时进行的,目标表中插入了来自两个过程调用的行。

临时表的作用域限制在创建它们的会话中。两个并发会话不能向同一个临时表插入数据。也就是说,如果在定义表时实际使用了CREATE TEMPORARY TABLE...

这是我在存储过程中创建表的方式(我还在创建语句之前使用了一个删除表):CREATE TEMPORARY TABLE IF NOT EXISTS tmpfinal (

谢谢,Bill,我已经就这个问题开了一个新的问题,让我们看看是否有人知道发生了什么- > stackoverflow.com/questions/14769653/…

客户端(数据库)连接池会有这种副作用吗?

客户端连接池在重新分配连接之前应该调用ConnectionImpl.resetServerState()。这将重新验证用户身份,清除任何连接状态,包括事务,临时表,会话变量,连接字符集等。

似乎MySQL,或者也许是.NET提供程序,不总是删除临时表,或者可能不够快,所以当启用连接池时,随后的连接能够访问它们。请参见这个问题这个问题的两个示例。

0
0 Comments

MySQL临时表是一个只对当前会话可见的资源。因此,如果有多个并发会话,每个会话将拥有自己独立的同名临时表。

然而,在数据库连接池的情况下会有什么问题呢?会话实际上并不重要。

在连接池中,一次只有一个会话可以使用该连接。打开连接会将其从可用连接池中移除(将其标记为正在使用,或者根据具体实现从可用连接池中删除)。"关闭"连接只是将其释放回连接池,以便另一个会话可以使用它。连接池化可以消除从头开始创建连接、在服务器上创建上下文和分配内存等相关开销。但是,一个连接池中的连接永远不会被多个会话同时使用。

那么,MySQL临时表是否是一个共享资源呢?根据上述解释,可以得出结论,MySQL临时表在不同会话之间是相互独立的,不会造成共享资源的问题。

参考文档:[http://dev.mysql.com/doc/refman/5.1/en/create-table.html](http://dev.mysql.com/doc/refman/5.1/en/create-table.html),在文档中搜索"TEMPORARY"可以找到相关信息。

0