1

我的存储过程中有以下脚本

IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN

-- DO SOME STUFF HERE

INSERT dbo.MBLPosition..

我正在向表中插入一些数据(单条记录)。首先我检查它是否已经存在,然后我进行一些处理并插入记录。

处理可能需要一些时间 - 比如说 2 秒。有时电话随后进来,我得到约束异常。罕见,但会发生。我想避免这种情况,同时如果记录已经存在,我不想进行此处理。构造此代码的最佳方法是什么,以便我不做额外的工作并避免异常?

这是一张大表,随时都有记录。什么是当他们进来并且不花费太多处理时间时过滤掉骗子的最佳方法?

4

2 回答 2

6

一种方法是执行检查,然后您始终可以使用 try/catch 来尝试插入。正如@MitchWheat 指出的那样,您可以使用适当的事务处理来消除这种情况。

IF NOT EXISTS
(
  SELECT 1 FROM dbo.MBLPosition 
  WHERE PositionGKey = @i_PositionGKey
)
BEGIN
  BEGIN TRY
    -- do some stuff here
    INSERT dbo.MBLPosition..
  END TRY
  BEGIN CATCH 
    PRINT 'Not an exception, but insert failed';
  END CATCH
END

我在这里处理了一个类似的话题:

于 2012-06-12T02:17:13.967 回答
3

您应该使用事务(具有足够的隔离级别)来使测试和后续INSERT原子化。

如果您随后遇到死锁,您可能想要打开快照隔离(正如您所说的处理可能需要一些时间,尽管 2 秒似乎很长......)

于 2012-06-12T02:17:07.060 回答