database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 22429 게시물 읽기
No. 22429
innodb가 정말 제대로 트랜젝션 처리가 되는가요?
작성자
윤기호
작성일
2004-09-21 17:36ⓒ
2004-09-21 17:39ⓜ
조회수
4,912

이런경우가 있나요?

 

* 개발환경: 리눅스,inno-db, c/s(파워빌더)

* 문제점: A사용자가 업데이트한 내용이 B 유저가 아무리

조회해도 반영이 안됨, A유저는 재조회시 데이타가 잘

수정되고, 조회도 잘됨...

* B유저는 DB커낵선을 끊고 재접속하면 업데이트 한

내용이 반영됨...정말 미치긋네.. 공짜라기에 썻는데

*개발을 오랬동안 했지만, 이런 해괴한 현상은 첨이네요

DB가 허접한것인가?

* 누구 이런 현상에 대한 처리방법도 알려주세요.

내부처리 프로세스가 복잡하여, 트랜젝션 처리는 반드시 필요

합니다.. MSSQL로 변경할까... 심각한 고민중

* INNODB 정말로 제대로 트랜젝션이 처리가 되는지 몹시 궁금해짐

--> 문제점을 찾기보다는 DB를 바꾸는것이 빠를까요?

 

* 웹의 경우는 당연시 접속할때마다, 커넥션을 붙였다 끊었다 하니깐, 상관없지만, 기업업무처리는

  한번 커넥션을 붙이면, 세션으로 관리가 되어야 하는것이 아닌가요?.... 다른 db는 그렇던데

 

이 글에 대한 댓글이 총 8건 있습니다.

mysql이 그렇게 허접한 db는 아닙니다.

 

변경후 commit은 하셨나요?

김병훈님이 2004-09-21 18:10에 작성한 댓글입니다. Edit

혹시 프로그램상에서 commit이 빠져있는건 아닌지,,프로그램에서 종료시 반환되는 값은 정상인지..먼저 프로그램을 정확히 짚어보십시요..

 

제가 dba로 있는 프로젝트에서도 개발자들이 쫒아와서 안됀다구 난리치고, 자세히 뒤져보면 프로그램에서 반환을 못시켜주더라구요..분산트랜잭션은 정확한 프로그래밍을 필요로 하는것 같습니다.

 

이상 저두초보라^^ ..이론적인 도움은 못드리고, 원론만 ^^

나두초보님이 2004-09-21 18:11에 작성한 댓글입니다. Edit

저도 이번에 mysql처음 작업해봤습니다.

fk, 트랜젝션 지원안되서. 깜짝놀랐었죠..

그러다나 InnoDB란걸 쓰게 되었고..

현재 오픈은 하지않았는데.. 

버그는 발견하지 못했습니다.

mysql버전 : 4.0.16-standard

 

혹시 정상적으로 사용하시다가 발견되는 버그 있으시면

같이 고민하시지요..

 

김병훈님이 2004-09-21 22:01에 작성한 댓글입니다. Edit

문제를 제기한 사람인데요.. 프로그램은 정상적으로 작성이 되어있읍니다( 개발경력이 12년이 넘습니다.)

commit처리 정확하고( 설마 select에서도 commit처리를 해야 하지는
않겠지요? ,  만약 commit이 잘못되면, B유저는(A유저는 그대로 있고)재접속시는 왜 잘될까요.. )..

* 제생각엔 Innodb에서 유저별로 별도의 workarea를 잡아서 처리하는것 같네요.. (db의 시스템정보를 자세히 확인하는 방법을 몰라서 추측임),  결론은 웹환경처럼 매번 커넥션을 맺는 경우는 전혀 문제없이 트랜젹센을 처리할수 있지만, 기업업무처럼 한번커넥션을 맺고, 지속적으로 사용하는 경우에는 어떤식으로 해결해야 할지 막막합니다.  

-----------------------------------------------------------

어제 고심끝에 innodb를 myisam으로 변환하여 보았습니다.

그랬더니 전혀 문제없이 잘 처리가 되네요(프로그램은 전혀 손보지

않았음), 또 프로그램에서 처리단위마다 reconnect문을 넣으면

해결되겠지만, 그건 다른 개체의 데이타정보도 같이 잃어버려서

적용은 불가능하고요.)

 

* 쩝, 그래서 고객에게 양해를 구하고 당분간은 버티기로 했습니다.

  트랜젼섹처리중에 오류가 발생되면, 찌꺼기 데이타가 생기니

  연락을 꼭 해주십사하고요.... rollback이 안되네 어쩔수 없이

  문제가 생기면 수작업으로 해야죠..myisam 환경에서는요..

* 솔직히 innodb는 문제가 있는거 같습니다.  개발시에도 파워빌더의

  데이타윈도우에서 sql문 확인하여 sql문장작성하는 곳으로 넘기면

  화면이 안뜨고(특히, as 등 알리아스나 그룹문으로 작성시) 개발pc

 및 서버의 부하가 엄청걸리죠...  pc와 서버가 거의 마비상태로..)

  그것도 pc마다 처리가 잘되는 것도 있고, 그렇지 못한것도 있고

  하여간, 공짜db쓸려다... 엄청 공부했습니다. 이럴현상 피해서 개발

 할려니, 별의별 장구굴리고, 노가다가 다 드네요..

 

 

 

윤기호님이 2004-09-22 13:32에 작성한 댓글입니다.
이 댓글은 2004-09-22 13:51에 마지막으로 수정되었습니다. Edit

