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を実行すると、Springトランザクションのスコープ外のSQLServerで実行されます。したがって、BCPは、Springsトランザクションによってロックされているため、必要なテーブルにアクセスできません。BCPを待機しているため、プロセス全体がデッドロックに陥ったため、手順を続行できません。

これは、BCPコマンドに外部トランザクションがある場合は常に発生し、BCPにはTransactionIsolationフラグがありますが、この場合は効果がないようです。

この問題を解決するために、現在SQLServerジョブを使用してトランザクションなしでプロシージャを実行しています。

とにかく、少なくとも私はこの質問が私に「タンブルウィード」バッジを獲得したことに感謝することができます;)すべてに感謝します!

于 2011-01-12T17:15:55.893 に答える