sql >> データベース >  >> RDS >> Sqlserver

トランザクション ロールバックを使用しても SQL ID (自動番号) がインクリメントされる

    考えてみれば、自動インクリメント番号はすべきではありません。 トランザクショナルであること。自動採番が使用されるか、または「ロールバック」されるかどうかを確認するために他のトランザクションを待機する必要がある場合、自動採番を使用する既存のトランザクションによってそれらのトランザクションがブロックされます。たとえば、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 の 1 ミリ秒後に開始された場合、テーブル A への挿入は、A への最初の挿入からの自動採番が使用されたかどうかを確認するためだけに、ユーザー 1 のトランザクション全体が完了するまで待機する必要があります。

    これは機能であり、バグではありません。自動採番を厳密に連続させる必要がある場合は、別のスキームを使用して自動採番を生成することをお勧めします。



    1. ODP.NETを使用したOracleの一括更新

    2. ホスト(Windows)からVirtualBoxのOracleDBにアクセスする方法

    3. Postgresがインデックスがデータの1%未満を返すシーケンシャルスキャンを実行するのはなぜですか?

    4. ビット単位のカウントを使用してテーブルIDフィールドをインクリメントします