IBM DB2 CLI 에서 stmt 핸들 free 시점과 lock해제

IsExist의 이미지

SQLAllocHandle() 호출로 STMT handle을 할당하고
SELECT ... FOR UPDATE 문을 호출합니다.

BindCol 함수를 호출하고 SQLFetch()을 호출합니다.

이후 데이타 가져오는것이 완료되고 하지만 FOR UPDATE 문으로
인해 해당 레코드가 잠기게 됩니다.

이때 SQLFreeStmt 호출로 할당한 핸들을 해제해도 lock된
레코드는 여전히 lock이 유지되나요?

AUTOCOMMIT 은 현재 OFF로 사용하고 있습니다.

DB2 문서만 참고하면서 포팅을 하는중이라 저부분이 애매하군요.
실제 포팅이 완료된 후에 테스트 해볼 상황이라 현재 직접 테스트는
못해보고 있습니다.

김성진의 이미지

DB2에도 select for update 구문이 있나보죠?

DB2는 SVCC(single version concurrency control) 기법을 사용하기 때문에

명시적으로 commit을 하지 않는한 해당 record의 lock이 풀리지 않습니다.

물론 isolation level에 따라 동작이 달라지지만, commit read의 경우에는

해당 커서가 종료되면, 자동으로 lock을 모두 해제하게 될 것이고,

만일 repeatable read나 serializable(no phantom read)의 경우에는

commit될 때 까지 lock이 풀리지 않습니다.

오라클의 경우에는 MVCC(multi version concurrency control)이라고 하고,

최근에 snapshot based isolation 이라는 이름으로 표준화(?)된 것이라,

select가 lock과 무관하게 동작합니다.

제가 이해하기로는 select for update는

오라클과 같은 MVCC환경에서 select 연산에 대한 repeatable read를 지원하기 위해

별도로 고안된 연산이라고 알고 있고, 이것이 DB2에서 어떤 의미를 갖는지 좀 의아하네요.

DB2에서 select for update가 commit read isolation level에서 해당

레코드에 대해 미리 X lock을 잡고 이것이 commit시 까지 유지된다고 한다면

의미가 있을 수도 있겠네요.

중언부언했을지도 모르겠는데, 도움이 되시길.

김성진

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

IsExist의 이미지

답변 감사합니다. 조금 정리가 되는군요.

v9 SQL Reference Vol.1 문서를 참고하고 있습니다.
SELECT 구문에서 FOR UPDATE 절이 나오는걸로 되어 있지만 언급한데로
그 자체가 oracle 처럼 row lock을 지원하는 구문이라는 언급은 없군요.
(구분 자체가 있어서 oracle과 동일할 것이라고 제가 오해 했습니다)

대신 lock-request-clause 가 있어서 명시적으로 lock을 지정할 수 있군요.
FOR UPDATE 대신 는 USE AND KEEP EXCLUSIVE LOCKS 문을 사용하면 될 것 같습니다.

헌데 질문에서는 그것보다는 lock을 하는 sql문을 호출하기 위해
SQL_HANDLE_STMT을 할당하고 그 핸들로 sql문이 실행되고 fetch 까지
된후에 핸들을 해제해도 여전히 lock이 유지되는지 여부가 문제입니다.

샘플이나 문서의 내용에서는 일관성 있게 SQLEndTran()호출하고 SQLFreeHandle()
을 호출하거든요(sql1 지칭). 제가 사용하는건 SQLEndTran() 전에 다른 함수에서 또다른
sql문으로 실행하고(sql2 지칭) 그 sql문이 성공한 후에 SQLEndTran()을 호출하기 때문입니다.

간략히 정리하자면

main_job():
   sql1_실행_함수 호출; // 특정 테이블 lock
   sql2_실행_함수 호출;
 
   if (sql2_실행 성공?)
      commit;
   else
      rollback;

sql1_실행_함수에서 sql1을 실행하기 위해 stmt 핸들을 할당하지만
함수가 리턴되기전에 stmt 핸들을 해제한다면 lock이 풀릴 수 있는가?
라는 문제가 제 고민입니다. stmt 핸들의 해제와 상관없이 유지가 된다면
많은 포팅 함수내부에서 stmt을 할당하고 해제하는걸로 변환하면
되고 그렇지 않다면 EndTran() 호출시점에 맞춰서 일괄적으로 stmt을
해제하게 코딩해야 한다는 점입니다.

50% 코딩한 상태에서 이런 문제를 알게된 것이라 고민스럽군요.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.