0

我刚刚注意到一个存储过程正在使用以下 BEGIN/COMMIT TRAN。

BEGIN TRAN
  INSERT INTO SomeTable
     (
         TypeID
     )  
  VALUES
     ( 
         @TypeID
     )
    SET @OvID = SCOPE_IDENTITY() 
 COMMIT TRAN           

在 INSERT 和 SCOPE_IDENTITY 上使用事务是一种好习惯吗?

以这种方式使用 TRAN 会大大减慢 INSERT 过程吗?

当您有多个可能失败的语句(即像两个 INSERTS)时,我总是会考虑使用事务。在这种情况下,我可以看到 INSERT 失败,但我怀疑 SCOPE_IDENTITY 总是会成功。

4

3 回答 3

3

对于单个语句,它并不重要,因为您没有获得任何额外的原子性或可靠性。并且SCOPE_IDENTITY()不会受到当前批次之外的任何东西的影响,因此将其包装在一个TRANS块中不会有任何影响。

进入是否是一个习惯是相当主观的,所以我故意不解决它!

于 2012-04-24T18:06:03.467 回答
2

你的最后一点取决于你所说的“成功” - 如果插入失败,取决于错误的性质和范围/批处理中发生的任何其他事情,分配将会发生,但@OvID会是NULL.

该事务确实有一些开销(我怀疑您会注意到差异,直到您在循环中执行数千次)。但是,如果这是一个正在进行的项目的代码,事务包装器可能有助于说明意图,例如,如果以后可能会有更多语句,您将不再拥有这个单语句原子事务。TRY/CATCH如果您不打算为任何或其他错误处理而烦恼,那么打扰交易似乎很有趣。我总是想处理回退,以防万一我以某种方式将孤立的 tx 留在外面。根据故障的来源和严重程度,可能会发生奇怪的事情。

于 2012-04-24T18:16:57.097 回答
2

事务有开销,它会减慢查询时间。对于单个插入,没有必要。如果插入失败,scope_identity 将为空。

于 2012-04-24T18:07:16.627 回答