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
운영게시판
최근게시물
Sybase Q&A 1842 게시물 읽기
No. 1842
LOCK에 관한문의입니다^^;답변부탁드려용
작성자
한승도
작성일
2007-03-12 10:41
조회수
6,761

현재 저희쪽에서 테이블 2군데에 동시에 update를 쳐야될상황이 놓였는데요
테이블 A는 채번테이블(시퀀스를 사용하고 있지 않습니다.)
테이블 B는 메인정보테이블입니다.

그래서 채번테이블 A 에 번호+1 하는 update구분이 있구요
메인정보테이블 B에 채번된번호를 update select 하고있습니다.

문제는 A에서 번호를 +1하고 B테이블에 번호를 update select 하는사이에

다른사람이 A테이블을 update시켰을경우 B테이블에 번호가 겹칠수있다는것이죠

그래서 현재 이 2개의 쿼리문을 실행하는동안 LOCK을 걸고 싶습니다.

쿼리문2개를 수행하는동안 LOCK을 걸고 구분이 끝난후 LOCK를 릴리즈

하고싶은데 어떤방법으로 해야되나요?

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

1.명령어 중에 holdlock이 있긴한데요, 이거 역시 shared lock은 끝나는데로 release합니다.



그래서...이케 하랍니다


Tran A

Begin tran;

Update Table_A

set Amt = Amt       <= dummy update

where a= H_a;

Select Amt from Table_A

where a = H_a;                   <= 100

New_Amt = Amt + 100;

Update Table_A

set Amt = New_Amt         <=200

where a= H_a;


Tran B

Begin tran;

Update Table_A

set Amt = Amt        <= dummy update

where a= H_a;

Select Amt from Table_A

where a = H_a;                    <=200

New_Amt = Amt + 100;

Update Table_A

set Amt = New_Amt          <=300

wherea=H_a;

또는



Tran A

Begin tran;

Select Amt from Table_A

where a = H_a;                   <= 100

Update Table_A

set Amt = Amt +100        <=200

where a= H_a;

Tran A

Begin tran;

Select Amt from Table_A

where a = H_a;                   <= 200

Update Table_A

set Amt = Amt +100        <=300

where a= H_a;


 

수고하세요

지연님이 2007-03-13 10:15에 작성한 댓글입니다. Edit

아마 채번 테이블에
max값을  select 한 다음  select한 값에 +1한다음 update를 하실거라 생각됩니다. 
그럴 경우 동시에 (사람이 동시어 접속하는 경우 상황에 따라 네트워크의 불안, 서버의 부하등등) 접속하게 되는 경우,  max값을 동시에 select한다는게 맞을것 같습니다. 이럴때는 중복이 걸리게 됩니다. 
저 같은 경우는 이걸 반대로 처리 합니다. (update도 lock을 거는 방법중 하나...)
무조건 update를 먼저 한다음 값을 select하는 방법으로 순서를 바꾸었습니다. 그래서 이문제는 해결 되었습니다.

 


   

지나가다가님이 2007-03-13 10:31에 작성한 댓글입니다. Edit

/지연

답변감사드립니다^^ 지연님의 답변에 한가지 의문이 있습니다.

현재 트랜잭션으로  dummy update 를 하고나서 수를 더하는 방식을 취하고 있는데요

이렇게 하고나면 트랜잭션이 모두 끝날때까지 lock이 걸리는건가요?


또한 B테이블도 락을 같이 걸어 놓고 작업을해야하는데 B table lock에 대한 내용은 없는거같아서요


제가 우매해서; 이해를 잘못하겠습니다;; 좀 설명을 부탁드립니다;;


/지나가다가님

그럼 B테이블을 먼저 update치고나서 채번테이블인 A테이블을 update해준다는 얘기인가요?

그럼 굳이 채번테이블의 의미가;;; 제가 이해를 잘못한건지;;

한승도님이 2007-03-13 10:52에 작성한 댓글입니다. Edit

아니요 채번테이블에 먼저 업데이트를 하는데, 

채번 업테이트를 할때. 

MAX값을 셀렉트하고 셀렉트한 MAX값에 +1 한다음 업데이트를 하는게 아니라...


+1로 업데이트를 하고 셀렉트를 한다는 말입니다.


예) 채번테이블(A) ,  매출테이블(B) 라고 할때 

채번테이블이 없을때는 B테이블에서만 자료를 검색해서 번호를 만들게 되는 경우 동시에 접속자가 많을 경우에는 중복이 되는 문제가 많아 집니다.   

