2013-03-01 63 views
1

我的程序插入到像这样的表...为什么IDENTITY列上的相同值返回给两个插入器?

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 

有时这种代码是由两个不同的程序同时执行(在时间上足够接近date_time值是相同的),并且尽管MyTable中有两行可见,但两个程序都使用相同的new_id运行。

尽管我很欣赏我应该在这里使用SCOPE_IDENTITY(并且我会在一分钟内尝试它),但我的印象是SERIALIZABLE事务会阻止这种情况发生。有谁知道为什么会发生这种重复,并且SCOPE_INDENTITY会解决问题吗?

回答

2

最简单的方法将使用下面的命令来打开记录,没有先前的执行

INSERT INTO [MySchema].[dbo].[MyTable] (NOTES) 
OUTPUT inserted.id 
VALUES ('sometext') 
3

你一定需要使用SCOPE_IDENTITY,但是在与INSERT相同的查询中。 当两个客户端同时在同一个表中插入数据时 - >第二个查询将返回第二个插入值的最大值(id)。

INSERT INTO [MySchema].[dbo].[MyTable] (NOTES) VALUES ('sometext') 
SELECT SCOPE_IDENTITY() 
相关问题