首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQL Server "update“--是否存在竞争条件?

SQL Server "update“--是否存在竞争条件?
EN

Stack Overflow用户
提问于 2016-05-24 07:21:43
回答 2查看 414关注 0票数 1

我有一个表,在这个表中,我想按需处理记录,给出它的ID。我只想处理每条记录一次(当客户端请求它的时候)。

update my_table set pending_flag = 1 where my_table_id = 33 and pending_flag = 0

当我运行此查询时,它将返回受影响的记录数( 10 )。

假设运行此查询最多只能返回1次1 ,这是安全的吗?如果是这样的话,我可以单独使用这个命令作为一种机制来保证我不会多次处理记录吗?

其他详情:

  • pending_flag永远不会回到0
  • 可能涉及多个线程(一如既往)
  • 如果将pending_flag设置为1的进程未完成,而该ID实质上处于“挂起”状态,并且永远出错,则这是可以接受的(但不是理想的)。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 07:49:01

如果my_table_id是表的主键(即设置了主键约束),那么实际上不可能有2行受update语句的影响。

通过锁定,数据库引擎确保一次由一个进程更新一行。在任何时候,对于my_table_id都不会有两个值相同的记录,因为主键约束禁止这种情况。

其次,当您将标志pending_flag更新为1时,如果再次运行相同的update语句,则记录将不匹配,因此0条记录将被更新。

我是否可以单独使用这个命令作为一种机制来保证我不会多次处理记录?

是!(条件是以my_table_id作为主键,或者至少具有唯一约束)。

票数 3
EN

Stack Overflow用户

发布于 2016-05-24 08:02:57

在sql服务器端,我没有看到任何保证。没有任何可以防止意外或编程错误将此标志设置为0的。您可能希望添加一个触发器,当标志设置为1时,该触发器禁止对其进行任何更新。

目前,唯一的服务器保证是,只有一个试图设置0 -> 1的并发进程才能成功。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37417766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文