MySQL临时表是共享资源吗?
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提供程序,不总是删除临时表,或者可能不够快,所以当启用连接池时,随后的连接能够访问它们。请参见这个问题和这个问题的两个示例。
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"可以找到相关信息。