Frage

Ich habe wie so heraus in eine Textdatei, eine Prozedur zu Dump Tabellendaten geschrieben (übernehmen die entsprechenden Variablen angegeben sind);

SET @sql = '"SELECT * FROM ##OutputData"'

SET @cmdline = 'bcp '+ @sql +' queryout '+@OutputPath+'\outputFile.csv -c -t -T -S' + @@ServerName

EXEC master..xp_cmdshell @cmdline

Dieses Verfahren funktioniert gut, wenn von innen SQL Server ausgeführt wird, aber nicht, wenn es von JDBC in Java genannt.

Mit dem an der Aktivitätsmonitor suchen Ich kann sehen, dass eine Transaktion die Abfrage "SELECT * FROM ##OutputData" Betrieb durch die Transaktion blockiert wird, der das Verfahren ausgeführt. Effektiv den Prozess Deadlocks.

Ich habe mit dem Code herumgespielt und kann nicht sehen, warum dies überhaupt geschehen würde. Gibt es etwas, dass ich irgendwo bin fehlt?

Danke für jede Hilfe ...

EDIT:. Changed Verweise auf Quartz zu JDBC statt, weil das ist wahrscheinlich mehr relevant

War es hilfreich?

Lösung

Ich glaube, ich habe die Antwort auf diese Frage gefunden.

Seit dem Frühjahr seiner eigenen Transaktionsmanager verwendet, wird es die Tabellen Sperren, dass ich in dem Verfahren erschaffe. Wenn dieses Verfahren ausführt, BCP, läuft es in SQL Server, außerhalb des Umfangs der Feder Transaktion. Daher kann BCP Zugriff nicht die Tabellen es braucht, weil sie durch Federn Transaktion gesperrt werden. Das Verfahren kann nicht fortgesetzt werden, weil es auf BCP so den gesamten Prozess Treffer Deadlock wartet.

Ich habe bemerkt, dass dies der Fall ist, wo ein BCP-Befehl eine äußere Transaktion hat, und obwohl BCP eine Transaction Flag hat, scheint dies keine Wirkung in diesem Fall zu haben.

Um das Problem zu beheben Ich bin jetzt SQL Server Jobs unter Verwendung des Verfahrens ausgeführt werden, ohne Transaktionen.

Wie auch immer, zumindest kann ich dankbar sein, dass diese Frage brachte mir den ‚Tumbleweed‘ Abzeichen;) Dank alle!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top