我在测试中没有问题,但我想知道有数千个同时用户的实时环境。
如果我分别执行两个查询:
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 之前使用最后一次拉取……这当然非常慢。
如果有人设法对此进行了测试,或者可以指出定义不冲突的地方,那将不胜感激。
谢谢,