감사합니다. 많은 도움이 될것 같네요...
^^
-- jinuki 님이 쓰신 글:
>> -- 노홍찬 님이 쓰신 글:
>> >> 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으로 돌려서 테스트 해봤었는데 암 이상없이 잘 되더군요....
>>
>>
>> 암튼 도움이 되시길~~~~~~~~
|