Q&A

  • 일련번호....
어느 테이블에서 일련번호 역할을 하는 값들을 관리해야합니다.
그러니까 그 테이블의 구조는

      Name      |         Value
1.      A                      1
2.      B                      11
3.      C                      3

뭐 이런식이겠죠.
그래서 필요할때는 select쿼리를 던져서 그값을 가져나와서 1을 더한후에
그 값을 사용하고 그 1이 더해진값을 다시 update를 하고..
뭐 그런식으로 쓰고 있습니다... ^^;;

근데 문제는.. 이것을 여러 유저가 사용하는 빈도가 아주 높다는 것입니다.
이게 primary key로 사용되는거라서
절대로 같은 값이 발생되어서는 안되는데... 되고 있는것이죠 *풀썩*

아마도 select쿼리 한번 날리고. update쿼리 날리고.. 해야하니까
이 사이에 텀이 길다보니 발생하는 문제인것 같은데...
어떻게 해결해야할지요?

어떤방법이든 좋습니다.
(이런 테이블을 사용하는것이 전제조건입니다. -.-;;)
조언좀 부탁드립니다.
6  COMMENTS
  • Profile
    단현석 2002.07.06 17:58
    제 생각에는 오라클의 Sequence 같은 기능을 사용하시는 것이 좋을 것 같습니다.

    그리고 답변중에 멀티 유저를 고려하신 답변이 있는데.. 그렇다고 Edit 박스를 쓰는 노가다를 할 수 야 없죠.

    멀티 유저를 생각하신다면 트랙잭션 처리를 해주시면 됩니다. 물론 트랜잭션 처리를 해도 Sequence 기능을 잘 돌아가지요.

    MS-SQL 의 경우에는 Sequence 라고 하지 않고 Generator 라고 하는 것 같네요, 이 기능은 일반적인 예로 게시판에 PK 로 번호를 부여할 때 사용합니다. 님 같은 경우에 사용하면 되겠네요. 시작값부터 일정 값만큼 계속 증가만 하기 때문에 절대 중복될 리가 없습니다. 15자리 정도 잡으면.. 수명이 다 할때 까지 절대 중복될리가 없습니다.

    그럼 도움이 되었길..

  • Profile
    김성민 2002.07.06 18:41

    ------

    먼저.. 답변 감사드립니다. *꾸벅*
    답변주신것중에 여쭤보고싶은게 있는데요..

    트랜잭션처리를 해주시면 된다고 하셨는데..
    어떤식으로 처리하면 되는지요?
    가능하다면 간단한 소스 or 예제를 보고싶습니다^^;
    (트랜잭션 처리를 시도는 해봤는데 전 안되더군요 :_( )
  • Profile
    단현석 2002.07.06 20:07
    트랜잭션 처리란게 별게 아니라.. 사용자가 작업한 데이터 수정, 삭제, 삽입 관련 내용을 클라이언트 캐쉬에 보관하고 있다고 어떠한 시점에서(보통은 저장 버튼 클릭.. 뭐 이렇게 되겠죠..) 한꺼번에 디비에 적용하는 방법입니다. 이럴 경우 자신이 편집한 데이터를 모두 DBMS 에서 알아서 처리하므로 락이 때문에 고생하지 않게 됩니다. (보통 DBMS는 들어오는 작업을 큐에 담아 순차적으로 처리하겠지요. 내가 작업한 내용을 한꺼번에 큐에 담어 버리므로 다른 사람의 작업에 의해 테이블 락이 걸리지 않습니다)
    데이터 베이스 컴포넌트를 활용하는 방법이 정석이겠으나..

    저느 이렇게 보통 사용합니다.

    단일 테이블을 간단히 다루는 경우에 예) SELECT * FROM TABLE1
    이라는 쿼리문을 쿼리 컴포넌트에 담고 그리드에 직접 편집을 합니다. 쿼리에 캐쉬드 없데이트 속성을 True 로 하고 RequestLive 속성을 True 로 설정하고

    저장 시점에 ApplyUpdates 명령어 DB 에세 작업 내용을 전송해 버리면 되죠.

    그리고 CommitUpdates 명령어로 작업한 클라이언트의 캐쉬 데이타 비워주고요..

    데이터베에스 컴포넌트로는

    StartTranjantion 을 걸어(DataBase1.StartTranjaction;) 작업 내용을 우선 캐쉬에 담고 커밋을 날려 한번에 작업 내용을 디비에 보내면 되겠지요.

    현재 그렇게 프로그램하고 있습니다. 문제 없네요^^

    그럼 도움이 되었길 바랍니다.


  • Profile
    양용성 2002.07.06 05:34
    안녕하세요 양용성입니다.
    저 같은 경우에는

    Insert 시
    처음 등록시에는 사용자가 입력 받을땐 일련번호를 먼저 불러오지 않습니다.
    어짜피 사용자는 일련번호를 볼 필요도 없구요.
    사용자가 등록이라는 버튼을 클릭시 그 순간에 바로 일련번호를
    검색하여 일련번호와 함께 데이타를 등록합니다.

    아무리 빈도수가 많더라도 절대 중복될 확율이 없죠

    Update 시에는
    해당 키를 자져와서 작업하는거니깐 문제 없겠죠.

    그리고 여러명이서 동시작업할 경우에는 절대 TTable 컴포넌트를 사용하지
    마시기 바랍니다.

    그리고 DBEdit 이런 컴포넌트도 사용하지 마시길 권장합니다.

    왜냐하면 사용자가 DBEdit 값을 수정하게 되면 해당 필드가 락이 걸려서
    다른 사용자가 업데이트 할수 없습니다.

    그래서 여러명의 동시 사용자일땐 어쩔수 없이 노가다로 그냥 Edit 콤포넌트에
    값을 주죠...

    그리고 등록할때는 무조건 SQL 문을 직접 작성해서 입력하십시오.

    그럼 좋은 결과 기대하겠습니다.

    - 국산 오라클 개발툴의 강자 -
    http://www.sqlgate.com

  • Profile
    김성민 2002.07.06 06:03
    앗. 빠른답변 정말 감사드립니다 *꾸벅*


    -----

    흐음.. 그 일련번호는 유저는 보지 않구요. 물론 입력도 받지 않습니다.
    그냥 내부에서만 사용되는 값입니다. primary key로만..

    일단 제가 쓰고있는 코드입니다.

    function getUniqueValue(inName: String): Integer;
    var
      intResult: Integer;
    begin
      with Query1 do
      begin
        Close;
        SQL.Clear;  
        SQL.Add('SELECT VALUE FROM TABLE1');
        SQL.Add(' WHERE NAME = ' + #39 + inName+ #39);
        // 사실 윗부분은 미리 정의되어있습니다. 할때마다 클리어해서
        // 다시 하는건 아니구요.. 여기선 그냥 편의상 이렇게 했습니다.
        Open;

        Last;
        if RecordCount > 0 then // 실제로 해당레코드가 존재하느냐를 체크..
        begin
           intResult := FieldByName('VALUE').AsInteger + 1;
           // 여기에는 update 쿼리가 있습니다. 바뀐값으로 업데이트를 합니다.
        end else
        begin
           intResult := 1;
           // 여기에는 insert 쿼리가 있습니다. 1값으로 새로 insert를 합니다.
        end;
      end;
      Result := intResult;
    end;

    위 함수는 크게 두 부분으로 나눠볼수 있습니다. 처음에 select 쿼리를 하는
    부분과 update/insert하는 부분...

    근데 문제가 되는것이... (동일한 이름의 값을 가지고올때..)
    A라는 사람이 먼저 이 함수를 호출해서 예를 들어 1이라는 값을 가지고와서
    아직 업데이트를 미처 하기 전에...
    B라는 사람이 이 함수를 호출해서 값을 가지고 오니까 1이 나오는거죠.

    그래서 중복이 되어서 문제가 되는것이죠.
    현재 실제로 발생되고 있는문제이구요...  T.T


  • Profile
    성더기 2002.07.06 18:58
    조위에 답변처럼 필드를 증가필드를 사용하시면 될거 같구요
    이경우에는 아마 굳이 트랜젝션처리를 하지 않으셔두 될듯합니다

    트랜젝션으로 처리를 하실려면 님께서 말씀하신 필드가 PK로 잡혀 있어야한다는 겁니다..

    이경우 PK중복이면 예외처리해서
    하나 증가시킨후 다시 저장하시면 되겠네요..^^
    • 최용일
      2002.07.06 20:15
      안녕하세요. 최용일입니다. 물론 API함수인 RegQueryValueEx를 쓰셔두 되지만 델파이의 TRegistry를 쓰...
    • 손준호
    • 2002.07.06 19:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.06 20:29
      안녕하세요. 최용일입니다. 그냥 1분씩 증가시켜주시면 될텐데요... var     N...
    • 조성택
    • 2002.07.06 11:31
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 안두식
    • 2002.07.06 07:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 송해광
      2002.07.06 08:36
      초보땐 다 그러죠.. Table1 <==  요걸쓴다면 edit1.Text := table1.FieldByName('전...
    • 진성열
      2002.07.06 21:56
      소스 파일 크기는 맞습니다. 큰게 싫다면 ASPACK같은 툴로 exe 자체를 압축하는 방법도 있습니다. a...
    • ji
    • 2002.07.06 06:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.07.06 07:53
      hsr////////////////////////////////////////////// 먼저 ListBox의 속성중 Style을 lbOwnerDrawFixed 나...
    • 하종옥
    • 2002.07.06 05:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.07.06 21:11
      저도 그부분이 궁굼합니다.. 알면 알려주세요..
    • 이호성
    • 2002.07.06 05:41
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김용덕
      2002.07.06 05:54
      안녕하세요. 제가 보기에는 Thread에서 어떤 오류가 있어서 나는 에러같지는 않습니다. source를 보니 ...
    • 이호성
      2002.07.07 07:31
      Synchroniz함수를 빼버리면 스레드 역할을 하지 않나요? 제가 생각하기에는 할것 같은데.. 만약 이 소스...
    • 오현주
    • 2002.07.06 05:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 넘버3
      2002.07.06 05:34
      자료실에 올려놨습니다. 유용하게 사용하십시오. 그러나 지적소유건에 걸리는지는 좀 생각을 해봐야 겠네...
    • 김성민
    • 2002.07.06 04:56
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 단현석
      2002.07.06 17:58
      제 생각에는 오라클의 Sequence 같은 기능을 사용하시는 것이 좋을 것 같습니다. 그리고 답변중에 멀티 ...
    • 김성민
      2002.07.06 18:41
      ------ 먼저.. 답변 감사드립니다. *꾸벅* 답변주신것중에 여쭤보고싶은게 있는데요.. 트랜잭션처...
    • 단현석
      2002.07.06 20:07
      트랜잭션 처리란게 별게 아니라.. 사용자가 작업한 데이터 수정, 삭제, 삽입 관련 내용을 클라이언트 캐쉬...
    • 양용성
      2002.07.06 05:34
      안녕하세요 양용성입니다. 저 같은 경우에는 Insert 시 처음 등록시에는 사용자가 입력 받을땐 일련...
    • 김성민
      2002.07.06 06:03
      앗. 빠른답변 정말 감사드립니다 *꾸벅* ----- 흐음.. 그 일련번호는 유저는 보지 않구요. 물론 입...
    • 성더기
      2002.07.06 18:58
      조위에 답변처럼 필드를 증가필드를 사용하시면 될거 같구요 이경우에는 아마 굳이 트랜젝션처리를 하지 ...
    • 하얀까마귀
      2002.07.06 10:52
      안녕하세요 하얀까마귀 입니다. 인터베이스는 안써봐서 잘모르겠는데. 서버이름이라는게 어떤걸 말씀하...
    • 김명성
      2002.07.07 01:08
      인터베이스의  GDB파일이 있는 경로를 SERVER NAME으로 씁니다. 근데 결국 session에서 읽...
    • 이동현
    • 2002.07.06 03:41
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2002.07.06 03:53
      자식노드를 만든다는 거는 ---한국 |     |---축구 | ---스페인 | ---이탈리...
    • 홍성락
      2002.07.06 03:51
      hsr////////////////////////////////////////////////////////////// TreeView1.Items.AddChild(TreeView...
    • 오소영
    • 2002.07.06 03:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.07.06 03:34
      hsr/////////////////////////////////////////////////////////// assigned를 써보세요 if assigned(For...
    • 조성택
    • 2002.07.06 03:19
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이경문
      2002.07.08 13:01
      http://www.vdream.co.kr 에 관련 컴포넌트가 있습니다. TPCMWaveIn, TPCMWaveOut입니다.
    • 진성열
      2002.07.06 22:01
      MP3 인코더가 어떤 종류의 PCM이나 WAVE를 지원하냐에 달려있겠죠. PCM에는 여러 종류가 있지만 대략 4...
    • 조성택
      2002.07.10 01:01
      무료 mp3 Encoder 가있나요..또 Microsoft PCM 으로 녹음할려면 mp3 인코더가 필요한가요??PCM 녹음하는 ...
    • 김진기
    • 2002.07.06 02:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최종철
    • 2002.07.06 02:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이수연
    • 2002.07.06 02:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 넘버3
      2002.07.06 02:56
      다음과 같이 해보세요. Example입니다. 즐거운 하루되세요. unit LsyEditpas; interface uses &...
    • 이수연
      2002.07.08 18:37
      우선 답변주셔서 매우 감사합니다. 답변주신 내용은 panel에 대한 OnKeyPress인것같아요. editbox의 ev...
    • 개미
    • 2002.07.06 02:14
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 조강수
      2002.07.06 03:24
      문제는 B의 data set 인것 같습니다. join하실때 B의 data set을 dood1만 있는 것으로 만드시면 될듯합...
    • 개미
      2002.07.06 03:52
      답변 감사합니다. 'join하실때 B의 data set을 dood1만 있는 것으로 만드시면 될듯합니다.' 이게 무...
    • 성더기
      2002.07.06 19:08
      그러면  where b.autokey = '첫번째' 하시면 될건데요..
    • 성더기
      2002.07.06 02:35
      distinct A.Code  해주믄 될거 같은데욤..
    • 개미
      2002.07.06 03:53
      답변 감사합니다. 요건 해본 방법인데 distinct 가 join하니깐..안먹히는거 같아요. 암튼 감사합니당.
    • 이호성
    • 2002.07.06 02:01
    • 0 COMMENTS
    • /
    • 0 LIKES