从JDBC调用时,无法将表数据转储到使用BCP的文件

问题描述:

我已经编写了一个将表数据转储到文本文件的过程,如下所示(假定相关变量已声明);从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而不是因为这可能更有意义。

我相信我已经找到了这个问题的答案。

由于Spring使用它自己的事务管理器,它锁定了我在过程中创建的表。 当该过程执行BCP时,它在SQL Server中运行,超出了Spring事务的范围。因此,BCP无法访问它需要的表,因为它们被Springs事务锁定。该过程无法继续,因为它正在等待BCP,因此整个过程都处于死锁状态。

我注意到这发生在任何有BCP命令有外部事务的地方,尽管BCP有一个TransactionIsolation标志,但在这个例子中这似乎没有任何作用。

要解决此问题,我现在使用SQL Server作业来运行该过程,而没有事务。

无论如何,至少我可以感激这个问题赢得了'Tumbleweed'徽章;) 谢谢大家!