2011-01-05 28 views
0

我已經編寫了一個將表數據轉儲到文本文件的過程,如下所示(假定相關變量已聲明);從JDBC調用時,無法將表數據轉儲到使用BCP的文件

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

SET @cmdline = 'bcp '+ @sql +' queryout '[email protected]+'\outputFile.csv -c -t -T -S' + @@ServerName 

EXEC master..xp_cmdshell @cmdline 

此過程在從SQL Server內部執行時正常工作,但不是從Java中的JDBC調用它時。

通過查看活動監視器,我可以看到操作查詢"SELECT * FROM ##OutputData"的事務正在被執行該過程的事務阻止。有效地鎖定流程。

我玩過代碼,看不出爲什麼會發生這種情況。有什麼我失蹤的地方?

感謝您的幫助......

編輯:改變引用石英到JDBC而不是因爲這可能更有意義。

回答

0

我相信我已經找到了這個問題的答案。

由於Spring使用它自己的事務管理器,它鎖定了我在過程中創建的表。 當該過程執行BCP時,它在SQL Server中運行,超出了Spring事務的範圍。因此,BCP無法訪問它需要的表,因爲它們被Springs事務鎖定。該過程無法繼續,因爲它正在等待BCP,因此整個過程都處於死鎖狀態。

我注意到這發生在任何有BCP命令有外部事務的地方,儘管BCP有一個TransactionIsolation標誌,但在這個例子中這似乎沒有任何作用。

要解決此問題,我現在使用SQL Server作業來運行該過程,而沒有事務。

無論如何,至少我可以感激這個問題贏得了'Tumbleweed'徽章;) 謝謝大家!

相關問題