Background Image

FORUM

조회 수 9088 추천 수 0 댓글 10
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제

안녕하세요 이번에 큐브리드를 8.2에서 8.4로 업그레이드를 했습니다.

마이그레이션과 다른 부분은 다 잘 작동을 하는데.

 

쿼리를 cci로 실행을 할때.

 

cci_execute에러가.

 query(update table_a set column_b = 0 where column_c = 'test' and column_d <> 0), Error(-72), ErrorMsg(Your transaction (index 8, test@myskysy|29822) has been unilaterally aborted by the system.

라고 발생합니다.

 

8.2에서는 같은 코드로 발생을 하지 않았는데 8.4에서 발생을 했고.

cubrid.conf 파일의 설정 내용은 똑같이 맞췄습니다.

 

코드상에서.

int iRes = cci_execute(iRequestHandle, 0, 0, &error);

if(iRes < 0)
    return false;

 

의 코드를 아래와 같이 수정해서 cci_execute를 다시 한번 실행해볼경우는 정상적으로 처리가 됩니다.

 

int iRes = cci_execute(iRequestHandle, 0, 0, &error);

if(iRes < 0)
{

    iRes = cci_execute(iRequestHandle, 0, 0, &error);
    if(iRes < 0)

         return false;

}

 

unilaterally관련 에러가 deadlock관련이 있다고 글이 찾아지는데 혹시 cci로 쿼리를 할때 lock이 걸린경우.

일정시간기다려본 다음에 fail을 내거나 하는 옵션이 있는지 궁금합니다.

  • ?
    cubebridge 2011.09.24 08:30

    안녕하세요.

    큐브리드를 사용해 주셔서 감사합니다. 문의하신 내용에 대하여 빠른 시일 내에 확인하여 알려드리도록 노력하겠습니다.

  • ?
    cgkang 2011.09.27 01:11

    문의 주신 상황이 deadlock이 맞는것 같습니다.

    deadlock은 버전에 관계없이 동시에 어떤 트랜잭션이 진행되었는지에 따라 발생할 수 있습니다.

    deadlock이 발생하면 서버에서 자동으로 하나의 트랜잭션을 강제로 롤백시키고 에러를 리턴하게 됩니다.

    지금 코딩하신것처럼 에러가 발생한 트랜잭션을 재수행하면 대부분 성공하게 될것이므로

    응용에서 retry하는 코드를 넣어주시는게 가장 좋은 해결책이 될것으로 생각됩니다.

     

  • ?
    천상하늘 2011.09.28 03:07

    위의 예의 쿼리가 서로 다른 프로세서에서 거의 동시에 이루어지기때문에 발생하는 문제 같은데요.

    retry를 하도록 수정은 해놨지만 쿼리를 실행함에 따라서 lock이 걸린다면. 다른 프로세서에서 수행하는 쿼리는 lock동안.

    얼마동안이라도 대기를 한 다음에 그 대기동안도 lock이 안 풀린다면 fail을 리턴해야하지 않을까 생각됩니다.

     

    c-api를 사용했을경우는 고의적으로 deadlock을 만들경우 해당 부분에서 프로세서가 무한대기를 하고 서있는 문제때문에

    cubrid_broker.conf에 보면
    SESSION_TIMEOUT값을 셋팅할수 있게 되어있는데 해당값을 300을 설정해두면 300초간 대기를 한 후에 리턴이 되는걸로 알고있는데.

    해당 부분이 작동이 안되는건 아닌지 싶습니다.

     

    실패를 리턴하게 되면 retry시에도 같은 문제로 또 실패를 할수 있는 부분이고

    그런경우 응용단에서 언제까지 재수행을 하고있어야하는지..

    다른 문제로 실패가 났기때문에 응용단에 요청에서 실패처리를 하고 처리로직을 돌려야하는지..

    기다렸다가 다시 시도를 해봐야하는지 알수가 없기때문에 문제가 있을것 같습니다.

     

    8.2에서는 위의 경우처럼 서로다른 프로세서에서 위의 예에 있는 쿼리를 거의 동시에 수행을 하더라도 일어나지 않았던 문제라서.

    문의드립니다.

  • ?
    cgkang 2011.09.28 16:34

    lock 대기 시간을 결정하는 파라미터는 cubrid.conf 에서 lock_timeout_in_secs 입니다.

    락을 대기해야 하는 상황에서 설정한 시간만큼 기다리는 동안 락을 획득하지 못하면 에러를 리턴하게 됩니다.

    디폴트는 -1 (무한대기)입니다.

    lock timeout설정과 deadlock은 별개 입니다. lock timeout이 되기전에 deadlock이 발견되면 즉시 하나를 철회시킵니다.

    응용에서 몇번이나 retry를 할지는 몇초만에 에러를 줘야 하는지등에 따라 응용에서 정하면 될 사항으로 보입니다.

    대부분 첫번째 retry에서 성공할 것으로 보이지만, 부하와 데이터 패턴에 따라 락이 대기하는 상황이 달라질수 있을것입니다.

    cci로 수행할 경우에는 cci_execute의 인자로 넘겨준 &error 구조체에 DB서버의 에러 정보를 반환해 줍니다.

    DB서버에서 발생한 에러코드를 보고 lock관련 에러면 retry해준다거나 적절히 판단할 수 있을 것으로 생각됩니다.

     

    참고로 질문내용중의 SESSION_TIMEOUT은

    cci에서 트랜잭션을 진행중인 상태에서 아무 요청을 보내지 않고 있을때, 브로커에서 강제로 세션을 끊는 시간을 설정하는 것입니다.

     

  • ?
    천상하늘 2011.09.28 18:46

    아.. 답변 감사합니다. 말씀해주신 lock_timeout_in_secs는 -1로 잡혀있습니다. 그런걸 보면 lock_timeout의 문제는 아닌것 같은데.

    해당 상황이. 프로그램을 강제로 종료할때.

    프로그램이 킬되는 시그널을 받아서 그때 디비에 마지막으로 처리를 해주는 경우에 발생을 하는데

     

    테스트를 위해서 서버에 접속해 있는 클라이언트가 하나도 없게 한 다음에 해당 쿼리를 실행하게 되면 0건의 update가 일어나게 해도 간간히 일어나서 어디서 deadlock이 되는지.. 혹시 다른 쿼리들이 영향을 미치나 찾아봐야겠습니다.

     

    답변 감사합니다.

  • ?
    cgkang 2011.09.28 19:38

    cubrid.conf에서 error_log_level 파라미터를 notification 으로 설정하고 재구동하면

    에러외에 DB서버의 notification 메시지도 에러 파일에 찍히게 됩니다.

    deadlock이 발생할 경우 어떤 프로세스가 deadlokc에 연관되어 있는지 정보를 추가로 볼 수 있는데,

    cas프로세스인 경우 브로커의 sql로그를 통해 해당 시점의 쿼리를 확인할 수 있을것입니다.

     

    $CUBRID/log/server 가 DB 서버 에러로그가 저장되는 곳이고,

    $CUBRID/log/broker/sql_log가 디폴트로 저장되는 브로커의 sql로그 디렉토리입니다.

    참고하시기 바랍니다.

  • ?
    천상하늘 2011.09.28 20:07

    네. 감사합니다. 그렇게 설정해서 확인해보겠습니다~

  • ?
    천상하늘 2011.10.13 03:03

    한참을 잊고있다가 지금에서야 테스트를 해봐서 죄송합니다 ;; 그간 일들이 좀 있어서 못해보다가 지금 해봤는데요.

    notification을 설정해두고 테스트를 해봤을때.

     

    sql의 로그는

    10/12 17:56:31.282 (23) prepare 0
    update table_a set column_b = 0 where column_c = 'test' and column_d <> 0

    10/12 17:56:31.282 (23) prepare srv_h_id 1 (PC)
    10/12 17:56:31.283 (23) execute srv_h_id 1 update table_a set column_b = 0 where column_c = 'test' and column_d <> 0
    10/12 17:56:31.784 (23) execute error:-72 tuple 0 time 0.502, EID = 2
    10/12 17:56:31.784 (23) execute srv_h_id 1 update table_a set column_b = 0 where column_c = 'test' and column_d <> 0

    10/12 17:56:31.788 (23) execute 0 tuple 0 time 0.003
    10/12 17:56:31.788 (23) close_req_handle srv_h_id 1
    10/12 17:56:31.788 (24) prepare 0

    와 같이 남고. 해당 시간에 CUBRID/log/server 폴더에 에러는 남지가 않습니다

  • ?
    cgkang 2011.10.13 03:56

    sql log에 찍힌 -72에러는 서버에서 발생한 에러이기 때문에 에러파일에 -72에 대한 에러는 있어야 할 것 같습니다.

    $CUBRID/log/server/<dbname>_<날짜>.err 파일이 서버 에러 로그이므로 에러 파일을 올려주시면 확인해 보도록 하겠습니다.

  • ?
    천상하늘 2011.10.18 01:49

    디비가 설치된 피시의 로그가 아니라 프로세서가 떠있는 피시의 로그가 필요한거였나요?

    위에 적어둔 내용은 디비가 설치된 피시에 있는것들입니다. 해당 날짜에 <dbname>_<날짜>..err파일이 생성이 안되었구요.

    그때 사용했던 프로세서가 있는 피시의 폴더도 확인해봤는데 역시 <dbname>_<날짜>..err파일은 없습니다.

     

    a피시에 디비가 있고 b피시에 프로세서가 있고 b피시의 프로세서를 강제종료하면서 b피시의 프로세서가 위의 update쿼리를 실행하고

    그런 상황일때 a피시의 cubrid/log/server 안의 내용이 위에 로그의 내용입니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID를 사용해 보시기 바랍니다!!! file admin 2019.07.31 380
71 9.1버전 LAST_VALUE함수 지원여부 2 아하하하하 2015.08.17 6502
70 9.1 버전 설치 후 오류 문의 2 secret 장경수 2013.07.09 8
69 9.1 내보내기 / 가져오기 시 기본값. 1 bellstar 2014.05.14 7337
68 9.1 가져오기 / 내보내기 2 bellstar 2014.05.13 9300
» 8.4로 업그레이드후 cci_execute 실패 에러 10 천상하늘 2011.09.23 9088
66 8.44 버전 지원 여부와 9.대로 업그레이드시 안정 버전 문의드립니다. 1 땡땡이 2017.07.06 239
65 8.4.3 32bit의 데이터를 9.1 64bit로 마이그레이션을 하려고 합니다만.. 1 살구맛 2013.04.26 7664
64 8.3.1 --> 9.2 업그레이드 후 한글 깨짐. ( vb6.0 + MS949 ) 2 한종희 2013.12.28 22587
63 8.2.2 버젼 PHP 트랜잭션관련 문의드립니다. 2 secret 반짝이 2014.06.11 7
62 8.2.2 를 8.4.3으로 변경 시 응용 수정 부분 문의 1 freemir 2012.12.07 5723
61 8.2.2 HA 사용시 Master / Slave 간 정보 확인 문제 1 freemir 2013.04.01 9023
60 8.2.2 HA 구성 중 웹 서버의 커넥션이 많을 때 동작에 문제가 있습니다. 2 freemir 2012.10.13 11016
59 8.2.2 HA 구성 중 네트워크 장애 복귀 시 role 전환 문제 3 freemir 2012.03.09 13343
58 8.2.1버전에서 SQuirreL SQL Client 접속 가능한가요? 1 Philip Park 2010.01.26 13272
57 7.1 -> 2008로 업그레이드 하면 문제가 없을까요? 3 헬리 2009.10.07 9794
56 7,1 에서 2008 R2.0 또는 R3.0 으로 마이그레이션 문의 1 마이나스 2010.09.30 7194
55 64bit 9.1버전에서 컬럼 수정시 에러 발생 (에러코드 1046) 1 file 오션나인 2013.08.27 14553
54 64BIT 설치시 오류 7 씩~~ 2008.12.26 41355
53 64 bit 포팅이란? 6 초보대왕 2009.03.31 21824
52 555번 한글테이블 글 올린 사람입니다 (화면캡쳐함) 1 유니콘 2010.02.23 11713
Board Pagination Prev 1 ... 145 146 147 148 149 150 151 152 153 154 Next
/ 154

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales