1

私のプログラムはこのようなテーブルに挿入しています...

CREATE TABLE [DBO].[MYTABLE] (
    ID [INT] IDENTITY (1,1),
    DATE_TIME [DATETIME],
    NOTES [VARCHAR] (100))

次のコードを使用して...

database_connection = New ADODB.Connection
' ...code to connect...
database_connection.IsolationLevel = ADODB.IsolationLevelEnum.adXactSerializable
database_connection.BeginTrans
command_string = "INSERT INTO [MySchema].[dbo].[MyTable] (NOTES) VALUES ('sometext')"
database_connection.Execute(command_string)
command_string = "SELECT MAX([id]) as max_id FROM [MySchema].[dbo].[MyTable]"
Dim record_set As ADODB.Recordset = New ADODB.Recordset
record_set.CursorLocation = ADODB.CursorLocationEnum.adUseClient
record_set.Open(command_string, database_connection, ADODB.CursorTypeEnum.adOpenStatic, , ADODB.CommandTypeEnum.adCmdText)
record_set.MoveLast
new_id = CInt(record_set.Fields("id").Value)
database_connection.CommitTrans

時折、このコードは2つの異なるプログラムによって同時に実行され(date_time値が同じになるのに十分な時間で近い)、に2つの行が表示されますがMyTable、両方のプログラムは同じで実行されnew_idます。

おそらくSCOPE_IDENTITYここで使用する必要があると思いますが(そしてすぐに試してみます)、SERIALIZABLEトランザクションによってこれが発生しないという印象を受けました。なぜこの重複が発生しているのか、そしてSCOPE_INDENTITY問題が解決するかどうかを誰かが知っていますか?

4

2 に答える 2

3

間違いなくSCOPE_IDENTITYを使用する必要がありますが、INSERTと同じクエリで使用します。2つのクライアントが同時に同じテーブルにデータを挿入する場合->2番目のクエリは2番目に挿入された値のMax(id)を返します。

INSERT INTO [MySchema].[dbo].[MyTable] (NOTES) VALUES ('sometext')
SELECT SCOPE_IDENTITY()
于 2013-03-01T09:23:51.323 に答える
2

最も簡単な方法は、前に実行せずに、次のコマンドでレコードセットを開くことです。

INSERT INTO [MySchema].[dbo].[MyTable] (NOTES) 
OUTPUT inserted.id
VALUES ('sometext')
于 2013-03-01T09:27:18.427 に答える