2011-01-05 1 views
0

테이블 데이터를 텍스트 파일로 덤프하는 절차를 작성했습니다 (관련 변수가 선언되었다고 가정).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로 수정합니다.

답변

0

나는이 문제에 대한 답을 찾았다 고 생각합니다.

Spring은 자신의 트랜잭션 관리자를 사용하기 때문에 프로 시저에서 작성중인 테이블을 잠그고 있습니다. 해당 프로 시저가 BCP를 실행하면 Spring 트랜잭션의 범위를 벗어나는 SQL Server에서 실행됩니다. 따라서 BCP는 스프링 트랜잭션에 의해 잠겨 있기 때문에 필요한 테이블에 액세스 할 수 없습니다. 전체 프로세스가 교착 상태에 빠지도록 BCP에서 대기 중이므로 절차를 계속할 수 없습니다.

이 문제는 BCP 명령에 외부 트랜잭션이있는 경우에 발생하며 BCP에는 TransactionIsolation 플래그가 있지만이 인스턴스에는 아무런 영향이없는 것으로 나타났습니다.

문제를 해결하기 위해 지금 SQL Server 작업을 사용하여 트랜잭션없이 프로 시저를 실행하고 있습니다.

어쨌든,이 질문에 'Tumbleweed'배지를 적립 해 주셔서 감사합니다.) 감사합니다!

관련 문제