Background Image

FORUM

조회 수 9125 추천 수 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 안의 내용이 위에 로그의 내용입니다.


  1. SQLGate for CUBRID 영구 무료 라이선스 제공

    Date2020.04.09 Byadmin Views4286
    read more
  2. ResulstSet이 닫혔는데... 닫히는 이유가 먼가요?

    Date2011.06.10 By안지민 Views15605
    Read More
  3. Replication, 서버 이중화, HA

    Date2012.01.26 By승준77 Views23263
    Read More
  4. Release upgrade 문의

    Date2017.02.13 Byyscoma Views9138
    Read More
  5. Redmine 의 데이터베이스로 큐브리드를 사용하는 것이 가능할까요?

    Date2018.04.17 By밝은마음 Views251
    Read More
  6. Redhat 8버전 tls 1.0 에러

    Date2024.01.30 By11시38분 Views112
    Read More
  7. ROW_NUMBER() OVER(PARTITION BY 어떻게..해야 할까요???

    Date2011.09.09 By초식곰 Views26433
    Read More
  8. REUSE_OID 적용 시 이해가 잘안되는 부분이 있어 질문드립니다.

    Date2017.08.23 By덴드로비움 Views1060
    Read More
  9. REST api 지원 여부

    Date2019.08.29 By몰라알수가없어 Views697
    Read More
  10. REPLACE 함수 문의

    Date2019.03.22 By아범 Views1751
    Read More
  11. RDB와 ORDB 벤치마크

    Date2009.04.09 Byrahmat Views19388
    Read More
  12. RANK 함수 관련 질문드립니다.

    Date2013.06.11 By이종진 Views10484
    Read More
  13. R3.1 64비트 서브쿼리 관련 문의 드립니다

    Date2011.06.28 Byhj Views7938
    Read More
  14. R3.0 버전 문의

    Date2010.10.07 By겜기능되거든 Views8070
    Read More
  15. R2.2 에서 트랜잭션과 inser_id()

    Date2014.03.03 By파스크란 Views6156
    Read More
  16. R2.2 에서 엑셀로 보내기가 않되는 것 같습니다.

    Date2010.06.05 By배워볼까 Views9804
    Read More
  17. R1.4->R2.0(64비트)베타 업그레이드 및 마이그레이션후 DB접속불가.

    Date2009.12.21 Byxclass Views11762
    Read More
  18. R1.4 -> R2.2 마이그레이션 중 스키마 로드 에러

    Date2011.12.20 By노랑배 Views7
    Read More
  19. Query execution failure #7264 에러가 무슨에러죠?

    Date2012.10.20 By앙고라 Views9104
    Read More
  20. Query Browser 쿼리질의 에러 발생

    Date2014.03.10 By모냐모냐 Views8740
    Read More
  21. Query Browser Eclipse plug-in 설치시 오류

    Date2014.02.07 By규리 Views11338
    Read More
Board Pagination Prev 1 ... 146 147 148 149 150 151 152 153 154 155 ... 199 Next
/ 199

Contact Cubrid

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