2011-07-04 69 views
28

我有一個使用臨時表的MySQL存儲過程。假設我的表名是'temp',我用它來存儲一些中間數據。它會在程序開始時創建,並在最後結束。MySQL臨時表是共享資源嗎?

CREATE PROCEDURE p() 
BEGIN 

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

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

DROP TEMPORARY TABLE \`temp\`; 

END; 

的問題是,此存儲的過程可以由不同的用戶同時使用,所以我想知道是否這會引起任何問題(即在插入的數據在臨時表的任何衝突)。換句話說,臨時表是不同調用同一個SP內的共享資源嗎?

+0

我不認爲你必須刪除臨時表,因爲它只是一個臨時表 –

回答

44

不,一個臨時表僅限於你的數據庫連接的範圍。在同一個數據庫連接期間,您可以在隨後的過程調用中使用臨時表,但其他連接無法訪問它。他們可以用相同的名字創建一個表,但每個臨時表都是獨立的。關閉連接時臨時表會消失。

+0

我在我的web服務器完成的不同存儲過程調用的臨時表中得到了混合結果。你能想象爲什麼會發生這種情況?是可能apache使用相同的mysql連接不同的http請求?非常感謝 –

+0

@FeidaKila,我無法猜測你的意思是「混合結果」。也許你應該發佈一個新問題。 –

+0

混合我的意思是不同的存儲過程調用(使用不同的參數)插入同一臨時表中的結果。我想我會爲這個問題創建一個新的問題。設想用戶A呼叫SP(A,B,C);和用戶B調用SP(D,E,F);同時執行是在同一時間完成的,並且目標表從兩個過程調用中插入行。 –

12

臨時表僅對當前會話可見。

所以,如果你有幾個同時進行的會話 - 每個會有自己的獨立臨時表具有相同的名稱。

文檔:http://dev.mysql.com/doc/refman/5.1/en/create-table.html,按Ctrl + F爲「可以使用的臨時」

+1

什麼在一個池的數據庫連接的情況下?會議並不重要。 – gca

+2

@AnveshChecka,在連接池的情況下,一次只有一個會話可以使用該連接。打開連接將其從可用池中刪除(將其標記爲正在使用中,或者將特定實現從可用連接池中刪除)。 「關閉」連接只是將其釋放回池中,以便其他會話可以使用它。池連接消除了從頭開始創建它們,創建上下文並在服務器上分配內存等相關開銷。但是,從多個會話中永遠不會同時使用池連接。 – Craig