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 1971 게시물 읽기
No. 1971
Locking 에 관련 질문
작성자
손동길
작성일
2007-07-04 11:47ⓒ
2007-07-04 11:51ⓜ
조회수
6,562

안녕하세요

locking 에 대한 도움을 구하고자 합니다.


delete 후 insert 하는 sp 를 동시에 여러 사용자가 사용하는 경우

한쪽에서 locking 이 걸리면서 먼저 걸린 프로세스가 끝나면 lock 이 풀리고 

작업이 진행되는 것이 아니라 pk 오류가 발생합니다.


이런경우는 어떻게 처리를 해야 하는건지 도움 부탁드립니다.


CREATE PROCEDURE  usp_mrfrmmrit_insert

  @row   INT,

  @frm_key  INT,

  @rank  INT,

  @mrit_key  INT,

  @step  TINYINT,

  @grmrit_cd CHAR(8),

  @ent_empl_no INT,

  @mfy_empl_no INT

AS

 IF @row = 0

 BEGIN

  DELETE frmmrit

  WHERE frm_key = @frm_key

 END


  INSERT frmmrit (frm_key, rank, mrit_key, step, grmrit_cd, ent_empl_no, ent_dt, mfy_empl_no, mfy_dt)

  VALUES  (@frm_key, @rank, @mrit_key, @step, @grmrit_cd, @ent_empl_no, GETDATE(), @mfy_empl_no, GETDATE())



frmmrit 테이블에는 frm_key 와 rank 가 unique 에 cluster 로 pk 가 잡혀 있습니다


작업내용은 첫 row 가 들어오면 테이블의 특정 key 값을 모두 delete 하고 다시 insert 하는 작업내용입니다.


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

당연히 pk의 중복은 확인하셨다면, 테이블의 락 설정을 확인해 보세요.. 
님의 말씀으로는 한사용자의 작업을 하는중에는 다른 사용자가 테이블을 엑세스 할수 없어야 한다는 말씀이 므로 row락이 아닌 테이블락이 걸려야 할것 같은데...
 
lock allpages

지나가다가님이 2007-07-04 12:18에 작성한 댓글입니다.
이 댓글은 2007-07-04 12:21에 마지막으로 수정되었습니다. Edit

말씀 고맙습니다.


근데 제 뜻은 위와 같은 sp 를 동시에 다수의 사용자가 사용하는 도중에

pk 오류가 발생한다는 것입니다.


기본적으로 트랜젹션을 걸고 들어가서 작업을 하면 다음 사용자는 대기하고 있다가

앞 작업이 진행된 후 작업을 진행해야 하는데 그렇지 못하고


deadlock 현상이 발생하면서 pk 오류가 발생한다는 것이 문젭니다.


참고로 lock type 은 Ex_row_blk 입니다.


많은 답변 부탁드립니다.


수고하세요

손동길님이 2007-07-04 21:19에 작성한 댓글입니다.
이 댓글은 2007-07-04 22:47에 마지막으로 수정되었습니다. Edit

tranaction = lock은 아닙니다.

record가 있는 경우
process1           process2
begin tran          begin tran
delete               delete
insert                insert
commit              commit
delete에서 row level lock를 잡기 때문에 오류발생안함

record가 없는 경우(에러발생) 
process1           process2
begin tran          begin tran
insert                insert
commit             commit

record가 없는 경우 2개의 process가 동시 insert 발생할 수 있고
한명은 insert시 PK오류가 발생합니다.


해결방법
stored procedure 시작시 table lock를 걸고 진행하면 됩니다.

BEGIN  TRAN
lock table frmmrit in exclusive mode

DELETE frmmrit  WHERE frm_key = @frm_key

  INSERT frmmrit (frm_key, rank, mrit_key, step, grmrit_cd, ent_empl_no, ent_dt, mfy_empl_no, mfy_dt)  VALUES  (@frm_key, @rank, @mrit_key, @step, @grmrit_cd, @ent_empl_no, GETDATE(), @mfy_empl_no, GETDATE())
commit





영빈~(backfish)님이 2007-07-05 12:35에 작성한 댓글입니다.

table lock을 사용할경우

stored procedure에 있는 transaction이 종료될 때까지

frmmrit 테이블을 select 못하는 단점이 있군요...


채번테이블 이 있다면 채번테이블에 이용하여 lock을 거는게 

좀 더 효과적일듯..


create table 채번테이블

(

 code char(10) primary key,

 seq int

)


insert 채번테이블 values ('frmmrit', 1)

=====================================



BEGIN  TRAN


update 채번테이블

set seq = 0

where code = 'frmmrit'


DELETE frmmrit  WHERE frm_key = @frm_key


  INSERT frmmrit (frm_key, rank, mrit_key, step, grmrit_cd, ent_empl_no, ent_dt, mfy_empl_no, mfy_dt)  VALUES  (@frm_key, @rank, @mrit_key, @step, @grmrit_cd, @ent_empl_no, GETDATE(), @mfy_empl_no, GETDATE())

commit


채번테이블의 low level lock을 이용하여 동기화

영빈~(backfish)님이 2007-07-09 09:01에 작성한 댓글입니다.
이 댓글은 2007-07-09 09:03에 마지막으로 수정되었습니다.

젤 마지막 영빈님에 한표를 던집니다...


지연님이 2007-07-11 16:28에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1977고수님들 Sybase에서의 multi-Update처리 함봐주세요! [2]
초보
2007-07-11
5437
1976ORDER BY 튜닝 [1]
생짜
2007-07-10
5883
1975Sybase에서는 이런 쿼리 어떻게 하나요?
변영호
2007-07-06
6006
1971Locking 에 관련 질문 [5]
손동길
2007-07-04
6562
1970sybase sqlcode관련
궁금이
2007-07-04
5940
1968text 속성을 필드를 varchar로 변경해서 bcp로 내릴경우 한글이 깨지는 경우가 생기는대..
김상사
2007-07-02
5884
1967ISQL 로 접속시 -l 옵션에대해 알고 싶습니다 [1]
홍승완
2007-07-02
5458
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다