草庐IT

PHP、MySQL 和 Cron 作业 - 查询存储所有行以开始,还是按顺序进行?

coder 2023-10-22 原文

我有一个 MySQL 表:

Col 1 | Col 2 | Col 3 | Status
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  1
 ...  |  ...  |  ...  |  2
etc

表中包含最新信息很重要,因此每分钟运行一次 cron 作业以更新表。

Status 列用于存储该行是否需要更新,或者当前是否正在更新。如果该行需要更新,则状态为 0。如果该行当前正在更新,则状态为 1。如果该行已被更新,则状态为 2。

一旦所有行的状态都为 2,它们将全部重置为 0,然后该过程重新开始。

cron 作业每分钟运行一次,但有时更新一行可能需要几分钟,这意味着多个 cron 作业将同时运行。

我的问题是,如果我有这样的查询:

UPDATE * FROM table WHERE status=0

查询是否一次通过一个,到下一个 0?还是查询首先查看所有行,然后存储最终将访问的行?

示例

假设设置了下表:

Col 1 | Col 2 | Col 3 | Status
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0

在 t=0 时,第一个 cron 作业 (cj1) 开始。它进入第一行,并将状态设置为 1。

Col 1 | Col 2 | Col 3 | Status
 ...  |  ...  |  ...  |  1
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0

此过程需要一分多钟,因此第二个 cron 作业 (cj2) 在 t=1m 开始。

cj2 看到第一行已经被更新,所以转到第二行。

Col 1 | Col 2 | Col 3 | Status
 ...  |  ...  |  ...  |  1
 ...  |  ...  |  ...  |  1
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0
 ...  |  ...  |  ...  |  0

假设 cj2 忙于更新该行几分钟。当 cj1 完成第一行时,它会跳到第 3 行,因为它看到第 2 行的状态为 1 吗?还是 cj2 会转到第二行,因为在调用查询时它最初的状态为 0?

最佳答案

由于您使用的是 InnoDB,因此默认情况下每个查询都将作为事务执行。所以当你这样做的时候

UPDATE table
SET <whatever>
WHERE status = 0

它将锁定与 status 值匹配的所有行。如果执行类似查询的其他进程尝试访问这些行中的任何行,它们将被阻止。

它执行此操作的具体方式取决于 status 列上是否有索引。如果有,它只是锁定该索引条目,然后更新它引用的所有行。

如果没有索引,则必须顺序遍历数据库。每当它遇到 status = 0 的行时,它将锁定该行然后更新它。其他客户端可能会以不同的顺序扫描数据库,因此他们可能会在查询到达之前看到该查询将更新的行。如果他们在更新其他列的同时更新 status,那么你应该没有问题,因为当这个过程到达那些行时,它们将不匹配 status = 0 标准。

关于PHP、MySQL 和 Cron 作业 - 查询存储所有行以开始,还是按顺序进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218537/

有关PHP、MySQL 和 Cron 作业 - 查询存储所有行以开始,还是按顺序进行?的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