2

一意の数値キーを生成するために使用されるテーブルがあります。これらのキーは、他のテーブルで PrimaryKey として使用されます。テーブル構造は次のようになります。

TableName     VARCHAR
CurrentKey    INT

したがって、このテーブルには次のようなデータがあります

TableName   Customers
CurrentKey  400

したがって、テーブルの次の主キーが必要な場合は、このテーブルからCustomersを取得します。これにより、400 が得られ、インクリメント (400+1) され、テーブル内のこのキーも更新されます。だから私たちは今401です。CurrentKeyTableNameCustomersCurrentKey

この目的で使用する sql は次のとおりです。

SQL1:

DECLARE  @CurrentKey INT
UPDATE  myTable 
SET @CurrentKey = CurrentKey = CurrentKey + 1
WHERE   TableName = @TableName

私の質問は、複数のユーザーが同時にこれを呼び出した場合にキーが重複しないように、テーブルをロックする必要がありますか? SQL Server はデータの重複を許可しないと確信していますが、その方法はわかりません... テーブル ロックを使用したクエリ:

SQL2

BEGIN TRANSACTION
    DECLARE  @CurrentKey INT
    UPDATE  myTable WITH (TABLOCKX)
    SET @CurrentKey = CurrentKey = CurrentKey + 1
    WHERE   TableName = @TableName
END TRANSACTION

UPDATESQL Server が呼び出しを処理する方法を誰か説明してもらえますか?

4

1 に答える 1

1

各 SQL ステートメントはトランザクションで実行され、updateステートメントは常にロックを使用してその更新を保護します。SQL Server では、半分変更された行を読み取ることはできません (8k を超えるデータは例外です)。

最初のステートメントは問題ないはずです。

于 2012-12-05T10:13:43.450 に答える