0

我有以下问题。

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

该表具有复合索引datetime-deviceID字段“数据”和字段“已发送”

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

  1. 选择所有仍未发送的行 (sent=0)。(MySQL上的php查询)
  2. 将选定的列存储在 PHP 数组中。(php)
  3. 对 deviceID (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 操作中选择的列或受 UPDATE 影响的列,我如何确定 select 的列与更新的列相同?

4

1 回答 1

0

可能的解决方案之一:

  1. 将代理主键添加到表中,使其成为 bigint unsigned 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 更新所有未发送的记录(实际上第二个条件是可选的,只是我的习惯)
于 2013-11-08T18:02:01.737 回答