2011-07-04 26 views
28

Geçici bir tablo kullanan bir MySQL saklı yordamım var. Tablo adımın 'temp' olduğunu ve bazı orta verileri saklamak için kullandığımı varsayalım. Prosedürün başlangıcında yaratacak ve sonunda düşecek.MySQL Geçici tablosu paylaşılan bir kaynak mı?

CREATE PROCEDURE p() 
BEGIN 

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

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

DROP TEMPORARY TABLE \`temp\`; 

END; 

Sorun, bu saklı yordam eş zamanlı olarak, farklı kullanıcılar tarafından kullanılabilir ki, bu yüzden, bu herhangi bir soruna neden olmadığını bilmek isteyen (yani geçici tabloya takılı verilerinde bir çakışma). Başka bir deyişle temp tablosu aynı SP'ye farklı çağrılarda paylaşılan bir kaynak mıdır?

+0

Temp tablosunu bırakmanız gerektiğini düşünüyorum çünkü sadece geçici bir tablo –

cevap

44

Hayır, geçici tablo veri tabanı bağlantısı kapsamında sınırlıdır. Aynı veritabanı bağlantısı sırasında prosedürün sonraki çağrılarında geçici tabloyu kullanabilirsiniz, ancak diğer bağlantılar buna erişemez. Aynı ada göre bir tablo oluşturabilirler, ancak her temp tablosu bağımsız olacaktır. Bağlantıyı kapattığınızda sıcaklık tabloları söner.

+0

Web sunucum tarafından yapılan farklı saklı yordam çağrılarından geçici tablolarımdaki karışık sonuçları alıyorum. Bunun neden olduğunu hayal edebiliyor musunuz? farklı http istekleri için aynı mysql bağlantısını kullanarak apache olabilir mi? –

+0

@FeidaKila çok teşekkürler, "karışık sonuçlar" ile ne demek istediğini tahmin edemiyorum. Belki de yeni bir soru göndermelisin. –

+0

karışık olarak, aynı geçici tabloya eklenen farklı saklı yordam çağrılarının (farklı parametrelerle) sonuçları anlamına gelir. Sanırım bu konu hakkında yeni bir soru oluşturacağım. Hayal edin kullanıcı Bir arama SP (A, B, C); ve userB arayarak SP (D, E, F); Aynı zamanda, yürütme aynı zamanda yapılır ve hedef tablo, her iki yordam çağrısından eklenen satırlar alır. –

12

Geçici tablo yalnızca geçerli oturumu için görünür.

Eğer birden fazla eşzamanlı oturumunuz varsa - her birinde aynı ada sahip kendi bağımsız geçici tabloları olacaktır.

Dokümantasyon: "Sen GEÇİCİ kullanabilirsiniz" için http://dev.mysql.com/doc/refman/5.1/en/create-table.html ctrl + f

+1

Havuzlanmış bir veritabanı bağlantısında ne var? Seans hiç önemli değil. – gca

+2

@AnveshChecka, havuzlanmış bağlantı durumunda, bir seferde yalnızca bir oturum bu bağlantıyı kullanır. Bağlantıyı açmak mevcut havuzdan kaldırır (kullanımda olduğu gibi işaretler veya belirli bir uygulama mevcut bağlantı havuzundan kaldırmak için ne yaparsa yapar). Bağlantıyı "kapatmak", onu başka bir oturumun kullanabilmesi için havuza geri gönderir. Havuzlama bağlantıları, bunları sıfırdan oluşturma, bağlam oluşturma ve sunucuda bellek ayırma vb. Ile ilişkili ek yükü ortadan kaldırır. Ancak, havuzlanmış bir bağlantı, birden çok oturumdan aynı anda kullanılmaz. – Craig

İlgili konular