0

既存のsqlserverテーブルがあります。他のフィールドの中でも、主キーでもあるIDと呼ばれるID列と、必須フィールドであるRecordNumber列があります。RecordNumber列のint値は一意である必要があります。したがって、行を挿入する前に、ID列の最大値を取得し、それに1を追加してから、RecordNumberフィールド= ID + 1の行を挿入します。問題は、2人のユーザーが同時に保存しようとすると、同じID値を取得するため、RecordNumberフィールドに同じ値が保存されます。これを解決する方法を教えてください。

ありがとう

4

3 に答える 3

1

これを行う最も簡単で効率的な方法は、その列を*自動増分*として定義することです。

参照

http://www.w3schools.com/sql/sql_autoincrement.asp

于 2012-08-26T18:29:49.183 に答える
0

コミットおよびロールバック操作を使用して、トランザクションの概念を使用できます。

MSDNの非常に興味深いリンク:http://msdn.microsoft.com/en-gb/library/ms190295.aspx

于 2012-08-26T18:28:54.550 に答える
0

代替案 #1 - フィールドを自動インクリメントする

CREATE TABLE SampleTable
(
    P_Id int NOT NULL Identity(1,1),
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)

代替 #2 - デフォルトの制約としての SequentialID

CREATE TABLE SampleTable
(
    P_Id uniqueidentifier NOT NULL,
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
ALTER TABLE [dbo].[SampleTable] 
ADD CONSTRAINT [DF_SampleTable_P_Id]  
DEFAULT newsequentialid() FOR [P_Id]

代替 #3 - デフォルトの制約としての NewID

CREATE TABLE SampleTable
(
    P_Id Varchar(100) NOT NULL,
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
ALTER TABLE [dbo].[SampleTable] 
ADD  CONSTRAINT [DF_SampleTable_P_Id]  
DEFAULT (newid()) FOR [P_Id]

Muti User Transaction の場合は、推奨される Stored Proc のサンプルを使用する必要があります。

BEGIN TRY
    SET NOCOUNT ON
    SET XACT_ABORT ON
    Begin TRAN
        --Your Code
    COMMIT TRAN
END TRY

BEGIN CATCH
    ROLLBACK TRAN
END CATCH
于 2012-08-27T03:58:39.927 に答える