> > 어디선가 이미 Transaction 을 열고 실행중인 것 아닌가요. 하나의 transaction 내에서 다중 transac
> ti
> > on 을 지원하지 못합니다. (현재 PostgreSQL 의 제한점입니다)
> > 앞에서 부터 차근차근 실행해 보시기 바랍니다.
> > 만약 새로운 transaction 을 무조건 시작해야 한다면 BEGIN 앞에 COMMIT 를 넣어 주시기 바랍니다.
> >
> > > c 소스중에 db 연관부분 입니다.
> > >
> > > #include <ecpglib.h>
> > > #include <string.h>
> > > #include <stdlib.h>
> > >
> > > EXEC SQL INCLUDE sqlca;
> > > EXEC SQL define NAME_SIZE 20;
> > >
> > > EXEC SQL BEGIN DECLARE SECTION;
> > > varchar name[NAME_SIZE+1];
> > > EXEC SQL END DECLARE SECTION;
> > >
> > > EXEC SQL CONNECT TO 'test';
> > > EXEC SQL BEGIN TRANSACTION;
> > > EXEC SQL INSERT INTO KO(name) VALUES(:name);
> > > EXEC SQL COMMIT;
> > > EXEC SQL DISCONNECT;
> > >
> > > 위 구문을 for 문으로 돌려서 insert를 시켰더니 다음과 같은 내용이 출력됩니다.
> > > 어떤 이유에서 인지 답변좀 해주세요..
> > >
>
> > > NOTICE: BEGIN: already a transaction in progress
> > >
>
>
> 그런가요! 제가 지금 두개의 서버 프로세스에서 1초에 3번정도 DB insert 작업을
> 하거든요. 앞단에 COMMIT;을 넣어도 같은 메시지가 나오네요.. ㅠ_ㅠ
> 해결 방법이 없는건가요. 아주 중요한 문제거든요.. 근데 이상하게도 DB 에는 내용이 들어가 있으니
> 허허..해결방법이라던지 아님 다른 조언좀 해쥐세요..
만약 꼭 그렇게 나온다면 일단 Concurrency control 이 문제가 될 소지가 많군요.
트랜젝션의 시작 전후에 테이블 락을 시켜 주고 작업후 테이블 언락을 시키는 것이 좋지 않을까요?
lock table table_name to row exclusive mode
begin
.....
commit
lock table table_name to row share mode
대략 이런 정도의 흐름으로 하면 되지 않을까요?
|