0

我已经编写了一个将表数据转储到文本文件的过程(假设已声明相关变量);

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,因为这可能更相关。

4

1 回答 1

0

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

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

我注意到,只要 BCP 命令具有外部事务,就会发生这种情况,尽管 BCP 具有 TransactionIsolation 标志,但这在这种情况下似乎没有任何影响。

为了解决这个问题,我现在使用 SQL Server Jobs 来运行该过程,没有任何事务。

无论如何,至少我可以很感激这个问题为我赢得了“风滚草”徽章;)谢谢大家!

于 2011-01-12T17:15:55.893 回答