Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么将标识列上的相同值返回给两个插入器?_Sql Server - Fatal编程技术网

Sql server 为什么将标识列上的相同值返回给两个插入器?

Sql server 为什么将标识列上的相同值返回给两个插入器?,sql-server,Sql Server,我的程序正在插入这样一个表中 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.Isol

我的程序正在插入这样一个表中

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\u time
值完全相同),尽管在
MyTable
中有两行可见,但两个程序都使用相同的
new\u id
运行


虽然我很感激我应该在这里使用
SCOPE\u IDENTITY
(我马上就会尝试),但我的印象是
SERIALIZABLE
事务将阻止这种情况发生。有人知道为什么会发生这种重复吗?如果
SCOPE\u IDENTITY
可以解决问题吗?

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

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

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

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

最简单的方法是使用以下命令打开记录集,而无需执行之前的命令

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

最简单的方法是使用以下命令打开记录集,而无需执行之前的命令

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