2010-12-15 4 views
0

Ich habe eine Multithread-Anwendung.Temporäre Tabelle in Multithread

Jeder Thread führt Speicherprozeduren aus, in denen ich eine lokale temporäre Tabelle erstelle. Der Name der temporären Tabelle ist das gleiche: #TempTable

ich einen Konflikt zwischen Faden habe, wenn sie diesen #TempTable

manipulieren Wie kann ich ein #TempTable für jeden Thread mit dem gleichen Namen zu machen?

Antwort

1

Sie müssen sicherstellen, dass jeder Thread in einer anderen Verbindung als der Verbindungspool ausgeführt wird (also in einer anderen Sitzung).

Temp-Tabellen sind nur in ihrer eigenen Sitzung sichtbar.

Von MSDN:

Lokalen temporäre Tabellen sind nur sichtbar, in der aktuellen Sitzung

+0

Ich möchte eine Transaktion wegen der Menge der Daten vermeiden, die ich manipuliere (große Einfügung von Daten => Rückgängig ist zu lang) –

+0

@Patrice Pezillier - Sie müssen _different Verbindungen_ für jeden Thread verwenden. – Oded

+1

Ah --- es gibt eine Menge, die Sie tun können, Transaktion zu vermeiden ist unmöglich. Es gibt immer eine Transaktion. Sie können nach jeder Einfügung oder zwei Commits festschreiben, aber atomare Operationen sind Teil von SQL Serer. – TomTom

-1

Die #TempTable temporary table sollte nur auf die aktuelle SQL-Server-Sitzung/Verbindung zur Verfügung steht, wenn Sie so wollen Jeder Prozess benötigt eine separate #TempTable, verwenden Sie nur separate Verbindungen für jede. Wenn das nicht möglich ist, können Sie Tabellenvariablen verwenden, die etwas von einer Kreuzung zwischen regulären Tabellen und Variablen sind - wie folgt aus:

DECLARE @TableVar TABLE (
    IDColumn int, 
    NameColumn varchar(max)) 

INSERT INTO @TableVar (IDColumn, NameColumn) 
SELECT ID, Name 
FROM RealTable 
WHERE ..... 

Wenn aber wollen Sie alle Prozesse, die ein und derselben Tabelle verwenden, Benennen Sie es einfach mit Doppel-Hash (## TempTable) und dann wird es global zugänglich sein.

+0

Es scheint, ich habe eine falsche Frage beantwortet :), bearbeitet die Antwort zu entsprechen – SWeko

1

Solange die mehreren Threads separate Verbindungen verwenden (was ich wirklich hoffe, sie sind es, sonst gibt es wahrscheinlich keinen Nutzen für Multithreading, oder Sie haben eine massive Race-Bedingung in Ihrem Code versteckt), sollten sie alle ihre eigenen Kopien haben der Tempentabelle. Du solltest nichts anderes tun müssen.