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

有时,此代码由两个不同的程序同时执行(在时间上足够接近以使date_time值相同),尽管在 中有两行可见MyTable,但两个程序都以相同的new_id.

虽然我很欣赏我可能应该SCOPE_IDENTITY在这里使用(我会在一分钟内尝试),但我的印象是SERIALIZABLE交易会阻止这种情况发生。有谁知道为什么会发生这种重复,是否SCOPE_INDENTITY会解决问题?

4

2 回答 2

3

您肯定需要使用 SCOPE_IDENTITY,但在与 INSERT 相同的查询中。当 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 回答