从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'徽章;) 谢谢大家!