更新之前使用 MYSQL 和 PHP 选择的一组行


Update a group of rows previusly selected with MYSQL and PHP

我有以下问题。

我在MySql数据库上有一个表INNODB,它接收连续的数据流。

该表具有datetime-deviceID字段"data"和字段"已发送"的复合索引

我正在用PHP编写一个脚本,必须这样做:

  1. 选择仍未发送的所有行 (sent=0)。(MySQL上的php查询)
  2. 将选定的列存储在 PHP 数组中。(菲律宾比索)
  3. 对设备 ID (php) 进行转换
  4. 将带有唯一插入的行发送到另一个数据库。
  5. 使用单个操作更新所有以前选择的行(点 1),并将发送的字段从 0 更新为 1。

我的问题是在第 4 点上,我不能冒着在第 1 点和第 4 点之间到达其他数据的风险,这会导致数据丢失,因为数据永远不会发送到接收器表。

为了,我想必须在第 1 点之前锁定表,直到所有过程结束,但我对交易有点陌生,我需要一些帮助。

正在寻找此代码来满足我的需求 - 我的方式是否正确?

START TRANSACTION;
SELECT value FROM table WHERE sended = 0 FOR UPDATE;
UPDATE table SET sended = 1 WHERE sended = 0;
COMMIT;

我是否能够通过 php 检索从 SELECT 操作中选择的列或受更新影响的列,我如何确定选择的列与更新相同?

可能的解决方案之一:

  1. 将代理主键添加到表中,使其成为 bigint 无符号auto_increment(您可以使用 UUID,但随后您需要更改插入语句或创建触发器)
  2. 当前主键更改为唯一索引
  3. 如果字段auto_increment则不需要对系统中的此表进行任何其他 SQL 查询
  4. 在此特定脚本中,除了当前列之外,您还需要获取它
  5. 将此 ID 发送到另一个数据库后存储在单独的数组中
  6. 在最后阶段,您需要执行以下查询: $updateSQL = 'update table set sended=1 where ID in (' . implode(',',$sentIDs).') and sended=0'; - 它将仅使用适当的ID更新所有未发送的记录(实际上第二个条件是可选的,只是我的习惯)