【发布时间】:2016-09-08 19:52:22
【问题描述】:
我正在阅读this 的回答,了解有关将最后一个身份值输入数据库的不同方法。
据我了解,@@IDENTITY 通常是一个非常糟糕的主意,因为它可能会返回一个与您预期不同的身份,例如最近由扳机。
但是如果你的代码在一个事务中呢?
例如,这是我正在执行的事务的简化版本(使用 ColdFusion):
<cftransaction>
<cfquery name="queryInsertA" datasource="source">
INSERT INTO tableA (columnName) VALUES (value)
</cfquery>
<cfquery name="queryInsertB" datasource="source">
INSERT INTO tableB (fkey_tableA, columnName) VALUES (@@IDENTITY, value)
</cfquery>
</cftransaction>
既然,“If a transaction is successful, all of the data modifications made during the transaction are committed and become a permanent part of the database”,这是否意味着它也可以防止使用@@IDENTITY 时可能出现的问题?还是我误解了交易的行为?
【问题讨论】:
-
我不会说这是 100 % 安全的,如果您在一个只有您可以访问的受控环境中执行此操作,那么是的,请继续。但是,如果它位于可以被不同的进程/用户/应用程序大量使用的系统/服务器上,那么不会。即使它代表 1% 的风险,我也不会承担。
-
为什么要使用@@identity 而不是scope_identity()?顺便说一句,后者也是当您使用带有简单 INSERT 的“结果”属性时 CF 自动返回的内容。
-
我主要是好奇
@@identity是否安全。 (看起来这是一个很大的不)。scope_identity()一路走好! -
嗯,肯定比@@identity 好。但是,如果您使用多处理器运行 2008 或更早版本,请务必阅读第一个链接的 cmets 中提到的并行计划错误。对于 2008 年,推荐的解决方法是使用
OUTPUT。
标签: sql sql-server tsql coldfusion transactions