SQL query의 atomic 성질
글쓴이: lacovnk / 작성시간: 토, 2005/11/05 - 12:09오후
Quote:
id : primary key
data : inttable 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같은데..)
Forums:
transaction을 이용해보세요.
transaction을 이용해보세요.
primary key에 포함된 unique 제약에 위배되므로 해당 쿼리로
primary key에 포함된 unique 제약에 위배되므로 해당 쿼리로 인한 효과는 전부 취소되어야 합니다.
MVCC(Multi-version concurrency control)이 가능한 DBMS라면 이런 동작이 일어나면 4로 변경되는 id가 하나도 없어야 합니다.
제가 mysql을 써본지 오래되긴 했는데 어떤 버전의 mysql을 쓰시는지 몰라도 -.-; 그런 동작을 한다니 의외네요
atomic에 UNDO handler가 지정이 안된 경우에도 except
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
[quote="atie"]그렇지 않은 경우는(MyISAM) 에러는 반환이
이 경우 같습니다.
phpmyadmin으로 보니, storage engine이 myisam으로 되어있군요.
mysql 4.1.1, debian sarge에서 패키지로 설치해서 사용중입니다.
음. 그런데 의외네요. storage engine 따라 다른 행동을 하다니.. 세부 구현이 DBMS마다 다른 건 알고 있었지만, 이것은 좀 심각하게 부족한 것 아닌가요?
댓글 달기