인서트하는 쪽만 트랜잭션을 스타트-커밋하는 것이 아니라, 셀렉트하는 쪽에서도 매번 셀렉트한 후마다 커밋을 해줘보세요. 파이어버드는 기본적으로 셀렉트에서도 트랜잭션을 먹기 때문에, 인서트하고 있는 쓰레드쪽에서 커밋이 되었더라도 셀렉트하는 다른 쓰레드(즉 다른 커넥션을 쓰고 있는 거죠)쪽에서는 커밋하지 않으면 다른 커넥션에서 인서트된 레코드들이 나타나지 않을 수 있을 겁니다. 확실한지는 가물...
그럼...
최락중 님이 쓰신 글 :
: 안녕하세요.
:
: 개발 환경: 델파이7, 파이어버드 2.0 임베디트, ZEOS 6.6.2
:
: 대량 Insert Query 실행 시 화면(UI)가 먹통 되는 것이 싫어서
: Thread로 Query를 처리했습니다. (서브 쿼리를 사용하는 대량의 INSERT)
:
: 1) 본 프로그램에서 DBConnection과 SQL문을 파라메터로 Thread Create 프로시져에 넘기고,
: 2) Thread 내부에서 새로운 DBConnection를 동적 생성해서 DB 연결
: 3) 동적 생성한 Query에서 SQL문 실행
: 4) DB 연결 끊고, Free
:
: Thread는 무리가 가지 않도록 하나만 생성했습니다.
:
: 그런데 Thread 방식으로 바꾸고 난 뒤부터 Thread에서 INSERT 한 데이터가
: 조회되지 않습니다. 프로그램을 종료 후 다시 실행하면 조회가 되구요.
:
: 편법으로 Thread 작업 후 데이터베이스를 reconnect를 해 주었더니
: 조회는 되는데 프로그램 종료 시 파이어버드 Dll에서 에러가 발생하네요.
:
: 그래서 Thread에서 Query를 실행했다고 해서 조회가 안될 이유가 없어보여
: 다시 점검하고 있습니다.
:
: - AutoCommit이 문제가 싶어서 StartTransaction ... Commit도 해 보았구요.
: (TransactIsolationLevel := tiNone)
: - SQLMonitor로 추적해보면 정상적으로 Query는 처리됩니다.
: - Thread는 OnTerminate 이벤트로 죽은 것을 확인 했습니다
:
: 왜 이런 현상이 벌어질까요? 의미해볼만한 것이라도 답변 부탁드립니다.
:
: 프로그램 소스가 필요하면 다시 올리겠습니다. 무작정 소스를 올리면 성의없어 보여서..ㅡㅡ;
|