채번 테이블은 중복을 배제하기 위해 필요한거죠. 그런데 SELECT를 하고 UPDATE를 하게 되면 채번 테이블이나 매출 테이블이나 다른게 없게 되는 거구요.  동시에 SELECT를 한다면 동일한 값을 가져오게 될거구요. 그래서 테이블의  LOCK을 거는 방법을 모색하게 될거구요. 채번 테이블은 저 같은 경우는 키를 부여 해주는 테이블로 사용합니다.  저도 테이블을 LOCK을 거는 방법을 사용할려다가 기술적인 능력이 많지않아 먼저 업테이트를 하게되면 결국 COMMIT을 만나기 전에는 테이블이 LOCK이 걸리게 되니까. 방식은 비슷할거라 생각해서 이방법을 씁니다. 테스트 해보니 아무리 동시라 해도 UPDTAE는 동시에 처리되지 않는것 같더군요...( 기술적인 것은 지연님 부탁 ) . 

또한 매출 같은 경우는 동시에 여러명이 사용하게 되는데 두 테이블을 락을 걸게 되면 물론 서버의 성능이나 처리 속도로는 문제가 안되겠지만 ,  부하가 걸리는 작업이나 대량 자료 검색등이 발생하게 되었을때는 문제가 발생할수 있지 않을까요... 저도 이 부분의 기술적인 처리 방법이 어려워 저런 방법으로 구현 했지만요... 아직까지 중복 문제는 안나오고 있음.

 

지나가다가님이 2007-03-13 11:20에 작성한 댓글입니다.
이 댓글은 2007-03-13 11:24에 마지막으로 수정되었습니다. Edit

/지나가다님

그럼 먼저 B테이블에 대해서 숫자를 max+1하는 update구문을 넣은다음 

채번테이블을 update하는 방식이군요


저도 그방식으로 진행을 해보았는데요. 문제는 이겁니다.

테이블이 분명 2군데 존재하고 있는상황에서 

B테이블을 먼저 update치고나서

A테이블을 update한다면  B테이블에는 중복된값이 쌓이지 않겠습니다만

A테이블에 숫자가 정확도가 떨어진다는거지요.


음 설명이좀 필요한듯


먼저 채번번호가 0번이라고 생각하면


A유저

1. update B테이블 set max(번호)+1

(채번 1번발생)

2. update A테이블 set 번호=max(B.번호) from B테이블



B유저

3. update B테이블 set max(번호)+1

(채번 2번발생)

4. update A테이블 set 번호=max(B.번호) from B테이블


이내용이 1,2,3,4 순서대로 일어난다면 상관이없지만

둘이 락을 걸지않는경우

1,3이 먼저 실행되고나서 4,2순서로 update가 쳐진다면 

A테이블의 최종저장된 채번번호는 1번이 저장된다는것이죠

(물론 B테이블의 값은 정상적으로 겹치는건없어지겠지만;;)


그래서 Lock을 걸려고 하는것이구요 A의 유저가 모든행동을 마칠때까지 락을 걸고 있어야합니다.

Select는 가능해야하구요 Insert,update,delete를 할수없도록 lock을 거는 방법에 대해서 궁금합니다^^

한승도님이 2007-03-13 11:34에 작성한 댓글입니다.
이 댓글은 2007-03-13 11:35에 마지막으로 수정되었습니다. Edit

저희 하고는 약간 다른것 같습니다.

저희는 업무상 매출이나 ,매입, 다른 작업의 키값 생성을 할때 채번 테이블을 이용합니다.


채번테이블에는 


업무  / 년월  / 최종 번호 /


  1      200701   5656

  1      200702   8656

  2      200701   7777



이런식으로 구성 되어 있다면 


A 유저


   UPDATE 채번

        SET 최종 번호 + 1 

   WHERE 업무= '1'

       AND   년월 = '200702'  


B 유저


   UPDATE 채번

        SET 최종 번호 + 1 

   WHERE 업무= '1'

       AND   년월 = '200702' 



이런식으로 들어 왔을때  아무리 동시에 update를 해도 업데이트 된 값을 다릅니다.(항상 max값) 

매출 테이블의 max값을 채번테이블에 기록하는게 아니라 채번테이블에서 채번값을 업데이트한 다음 그 값을 매출테이블에  등록할때 이용합니다 . 







 

지나가다가님이 2007-03-13 11:48에 작성한 댓글입니다.
이 댓글은 2007-03-13 11:53에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1845isql 실행 시 오류 [4]
아지
2007-03-19
5488
1844CPRE에 대해 질문 있습니다! [3]
방성일
2007-03-14
4836
1843사이베이스 처음 하는데요..^^; [1]
궁금인
2007-03-12
5727
1842LOCK에 관한문의입니다^^;답변부탁드려용 [6]
한승도
2007-03-12
6761
1841포트관련 질문 드립니다. [3]
정현우
2007-03-09
4509
1840Sybase JDBC 드라이버 관련 [1]
JDBC
2007-03-05
4821
1839Group by 어떻게 처리 해야하나요..? [1]
계절여행
2007-03-02
4891
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다