複数のテーブルに対して一意のレコードIDを持ち、クライアント側で形成された新しいレコードの構造にIDを割り当てることができるように、IDジェネレーターを実装したいと思います。
通常、明白で標準的な答えはGuidですが、スペース効率と人間の可読性のためにintを使用したいと思います。
IDシーケンスにギャップがあっても問題ありません。これは、未完了のトランザクション、クライアント接続の喪失などで発生します。
実装のために、IDが要求されるたびにカウンターとなるCounters
フィールドとインクリメントを備えたテーブルがあります。NextId int
複数または一括挿入のIDの範囲が必要な場合は、そのIDを1より大きく増やすことができます。
テーブルを更新するときにボトルネックがロックCounters
されないようにするには、idリクエストをアトミックおよび他のトランザクションの外部で行う必要があります。だから私の質問はそれをどのように行うかです?
アプリケーションレベルでは問題ありません。1つのアトミックトランザクションリクエストを作成してIDのプールを取得し、それらのIDを別のより大きなトランザクションで使用してレコードを挿入できます。
しかし、ストアドプロシージャまたはトリガー内で新しいIDを取得したい場合はどうすればよいですか?
そのupdate Counter set NextId=NextId+1
テーブルリクエストをネストされたトランザクションにラップするとbegin tran
...commit tran
外側の大きなトランザクションが終了するまで、ロックから除外されません。
その1つのSQLステートメントを現在のトランザクションから除外して、ステートメントが終了するとすぐにロックが終了し、外部トランザクションがロールバックされた場合にロールバックに参加しないようにする方法はありますか?