2011-07-04 41 views
28

Tôi có một thủ tục lưu trữ MySQL sử dụng bảng tạm thời. Giả sử rằng tên bảng của tôi là 'temp' và tôi sử dụng nó để lưu trữ một số dữ liệu ở giữa. Nó sẽ tạo ra ở đầu thủ tục, và sẽ thả ở cuối.Bảng MySQL tạm thời là tài nguyên được chia sẻ?

CREATE PROCEDURE p() 
BEGIN 

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

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

DROP TEMPORARY TABLE \`temp\`; 

END; 

Vấn đề là thủ tục lưu trữ này có thể được sử dụng bởi người dùng khác nhau đồng thời, vì vậy tôi muốn biết nếu điều này có thể gây ra bất kỳ vấn đề (ví dụ: bất kỳ mâu thuẫn trong dữ liệu đưa vào bảng temp). Nói cách khác là bảng tạm thời một tài nguyên được chia sẻ trong các cuộc gọi khác nhau đến cùng một SP?

+0

Tôi không nghĩ rằng bạn phải thả bảng tạm thời vì nó chỉ là một bảng tạm thời –

Trả lời

44

Không, một bảng tạm thời được giới hạn phạm vi kết nối cơ sở dữ liệu của bạn. Bạn có thể sử dụng bảng tạm thời trong các cuộc gọi tiếp theo đến thủ tục trong cùng một kết nối cơ sở dữ liệu, nhưng các kết nối khác không thể truy cập nó. Họ có thể tạo một bảng theo cùng tên, nhưng mỗi bảng tạm thời sẽ độc lập. Bảng tạm thời biến mất khi bạn đóng kết nối.

+0

Tôi nhận được kết quả hỗn hợp bên trong bảng tạm thời của tôi từ các cuộc gọi thủ tục được lưu trữ khác nhau được thực hiện bởi máy chủ web của tôi. Bạn có thể tưởng tượng tại sao điều này xảy ra? có thể apache bằng cách sử dụng cùng một kết nối mysql cho các yêu cầu http khác nhau? cảm ơn rất nhiều –

+0

@ FeidaKila, tôi không thể đoán ý bạn là gì bởi "kết quả hỗn hợp". Có lẽ bạn nên đăng câu hỏi mới. –

+0

là hỗn hợp i có nghĩa là kết quả từ các cuộc gọi thủ tục được lưu trữ khác nhau (với các tham số khác nhau) được chèn vào cùng một bảng tạm thời. Tôi nghĩ tôi sẽ tạo một câu hỏi mới về vấn đề này. Hãy tưởng tượng người dùng Một SP gọi (A, B, C); và userB gọi SP (D, E, F); đồng thời để thực hiện được thực hiện cùng một lúc, và bảng đích được các hàng được chèn vào từ cả hai cuộc gọi thủ tục. –

12

Bảng tạm thời chỉ hiển thị cho phiên hiện tại.

Vì vậy, nếu bạn có một số phiên đồng thời - mỗi phiên sẽ có bảng tạm thời độc lập riêng có cùng tên.

Tài liệu: http://dev.mysql.com/doc/refman/5.1/en/create-table.html, ctrl + f cho "Bạn có thể sử dụng TẠM"

+1

Điều gì trong trường hợp kết nối cơ sở dữ liệu gộp? Phiên không thực sự quan trọng. – gca

+2

@AnveshChecka, trong trường hợp kết nối gộp, chỉ một phiên tại một thời điểm được sử dụng kết nối đó. Việc mở kết nối sẽ loại bỏ nó khỏi nhóm có sẵn (đánh dấu nó là sử dụng, hoặc bất kỳ việc thực hiện cụ thể nào để loại bỏ nó khỏi nhóm kết nối có sẵn). "Kết thúc" kết nối chỉ phát hành nó trở lại hồ bơi để phiên khác có thể sử dụng nó. Kết nối tổng hợp loại bỏ các chi phí liên quan đến việc tạo chúng từ đầu, tạo bối cảnh và phân bổ bộ nhớ trên máy chủ, vv Nhưng một kết nối gộp lại không bao giờ được sử dụng đồng thời từ nhiều phiên. – Craig

Các vấn đề liên quan