我编写了一个将表数据转储到文本文件中的过程(假设相关变量已经声明);
SET @sql = '"SELECT * FROM ##OutputData"'
SET @cmdline = 'bcp '+ @sql +' queryout '+@OutputPath+'\outputFile.csv -c -t -T -S' + @@ServerName
EXEC master..xp_cmdshell @cmdline
此过程在从SQL Server内部执行时可以正常工作,但在Java中从JDBC调用时则无效。
通过查看活动监视器,我可以看到正在执行该过程的事务正在阻止操作查询"SELECT * FROM ##OutputData"
的事务。有效地使该过程陷入僵局。
我玩过代码并且无法理解为什么会发生这种情况。有什么东西我在某处丢失吗?
感谢您的帮助......
编辑:将对Quartz的引用更改为JDBC,因为这可能更相关。
答案 0 :(得分:0)
我相信我找到了这个问题的答案。
由于Spring使用它自己的事务管理器,它会锁定我在过程中创建的表。 当该过程执行BCP时,它在SQL Server中运行,超出了Spring事务的范围。因此,BCP无法访问所需的表,因为它们被Springs事务锁定。该过程无法继续,因为它正在等待BCP,因此整个过程都会遇到死锁。
我注意到这种情况发生在BCP命令有外部事务的地方,虽然BCP有一个TransactionIsolation标志,但这似乎没有任何影响。
要解决此问题,我现在使用SQL Server作业来运行该过程,没有任何事务。
无论如何,至少我可以感激这个问题为我赢得了“Tumbleweed”徽章;) 谢谢大家!