C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[16620] Re:초보질문] Table(db파일)을 동시에 Read/Write할때 처리문제..
김상구.패패루 [peperu] 1542 읽음    2002-03-22 01:27
음.. 이건 Database의 기본에 해당되는 것인데..
전부 다 설명드리기엔 너무 양이 많을 것 같고..
DB에서는 기본적으로 Buffering과 Locking을 사용합니다.
Locking에는 크게 성격에 따른 2가지 부류, 즉, Optimistic(낙천적) lock과 pessimistic(비관적) lock으로 나누어지고, 범위에 따른 2가지 부류, 즉 Record lock과 Table lock으로 나누어집니다.

낙천적 레코드락, 낙천적 테이블락, 비관적 레코드락, 비관적 테이블락, 이렇게 4가지 조합이 가능하죠.

낙천적이라 함은.. 그야말로 낙천적이라는건데..
내가 어떤 자료를 고치는 동안 다른 사람이 그걸 건드릴 가능성이 매우 낮다고.. 낙천적으로 보는겁니다. 따라서 이 경우 데이터를 수정하기 시작하면, 그 시점의 모든 데이터를 버퍼로 일단 가져는 오되, 락을 걸지는 않습니다. 수정이 다 끝나고 Post를 시키는 순간, Locking을 시도하죠. 만약, 처음 가져왔을 때와 비교해서 내용이 변경되지 않았고 다른 프로세스에서 Lock을 걸지 않았다면 성공하는겁니다.
Reading이 빈번하고 Writing이 거의 없는 자료에 대해 매우 효과적이며, 속도가 매우 빠른 장점이 있습니다.
물론, Lock를 Record Lock을 걸 경우, 성공확률이 높겠죠. 하지만, 많은 레코드를 짧은 시간에 고치는 경우에는 위험할 수 있습니다. 이런 경우 Table Lock을 거는 것이 유리할 수 있습니다.

비관적이라는 것은.. 워낙에 수정이 많이 일어나기 때문에 내가 고치는 동안에 다른 프로세스가 락을 걸어버릴 가능성이 높다.. 고 판단하는.. 지극히 비관적인 관점을 가지는겁니다.
이런 경우 수정을 시작할 때 먼저 Lock부터 걸고, 데이터를 버퍼로 가져옵니다. 수정을 하는 동안 계속 Lock이 걸려 있고, 다른 프로세스는 건들지 못하죠. 수정을 마치고 Post를 수행하면, 수정된 내용을 안전하게 반영시키고, Lock을 풀게 됩니다.
당연히, 성능은 많이 떨어지게 됩니다. 역시 레코드락과 테이블락 모두 적용 가능합니다.

어느 방식으로 Lock을 걸어야 하는지는.. 전적으로 프로세스의 성격에 의존합니다.
DB쪽 경험이 많으신 분들은 이러한 기술을 절묘하게 조화시키죠. 그게 DB프로그래밍의 전부라고 보셔도 무방할 만큼 아주 중요한 문제입니다.

흔히 멀티쓰레드 프로그램을 작성할 때 세마포머나 크리티컬섹션, 뮤텍스 등을 쓰게 되는데 이런 DB프로그래밍과 유사한 점이 많다고 할 수 있습니다.

아무튼, 이런 내용은 단시간내에 완전하게 습득하기는 어려우니 본격적으로 DB쪽을 공부하시는게 두고두고 도움이 될 겁니다.

SQL을 쓰는 것도 좋은 해결 방법이지만, 사실 SQL의 성능이라는 것은.. 직접적인 버퍼링 기술에 비하면 많이 떨어집니다. 쓰기 쉽다는 것 외에는..
마치 C에서 극한의 메모리 관리를 하면 성능이 엄청나게 우수해 지지만 사람이 피곤한 것과 비슷한 관계일까요? ^^


백상열 님이 쓰신 글 :
: 볼랜드 C++빌더용 Table의 Read/Write에 대해 공부하고있습니다.
:
: 제가 만들어둔 Table1을 여러사람이 동시에 Read/Write할경우에
: 가령, a님이 Table1을 Read하고 동시에 b님이 Table1을 Write할때 어떻게되는지...
: 또는 a님이 Table1을 Write하고 동시에 b님이 Table1을 Write할때 어떻게되는지
: 많이 궁금합니다.
:
: 제가 원하는것은, a와 b가 동시에 하나의 Table1을 R/W할경우,
: 에러로 중단하지않고 (어차피 데이타r/w는 잠깐이므로) 어느한쪽이 잠깐 기다렸다가
: 다른한쪽이 r/w한후 이어서 자신도 R/W 하도록 할수있으면 좋겠습니다.
: 그런방법이 있을까요 ? 어떻게하면 좋은지 아시는분 있나요 ?
:
: 둘다 동시에 R/W하다가는 자료의 무결성을 지키지못하거나,
: 에러가걸려 엉망이 될수도 있으니깐 말입니다.
:
: 참, 그리고..
: 두사람이 한 Table1을 동시에 Read할경우, 에러없이 동시에 Read가 가능한지요?
: 아시는분은 답장부탁합니다. 꾸벅~

+ -

관련 글 리스트
16615 초보질문] Table(db파일)을 동시에 Read/Write할때 처리문제.. 백상열 1251 2002/03/21
16620     Re:초보질문] Table(db파일)을 동시에 Read/Write할때 처리문제.. 김상구.패패루 1542 2002/03/22
16654         Re: 답변 감사 ! 혹시 힌트라도 좋으니 참고할만한 소스는 어디구할수없을까요? 백상열 1145 2002/03/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.