-- 노홍찬 님이 쓰신 글:
>> sybase의 identity옵션이 불안정하더군요..
>>
>> 가끔씩 큰숫자로 튀어버리는 경우가 생기기도하고
>>
>> 저희 시스템에서 identity를 배제하는 방향으로 가고 있어서
>>
>>
>> 순차증가를 다른 방법으로 구현해야합니다.
>>
>> 순차증가를 위해 해당 필드의 최대값을 select해온 이후에
>>
>> 하나 증가시켜 insert하는 방법으로 구현을 했었는데
>>
>> 이런경우 동일한 프로세스가 여러개 뜬 상태에서
>>
>> 동시다발적인 select가 일어나게되면 모두가 같은 최대값을 가져와
>>
>> 동일한 값으로 insert하게 되는 일이 생깁니다.
>>
>>
>> 이것을 해결하기 위해서 single process 모델이라던지
>>
>> select전에 전체 테이블 락을 걸고 insert가 끝난후에 락을 푸는 방식이라던지
>>
>> 여러가지를 고려해봤는데 딱 이거다 싶은 방법이 없더군요...
>>
>> 혹시 sql단에서 해결할 수 잇는 방법이 없을까요?
>>
>>
>> 누군가 "select ......... for update" 이렇게 써주면 db가 insert하기 위한
>>
>> select라고 인식해서 자동으로 락을 건다고 하던데...
>>
>> 그런 기능하는게 맞는건지...
>>
>>
>> 도움 부탁드립니다. 답글주시거나 메일 주시거나 둘중에
>>
>> 편하신 방법으로... 해주시기 바랍니다.
저두 옛날에 이거땜시 무지 고생 마니 했었는데~~~
암튼여~~~ 여러가지 방법들이 있더라구요....
그중에 먼저 identity가 무지하게 커지는 현상을 막을 수 있는 방법이 있는데요...
테이블 생성시
create table table_name
(column_name
datatype(constant_expression) identity)
with identity_gap = value
하시던가여, 아니구 이미 생성된 테이블이라며
sp_chgattribute table_name, identity_gap, set_number 하시면,,,,
지정해주신 숫자만큼만 점프하게 됩니다...
만약에 어떤 프로세스가 4번 인서트하다 죽으면 5번으로 인스트가 되게되져~~~
그담엔 holdlock하는 방법이 있는데요... 이 방법은 약간의 문제가 있어서
별루 도움이 되지 않을 듯 싶네여.. 동시사용시에는 퍼포먼스도 안 나오구여~~~ deadlock도 많이 걸리구요....
그담에 채번테이블을 이용하는 방법인데요... (가장 권장하고 싶은 ^^)
채번테이블을 별도로 만드시구요....
예) create table 채번T (tablename varchar(20), seqno int)
그리고, 그 해당하는 테이블에 미리 데이타를 넣습니다...
insert into 채번T values ("실제T",0)
테이블에 clustered index도 꼬옥 걸어주시구요...
create unique clustered index on 채번T(tablename)
application에서는여~~~
begin tran
update 채번T
set seqno=seqno+1
where tablename='채번T'
select seqno into :seqno from 채번T where tablename='채번T'
insert into 실제T values (:seqno, "어쩌구", "저쩌구"~~~~)
commit tran
이렇게 하시면 됩니다...
동시사용자를 한 1000으로 돌려서 테스트 해봤었는데 암 이상없이 잘 되더군요....
암튼 도움이 되시길~~~~~~~~
|