如何在T-SQL中运行多个实例时仅执行部分代码

范围

我有一个从业务代码调用的存储过程。该代码使用并行性,因此根据某些条件,此SP的多个实例可以同时运行。

我只想执行一次此SP中的某些逻辑。我有一个表(我们称它为HISTORY),其中包含运行的UID和执行此部分代码时的DATETIME。这是我的流程:

SP BEGIN
  -- some logic
  IF certain conditions are met, check if HISTORY does not have an entry for the UID
    1. Add an entry in HISTORY for the current UID
    2. Run the once only code
SP END

问题是,有时,如果不同的实例同时到达该部分,则上面的逻辑有时仍会多次执行。我该怎么做才能确保它只能运行一次?

谢谢!

杰罗恩·莫斯特(Jeroen Mostert)
BEGIN TRANSACTION;
    INSERT [HISTORY](UID, ...)
    SELECT @UID, ...
    WHERE NOT EXISTS (
        SELECT * FROM [HISTORY] WITH (HOLDLOCK) WHERE UID = @UID
    );

    IF @@ROWCOUNT = 1 BEGIN;
      -- we inserted, do logic that should run only once
    END;
COMMIT;

HOLDLOCK(等同于在之下运行事务SERIALIZABLE,但更细粒度)可确保没有其他并行运行的事务可以HISTORY为该UID插入条目任何尝试这样做的事务都将阻塞,直到第一个事务INSERT完成然后再返回(因为已经存在一行)。确保UID存在一个索引,否则它将锁定比正常运行更多的锁定。

像这样正确地获取代码总是很棘手,因此请确保在实践中通过对相同(和不同)UID的并发插入进行压力测试来对其进行测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Haskell中理解“:t((==)<*>)”?

来自分类Dev

外部.js仅运行部分代码

来自分类Dev

如何在Perl中运行部分应用程序?

来自分类Dev

如何在锈中声明&[&T]]?

来自分类Dev

如何在集合中运行多个python插件实例?

来自分类Dev

如何在Swift中偏移Range <T>?

来自分类Dev

如何在较低的执行级别中运行部分代码

来自分类Dev

如何以指定的概率运行部分代码?

来自分类Dev

如何在T-SQL中设置多个变量的值?

来自分类Dev

如何在C#文件中创建List <T>实例

来自分类Dev

如何在Rust中创建Vec <T>,其中T:Into <_>?

来自分类Dev

如何在代码部分中运行每个“功能”?

来自分类Dev

如何在php中的代码上运行多个查询?

来自分类Dev

如何在C ++中衡量执行部分的代码覆盖率

来自分类Dev

Ruby:如何从已加载的文件中执行部分代码

来自分类Dev

外部.js仅运行部分代码

来自分类Dev

如何在模板类中实例化T类型

来自分类Dev

如何在List <T>中查找项目?

来自分类Dev

如何在Silverlight中创建List <T>?

来自分类Dev

如何在Perl中执行部分应用程序功能?

来自分类Dev

如何在Cygwin中运行/执行.java代码?

来自分类Dev

如何在集合中运行多个python插件实例?

来自分类Dev

如何在Swift中偏移Range <T>?

来自分类Dev

如何在需要的时间执行部分代码?

来自分类Dev

如何在Application_BeginRequest中为第一个命中Web服务器的请求执行部分代码?

来自分类Dev

如何仅运行部分代码

来自分类Dev

如何在多个实例中重复使用此代码?

来自分类Dev

如何在 awk 中打印“\t”

来自分类Dev

如何在powershell中仅列打印列表的某些行部分?

Related 相关文章

热门标签

归档