0

我在测试中没有问题,但我想知道有数千个同时用户的实时环境。

如果我分别执行两个查询:

insert into table (somecolumnname) values (somedata)

其次是

select @@IDENTITY as lastInsertId

这将为我提供稍后在其他查询中使用的最后一个插入 ID。@@IDENTITY ( http://msdn.microsoft.com/en-gb/library/aa933167(v=sql.80).aspx ) 上的文档说:

@@IDENTITY 函数的作用域是执行它的本地服务器。

如果这是本地服务器,如果有人进来并在我执行第二个查询时插入另一条语句,那么我将得到错误的 insertID;即使它在交易中?

其次,我在这里阅读了一个有冲突的帐户(http://msdn.microsoft.com/en-gb/library/ms187342.aspx):

The scope of the @@IDENTITY function is current session on the local server on which it is executed. 

因此,如果@@IDENTITY 是基于会话的,那么在使用本机客户端和连接池进行连接时,会话到底是什么?根据我对连接池的理解,如果第二个用户在第一个用户访问我的站点时访问该站点;nativec 客户端将使用相同的连接,而不是打开第二个单独的连接。如果是这种情况,这是否与在 @@IDENTITY 方面共享会话相同,这意味着来自其他用户的插入仍然会影响结果?

听起来确实像一个事务应该确保我从@@IDENTITY 获得正确的值,但我发现很难找到明确的文档告诉我情况就是这样,当然这很难在测试环境中测试。

我尝试使用绝对游标同时执行这两个查询:

inset into table (somecolumnname) values (somedata);select @@IDENTITY as lastindertid

但问题是这是通过一个抽象函数运行的,该函数将 select @@identity 查询附加到末尾以将脏全局设置为最后一个插入 id(我不能轻易更改,否则我会)。由于没有 sqlsrv_last_result 函数,如果不将光标移动得太远并检查它是否为空,我无法知道我是否在最后一个结果上;但这再次要求我在 try:catch 中从每个查询中提取数据(例如,以防止从删除中提取数据时出错),然后在光标返回 null 之前使用最后一次拉取……这当然非常慢。

如果有人设法对此进行了测试,或者可以指出定义不冲突的地方,那将不胜感激。

谢谢,

4

1 回答 1

1

我发现本机客户端(与 DBLIB 不同)默认设置 NOCOUNT 关闭,这意味着 INSERT 将受影响的行数作为结果集返回,这导致了我原来的问题。

立即运行“SET NOCOUNT ON”,然后在同一个查询批处理中使用 SCOPE_IDENTITY() 似乎已经解决了这个问题,因为不需要我运行两个单独的查询来定位选择部分。

将来更多的插入将使用存储过程。

于 2013-03-20T12:59:11.930 回答