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
운영게시판
최근게시물
MS-SQL Q&A 1638 게시물 읽기
No. 1638
테이블에 락 걸기...
작성자
포비
작성일
2004-10-27 12:01
조회수
7,150

DB 서버 한대와

클라이언트 두대가 있습니다.

언어는 비베로 되어있구요...

문제는

한쪽 클라이언트에서 디비에서 일련번호를 얻어와서 증가시킨후

insert 하는 중에

다른 한쪽에서 read 를 해버려서

일련번호가 중복되는 경우가 생긴다는 점입니다.

insert 시 테이블에 read도 안되게 락을 걸면 될 것 같은데...

Mssql과 비베를 사용해서 할 때 이런 문제점 해결을 위한 힌트 좀 부탁드리겠습니다.

가급적 소스 수정 없이 디비차원에서 하면 좋을 텐데...

방법이 없다면 소스라도 수정해야죠..ㅡㅡㅋ

 

고수님들의 조언 기다립니다...

 

좋은 하루되세요..

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

우선 왜 그런 현상이 일어난 건지에 대한 정확한 진단이 필요하겠지요.

그 이유가 적은 부분과 같다면

DB차원에서 할 수 있는 부분보다는 소스상에서 처리해야 할 문제인것 같습니다.

문제의 해결점은 Lock, Transaction(Transaction Isolation Level)과 관련됩니다.

Lock은 그 몇가지의 Level을 가집니다.

간단하게 특징을 지워 설명하자면

Level                       나타나는 문제               Tran Isolation Level

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

Level 0                   Dirty Read                      Read Uncommitted

                             Non-Repeatable Read

                             Phantom Read

Level 1                   Non-Repeatable Read     ReadCommited

                             Phantom Read

Level 2                   Phantom Read                Repeaable Read

Level 3                                                        Serializable

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

 

dirty read : 다른 트랜잭션이 commit  되지 않은 값을 읽어들임

non-reapeat : 반복적으로 읽었을 때 서로 다른 값이 올수 있슴

Phantom Read : 어떤 범위에 해당하는 값을 가져왔을 때 없던 값이

                       갑자기 나타나거나, 있던것이 사라질수 있음

 

레벨이 높아지면 높아질수록 아래 단계에서 발생하는 문제는 사라지게 됩니다.

그러나 일반적으로 고립화 수준이 낮을 수록 성은 좋지만, 데이터의 안정성은 약해집니다.

 

Transaction isolaction level을 선택하는 것은 포비님의 몫으로 돌리고 간단한 한가지만 샘플로 보여드리겠습니다.

 

당연 Transaction을 사용하셔야 합니다.

set Trasaction isolation level Read uncommited

dirty read를 하지 않겠다는 것입니다. ^^  아마 포비님의 경우에 해당하지 않을까 하여 이 샘플을 보여드립니다.

화이팅하세요. ^^

 

여리님이 2004-10-27 13:16에 작성한 댓글입니다. Edit

여리님 감사합니다.

트래잭션의 처리가 이렇게 크리티컬한 프로그램은 처음인지라

한가지만 더 문의 드리겠습니다.

여리님이 말씀하신데로 트랜잭션의 아이솔레이션 레벨을 설정하여

주었을 때 반대쪽 프로그램쪽에서는 에러 메세지가 발생하는지요?

아니면 자동적으로 아이솔레이션이 풀릴때까지 대기하게 되는지요?

 

좋은 하루되세요...

포비님이 2004-10-27 14:02에 작성한 댓글입니다. Edit

Transaction은 실제 isolation level을 지정하지 않아도 lock이 걸린 효과를 발휘합니다.

이를 묵시적 락 (implict lock <- 스팰이 기억나지 않음)이라고 하는데요,

이는 락을 걸어 에러가 나게 하는 것이 목표가 아니라

그 프로시져를 실행하고 있는 클라이언트에게 정확한 데이터를 주기위함입니다.

다시 말해 데이터를 읽고 처리하는 정도의 트랜잭션을 걸었다면

다른 유저가 중간에 끼어들어(데이터를 읽은 후 업데이트를 하기 전)

처리하지 못하게 락을 거는 겁니다. 그 트랜잭션의 과정을 마치면

다른 유저 또한 자연스럽게 트랜잭션에 들어가서 안정적으로 데이터를

받게 되겠지요 ^^

 

그렇다면 lock을 걸어 transaction을 고립시키면 그게 영원히 고립이 되는가?

그렇지 않습니다. 그 트랜잭션을 마치고 나면 당연 이 고립의 수준은

트랜잭션과 함께 종료가 됩니다.

(제가 알기로는요, on_line help를 한번 보시기 바랍니다.) 

그리고 lock은 레벨과 함께 또한 호환성, 잠금의 세기등 여러가지 옵션을 가지고 있는데 그와 관련된 것은 세밀히 공부하심을 추천합니다. ^^

 

 

여리님이 2004-10-27 15:31에 작성한 댓글입니다.
이 댓글은 2004-10-27 15:35에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1642top 관련 질문과.. 또다른 질문요... [1]
정연우
2004-10-28
3435
1641ODBC Drivers error '80004005' [1]
weby
2004-10-27
8294
1640ALTER 질문요..
YooNo
2004-10-27
3065
1638테이블에 락 걸기... [3]
포비
2004-10-27
7150
1637기존테이블을 리모트로 다른sql 서버에 copy ? [1]
블랑카
2004-10-27
3267
1636[조언 부탁드립니다.^^;]
윤태주
2004-10-26
2998
1635생성된 디비 이름 변경이 가능한가요? [1]
소병민
2004-10-26
2320
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다