SQL query의 atomic 성질

lacovnk의 이미지

Quote:
id : primary key
data : int

table a

id|data
1|100
2|200

이렇게 있을 때,

update a set id=4; 라는 query을 봅시다.

기본적으로 sql은 tuple단위로 보기 때문에, 한 tuple씩 보면서 처리해야 겠지요?

그렇다면 첫번째 tuple을 (4,100)으로 바꾸고,
두번째 tuple을 (4,200)으로 바꾸면서 "이런! 4가 이미 있잖아! 버럭!"하면서, 에러를 뿜어야 합니다.

한데, 한 query는 atomic해야 하니, 이전 것 까지 되돌려야겠지요 -o-

.... 허나! 허나!

mysql에서 테스트해본 결과, 앞에 것은 바뀝니다. 즉, 두번째 tuple을 바꾸면서 에러를 뿜고, 앞의 것은 되돌리지 않는군요. (바뀐 row의 개수도 알려주지 않습니다 -o-)

atomic하게 실행한다는 개념을 제가 잘못 생각한 것인가요? 중간에 에러가 나면 그 쿼리는 아예 실행 안된 것 처럼 되어야 할 것 같은데.. (primary key가 unique한 것은 결국 하나의 제약조건이니, 잘못된 query같은데..)

익명 사용자의 이미지

transaction을 이용해보세요.

소타의 이미지

primary key에 포함된 unique 제약에 위배되므로 해당 쿼리로 인한 효과는 전부 취소되어야 합니다.
MVCC(Multi-version concurrency control)이 가능한 DBMS라면 이런 동작이 일어나면 4로 변경되는 id가 하나도 없어야 합니다.
제가 mysql을 써본지 오래되긴 했는데 어떤 버전의 mysql을 쓰시는지 몰라도 -.-; 그런 동작을 한다니 의외네요

atie의 이미지

atomic에 UNDO handler가 지정이 안된 경우에도 exception이 발생한 쿼리에서 변경된 레코드는 전부 취소가 되어야 하고, exception 메세지도 쿼리를 호출한 쪽에 전달이 되어야 하는 것이 정상입니다.
확인을 위해서 오라클과 SQL서버에서도 같은 경우를 해보았는데 둘다 위에 쓴대로 동작을 합니다. MySQL(4.1.12)도 table을 생성할 때, type=Innodb로 주면 위에처럼 동작을 하고, 그렇지 않은 경우는(MyISAM) 에러는 반환이 되지만 첫번째 id=4가 된 것을 rollback하지는 않는군요.

----
I paint objects as I think them, not as I see them.
atie's minipage

lacovnk의 이미지

atie wrote:
그렇지 않은 경우는(MyISAM) 에러는 반환이 되지만 첫번째 id=4가 된 것을 rollback하지는 않는군요.

이 경우 같습니다.

phpmyadmin으로 보니, storage engine이 myisam으로 되어있군요.

mysql 4.1.1, debian sarge에서 패키지로 설치해서 사용중입니다.

음. 그런데 의외네요. storage engine 따라 다른 행동을 하다니.. 세부 구현이 DBMS마다 다른 건 알고 있었지만, 이것은 좀 심각하게 부족한 것 아닌가요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.