identiy컬럼 인서트후 @@Identity값 중복가능성 문의드립니다.
A 테이블에 col 이란 컬럼이 있습니다..
해당컬럼은 identity 속성이며 primary key 입니다.
트랜잭션 레벨은 uncommited 입니다.
begin tran 작업은 전혀 없습니다.
이 A테이블에 누군가 insert를 하고나서 @@IDENTITY 값을 출력한다고 할때
동시에 누군가가 이 테이블에 INSERT했을때
@@IDENTITY 값이 중복될수가 있나요?
a 세션에서 insert ===> 1번이 보임
b세션 insert ====> 1번이 보임
이런경우가 생길수가 있나요?????
Comment 6
-
건우아빠
2013.01.31 10:16
-
흑풍전설
2013.01.31 10:29
저 내용은 IDENTITY 값을 가져오는 3가지 방법에 관해서 설명을 해놓은 거라 무슨말인지는 알고는 있습니다.
의미도 알고는 있습니다만.
걱정과 우려때문에 문의드를 드리는겁니다.
제가 알고있기로는 어찌되었든 락이 걸리면서 insert 되고 그순간에 해당세션에 @@identity값이 출력이 될때 이순간에 절대적으로
중복이 되지 않는것이 보장되는것인가에 대한 문의입니다.
ORACLE 의 SEQUENCE를 대신해서 사용할것이기 때문에
중복이 절대 나지않음에 대한 보장이 되어야해서 입니다.
독립적인 개체형태로 순번을 발부하지 않다보니 이런꼼수아닌꼼수를 쓰려고 합니다. 그런데 어찌되었던 MSSQL에선 테이블이기때문에
그래도 IDENTITIY 가 무조건 값을 증가시켜 데이터를 넣고 @@IDENTITY값을 출력해준다면 보장되것지만
그게 보장될지 안될지 사실 걱정입니다.
트랜잭션 레벨이 uncommited 도 볼수있는 MSSQL 이라 ....
트랜잭션 레벨을 조정을 해야할지 아니면 굳이~ BEGIN TRAN 으로 트랜잭션을 그냥 테이블에 걸어야할지... 난감합니다.
-
건우아빠
2013.01.31 10:54
@@Identity는 현재 열려 있는 세션에서 Identity 발생 되었을시 마지막 발생 번호 입니다.
Identity번호는 테이블에 인서트 시점에서 발생이 됩니다.
중복은 발생이 안됩니다.
-
방랑도사
2013.01.31 11:29
질문의 의도가 테이블에서 IDENTITY 속성의 값이 중복발생되는경우가 만에하나 있냐 하는걸로 보이는데요. 결론은 중복발생 안됩니다.
트랜잭션 레벨이 더티리드를 허용한 상태에서 롤백이 발생할경우 잘못채번된 번호가 (팬텀리드) 보일순 있어도 역시 중복안됩니다.
즉 5번까지 채번된상태에서 데이터 인서트후 아직 커밋이 안된상태라고 봅시다. 다른 세션에서 6번자료가 보이겠죠. 그리고 롤백을 한후 다시 데이터인서트 ,커밋을 날리면 번호는 7번이 채번됩니다. 한번 채번된 6번은 커밋이든 롤백이든 재사용을 안하는것이죠
아 참고로 MSSQL의 기본 트랜잭션은 READ COMMITTED 입니다.
-
흑풍전설
2013.01.31 15:43
건우아빠님 방랑도사님 감사합니다.
저는 MSSQL에 관해서 큰지식없어서 이것저것 찾다가 답답하여 문의를 드렸습니다.
윗분은 아니다.
저는 기다~ 라고 하더라도
윗분이 먼저 맞아야하는게 우선인지라 그래도 걱정이어서 제의견에 객관적인 힘을 실어주실 MSSQL선배님들을 찾고있었습니다.
정말 감사드립니다.
마음놓고 써도 되겠네요 ㅜ_ㅜ;;;;;;;;;
-
건우아빠
2013.01.31 16:22
테스트를 함 해보시고 결과를 보여 드리시는것도 좋을듯 합니다... 링크 걸린 게시물 보시면 테스트 한 내용도 있을겁니다..
http://www.sqler.com/266311 을 참고 하시면 충분히 알수 있을겁니다.
관련되어 있는 링크도 같이 한번 보시면 좋을듯 합니다.