我有一个表,在这个表中,我想按需处理记录,给出它的ID。我只想处理每条记录一次(当客户端请求它的时候)。
update my_table set pending_flag = 1 where my_table_id = 33 and pending_flag = 0
当我运行此查询时,它将返回受影响的记录数( 1
或0
)。
假设运行此查询最多只能返回1次1
,这是安全的吗?如果是这样的话,我可以单独使用这个命令作为一种机制来保证我不会多次处理记录吗?
其他详情:
pending_flag
永远不会回到0
pending_flag
设置为1的进程未完成,而该ID实质上处于“挂起”状态,并且永远出错,则这是可以接受的(但不是理想的)。发布于 2016-05-24 07:49:01
如果my_table_id
是表的主键(即设置了主键约束),那么实际上不可能有2行受update语句的影响。
通过锁定,数据库引擎确保一次由一个进程更新一行。在任何时候,对于my_table_id
都不会有两个值相同的记录,因为主键约束禁止这种情况。
其次,当您将标志pending_flag
更新为1时,如果再次运行相同的update
语句,则记录将不匹配,因此0条记录将被更新。
我是否可以单独使用这个命令作为一种机制来保证我不会多次处理记录?
是!(条件是以my_table_id
作为主键,或者至少具有唯一约束)。
发布于 2016-05-24 08:02:57
在sql服务器端,我没有看到任何保证。没有任何可以防止意外或编程错误将此标志设置为0的。您可能希望添加一个触发器,当标志设置为1时,该触发器禁止对其进行任何更新。
目前,唯一的服务器保证是,只有一个试图设置0 -> 1的并发进程才能成功。
https://stackoverflow.com/questions/37417766
复制相似问题