Background Image

FORUM

조회 수 9098 추천 수 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 579
102 AVG 함수관련 질문드려요 1 구름마음 2013.06.10 13461
101 AUTO_INCREMENT 컬럼 이용시 2 hyperhand 2009.12.22 16913
100 ARRAY 데이터 타입에 대한 SQL 질문 3 지용 2010.10.08 10049
99 AIX에 CUBRID 설치 후 오류사항 문의 1 최명호 2015.06.02 7621
98 ADO이용시 OLEDB Driver에러 2 flypig 2010.01.29 15494
97 ADO.net 또는 ODBC에 대한 질문입니다. 12 세스카 2012.03.20 13255
96 ADO.net Driver 변경 시 cascci.dll 로드할 수 없다는 오류 1 물병 2017.07.25 329
95 ADO.Net 사용중입니다. 상태확인 방법을 알고 싶습니다. 1 CUCUCUCU 2015.10.22 5657
94 ADO.NET에서 자바 저장함수 호출 2 kdknim21 2014.11.01 8176
93 ADO.NET 을 비쥬얼 스튜디오에 연결하기... 4 희나람 2012.02.12 11658
92 ADO.NET 드라이버 집합형 데이터 지원 2 소라게 2012.02.09 39813
91 ADO.NET 관련 질문 1 할리 2015.10.30 6423
90 ADO.NET dll 참조 2 abc12 2018.10.04 353
89 ADO.NET cascci.dll 64Bit, field name/type 오류 2 할리 2016.01.21 6571
88 ADO.NET cascci.dll 64Bit 관련 1 할리 2015.11.06 6091
87 ADO.NET 4.5 SQL query의 칼럼이름가져오기 1 allis 2017.09.06 225
86 ADO.NET "Invalid buffer position!" 오류 1 file 할리 2014.07.17 7421
85 ADO update관련 문의드립니다. 1 SD2 2014.01.26 7650
84 ADD_MONTHS 함수의 사용 1 체리필터 2009.06.25 16009
83 ADD AFTER, FIRST 명령어와 ALTER MODIFY, CHANGE 문제 1 무냉채 2017.03.01 9273
Board Pagination Prev 1 ... 146 147 148 149 150 151 152 153 154 155 156 Next
/ 156

Contact Cubrid

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