그냥 생각컨데 기업환경의 데이터를 MySql에게 맡긴다는 것이 쫌 불안한 출발이 아닌듯 합니다. 왜냐믄 Constraint가 DB의 생명인데 말이죠..

 

저도 한때 Inno-db라는 이상한 넘이라는 대안을 사용해 열심히 개발하다가, 내가 정말 이노디비를 믿고 개발하는것이 얼마나 잘 쓸수 있을까 라는 생각이 진지하게 들더군요.

 

그래서 그냥 안정적이고 대중적인 MyISAM으로 하고 (저는 주로 웹일을 하지만 웹에서 특히 쇼핑몰인경우 Constraint 처리가 꼭 필요합니다. 완전히 테이블 1개 써서 통테이블에 데이터를 쫘르륵 않넣을라면) Constraint만 웹프로그래밍에서 함수로 구현하였습니다. -,.-;V

 

트랜잭션도 해 보니 프로그래밍상에서 구현할 수 도 있겠더군요. 통 락이 필요하지만요. .. 머 어카겠습니까. 100% 동작을 확인도 못하고 (다수의 컨낵션이 발생해서 한개의 DB를 수정하므로) 그저 개발자들끼리 는 Constraint가 지켜지는것만으로 없는것 보단 낫겠거니 하고 씁니다.

 

만일 전용서버환경의 프로그램을 쓴다면 전 당근 공짜 postgresql쓰겠습니다.

 

만일 이노디비가 그렇게 문제를 일으킨다면 아마도 세션마다 임시 테이블스페이스에 데이타블럭을 가져온게 다음번 세션이 연결될때까지 충실하게 아이솔레이트해 주는것 같은데,.. 정 안되면 모.. 쿼리마다 매번 커낵션을 연결해야죠. ^^ 웹처럼.. 웹도 그렇게 쓰는디.. ^^

김대성님이 2004-09-22 19:42에 작성한 댓글입니다. Edit

김대성님 댓글 감사합니다.

사실 제가 조그마한 사업을 하는 친구를 위해서 개발을 해주었는데

투자를 많이 하게 할수 없어서,  mysql에 대한 사전지식없이 주위에서

갠찮다는 이야기만 듣고는 적용했는데,  휴,..증말 댓가를 많이 치루

네요..(특히 뷰가 없어서 로직으로 처리할려니 퍼포먼스가 장난이

아니고, 인라인뷰는 지원하는거 같지만, 영 찜찜해서 포기했고요)

 

혹시 추천해 주신 postgreSql을 추천해 주시어 감사하고요..

postgrsql함 체크해보고 안되면, mssql을 울면서 살야긋네요..

 

윤기호님이 2004-09-23 17:35에 작성한 댓글입니다. Edit

(참고로 저는 innodb 도입을 위해 심각하게 공부하고 있는 중입니다.

실제 innodb로 작업을 해보지는 않았구요.)

 

이 문제는 isolation level 에 관련된 문제입니다.

 

MySQL 매뉴얼의 16.11. InnoDB Transaction Model and Locking 섹션을 보시면 자세하게 설명되어있습니다.

 

디폴트 isolation level 은 REPEATABLE READ 인데 이 경우

 

select 문은 스냅샷을 만들어서 결과를 리턴합니다. 그리고 같은 트랜잭션의 select 문들은 그 스냅샷을 계속 사용합니다. 커밋되기 전까지는요..

 

그러니까 말씀하신 문제는 A가 커밋하기 전에 B가 select 문을 수행해서 A의 결과가 적용되기 전의 내용으로 스냅샷이 만들어졌기 때문입니다.

 

방법은 B가 commit 을 해주거나 rollback 해서 새로 트랜잭션을 시작하거나, autocommit 모드로 동작하게 하거나, isolation level을 바꿔줘야합니다.

 

SET TRANSACTION ISOLATION LEVEL READ COMMITED

 

로 하시면 B도 A가 커밋한 내용을 읽을수 있습니다.

 

http://dev.mysql.com/doc/mysql/en/InnoDB_transaction_model.html

이대규님이 2004-10-02 16:36에 작성한 댓글입니다. Edit

2004년글을 2005년에 읽고 있습니다. 저도 노가다 하고 있는데요.

다른분께 개발을 돈안들이고 해줄려다가 같은 상황에 접하게 되었습니다.

 

이대규님 말씀대로 하니까 잘됩니다.

저도 파빌로 해보고 있구요

분명히 트랜젝션처리는 됩니다.

 set global transaction ....... read committed;  이구문을 사용하되

그래도 안되면 rollback 또는 commit후에 에러코드를 꼭  체크 해보세요

mysql에서 db를 한번 connect한다 하더라도

분명히 처리된다는것을 확인하였습니다. 

나선광(eskimo9)님이 2005-04-30 12:48에 작성한 댓글입니다.
이 댓글은 2005-05-01 09:01에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
22432한글이 이상해요.
김민정
2004-09-21
1214
22431트랜잭션 관련 Query 예제. [2]
강재희
2004-09-21
2764
22430간단한 MYSQL Error 입니다... 한번 봐 주세여... [2]
윤창기
2004-09-21
1489
22429innodb가 정말 제대로 트랜젝션 처리가 되는가요? [8]
윤기호
2004-09-21
4912
22428동일 구조의 테이블에서의 데이터 이동 ...
곤지
2004-09-21
1336
22427MySQL과 응용 프로그램의 linking
김택윤
2004-09-21
1004
22423JOIN ON과 WHERE절의 차이점은 어떤건가여? [1]
궁금녀
2004-09-20
1511
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다