복붙노트

[SQL] SQL 아이덴티티 (일련 번호)는 트랜잭션 롤백으로도 증가

SQL

SQL 아이덴티티 (일련 번호)는 트랜잭션 롤백으로도 증가

나는 SQL Server 2005 데이터베이스에 대한 SQL 삽입과 .NET 트랜잭션을 가지고있다. 표는 정체성 기본 키를 가지고있다.

오류가 트랜잭션 내에서 발생하면, 롤백 ()가 호출된다. 롤백이 발생하지 않을 것처럼 행 삽입이 테이블에 제대로 다시 데이터를 삽입하지만 다음 번 I 압연되어, 신원이 증가합니다. 그래서 본질적 정체성 순서에서 차이가있다. 롤백 () 메소드가 누락 된 정체성을 확보해야하는 방법은 없나요?

나는이 올바른 방법으로 접근하지 있습니까?

해결법

  1. ==============================

    1.당신이 그것에 대해 생각하면, 자동 증가 번호를 트랜잭션해서는 안됩니다. 다른 트랜잭션이 자동으로 번호가 사용되거나 될 거라고 있는지 확인하기 위해 기다려야하는 경우 "롤백", 그들은 자동 번호를 사용하여 기존 트랜잭션에 의해 차단 될 것입니다. 예를 들어, ID 열에 대해 자동 번호 필드를 사용하여 테이블 A 내 사이비 코드를 아래에 고려 :

    당신이 그것에 대해 생각하면, 자동 증가 번호를 트랜잭션해서는 안됩니다. 다른 트랜잭션이 자동으로 번호가 사용되거나 될 거라고 있는지 확인하기 위해 기다려야하는 경우 "롤백", 그들은 자동 번호를 사용하여 기존 트랜잭션에 의해 차단 될 것입니다. 예를 들어, ID 열에 대해 자동 번호 필드를 사용하여 테이블 A 내 사이비 코드를 아래에 고려 :

    User 1
    ------------
    begin transaction
    insert into A ...
    insert into B ...
    update C ...
    insert into D ...
    commit
    
    
    User 2
    -----------
    begin transaction
    insert into A ...
    insert into B ...
    commit
    

    사용자 2의 트랜잭션이 사용자 1의 후 밀리 초를 시작하면, 테이블 A에 자신의 삽입은에 첫 번째 삽입에서 자동으로 번호가 사용 된 경우보고 그냥 완료하는 사용자 1의 전체 트랜잭션을 기다려야 할 것입니다.

    이 기능이 아니라 버그입니다. 난 당신이 밀접하게 순차적으로 필요할 경우 자동으로 번호를 생성하는 또 다른 방식을 사용하는 것이 좋습니다 것입니다.

  2. ==============================

    2.당신이 당신의 ID 값은 끊김없는 존재에 의존하는 경우, 예 - 당신이 잘못을하고 있습니다. 에 대용 키의 요점은 비지니스 의미가없는 것입니다.

    당신이 당신의 ID 값은 끊김없는 존재에 의존하는 경우, 예 - 당신이 잘못을하고 있습니다. 에 대용 키의 요점은 비지니스 의미가없는 것입니다.

    그리고, 아니, (자신의 자동 증가를 압연 및 기타 삽입 차단 성능 결과를 고통의 짧은)이 동작을 변경할 수있는 방법이 없습니다.

  3. ==============================

    3.당신이 너무 행을 삭제하면 당신은 당신의 순서로 격차를 얻을.

    당신이 너무 행을 삭제하면 당신은 당신의 순서로 격차를 얻을.

    시퀀스는 고유해야하지만, 그들은 순차적 할 필요가 없습니다. 그들은 단조 증가하고 있다는 사실은 구현 단지 우연이다.

  4. ==============================

    4.지금까지 내가 삽입을위한 행이 일련 번호를 주장하고 번호가 영원히 손실됩니다 롤백에 알고. 당신은 시퀀싱에있는 그 일련 번호에 따라하는 경우 당신은 당신이 사용하고있는 방법을 고려하는 것이 좋습니다.

    지금까지 내가 삽입을위한 행이 일련 번호를 주장하고 번호가 영원히 손실됩니다 롤백에 알고. 당신은 시퀀싱에있는 그 일련 번호에 따라하는 경우 당신은 당신이 사용하고있는 방법을 고려하는 것이 좋습니다.

  5. ==============================

    5.그것에 대해 걱정하지 말, 당신은 격차를 얻을 것이 바로 모든 다른 포스터. 이 사업의 의미는 숫자에, 그리고 그 의미는 갭하지 흔들 않는 경우, ID 열을 사용하지 마십시오.

    그것에 대해 걱정하지 말, 당신은 격차를 얻을 것이 바로 모든 다른 포스터. 이 사업의 의미는 숫자에, 그리고 그 의미는 갭하지 흔들 않는 경우, ID 열을 사용하지 마십시오.

    어떤 이유로 당신이 격차를 제거 할 경우 참고로, 대부분의 데이터베이스는 사용자가 선택한 번호로 자동 번호 매기기를 다시 시드하는 방법이있다. 그것은 엉덩이에 통증이, 그리고 당신은 자신이 정기적으로 할 필요 발견하면 위에서 언급 한 바와 같이, 당신은 확실히, 일련 번호 / 신원 필드를 사용하지 않아야합니다. 그러나 여기에 SQL 서버에서 작업을 수행하는 코드는 다음과 같습니다

    DBCC CHECKIDENT ( '제품', RESEED, 0)

    (표에 기록이있는 경우, 그것은 분명히 이미 촬영 된 ID 값을 건너 뛸 수 있습니다하지만.)을 설정하는 제품 표 1에서 다시 시작하는 다른 RDBMS 벤더가 자신의 구문을 가지고 있지만, 그 효과는 거의 동일합니다, 그래서 시스템의 도움말 파일 또는 internets에서 "다시 시드 정체성"또는 "시드 일련 번호"를 찾아보십시오.

    다시 :이 특별한 경우, 정기적으로 사용하지 않을입니다. 저장 프로 시저에 넣어 우리 모두가 와서하지 마십시오.

  6. ==============================

    6.나는으로 번호 키를 순차적 것이 모든 요구 사항이 있다고 생각하지 않습니다. 사실, 나는 그들이이 요구 될 수 있다고 생각하지 않습니다 :

    나는으로 번호 키를 순차적 것이 모든 요구 사항이 있다고 생각하지 않습니다. 사실, 나는 그들이이 요구 될 수 있다고 생각하지 않습니다 :

  7. ==============================

    7.한 번에 하나씩이 거래를 실행하는 많은 동시 연결의 맥락에서 생각하려고하지 Muhan. 일부는 실패하고 일부는 성공합니다. 당신은 SQL Server가 차이가없는 ID 열을 유지하는 그들이에서 와서 새로운 요청을 실행하지에 집중하고 싶다. IMO 그것을 (값의 격차)에 대한 지출 시간 가치가 무언가 확실히이다.

    한 번에 하나씩이 거래를 실행하는 많은 동시 연결의 맥락에서 생각하려고하지 Muhan. 일부는 실패하고 일부는 성공합니다. 당신은 SQL Server가 차이가없는 ID 열을 유지하는 그들이에서 와서 새로운 요청을 실행하지에 집중하고 싶다. IMO 그것을 (값의 격차)에 대한 지출 시간 가치가 무언가 확실히이다.

  8. ==============================

    8.번호 순서 implmentations는 자율 트랜잭션을 사용합니다. 오라클에서 자율 트랜잭션은 DBMS에 한 번 내부했지만, 지금 자신의 사용을 위해 노출 (종종 잘못 사용)

    번호 순서 implmentations는 자율 트랜잭션을 사용합니다. 오라클에서 자율 트랜잭션은 DBMS에 한 번 내부했지만, 지금 자신의 사용을 위해 노출 (종종 잘못 사용)

    PRAGMA AUTONOMOUS_TRANSACTION;' 
    
  9. from https://stackoverflow.com/questions/282451/sql-identity-autonumber-is-incremented-even-with-a-transaction-rollback by cc-by-sa and MIT license