1

複数のテーブルに対して一意のレコード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ステートメントを現在のトランザクションから除外して、ステートメントが終了するとすぐにロックが終了し、外部トランザクションがロールバックされた場合にロールバックに参加しないようにする方法はありますか?

4

1 に答える 1

1

2番目の接続を使用する必要があります。接続ごとに一度に複数のトランザクションを持つことはできません。

于 2013-02-01T16:16:33.803 に答える