我的程序插入到像这样的表...为什么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
会解决问题吗?