从MySQL表读取增量数据行时丢失数据

时间:2017-04-22 01:05:46

标签: mysql database

我正在构建一个需要从一致且同时插入的MySQL表中读取新行的应用程序。我无法设计一个逻辑,可以确保我处理插入MySQL表的每一行。

这是我目前的解决方案。

CREATE TABLE my_table (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  col1 varchar(20),
  col2 varchar(20),
  dateadded timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
)

此表仅被许多并发连接插入(无更新,无删除)。

在我的应用程序中,我保持上次处理的“id”的状态,即“lastProcessedId”。

第1步:从表中获取新行

SELECT id, col1, col2, dateadded
FROM my_table
WHERE id > {lastProcessedId}
ORDER BY id ASC

第2步:处理结果集

在我的应用程序中,我遍历结果,对每一行进行一些处理,并将我的内部{lastProcessedId}更新为我在结果中看到的最后一个“id”

回到第1步。

这是问题所在。

在步骤1中使用查询可见的行可能没有顺序ID,因此我可能会错过处理应用程序中的某些行,因为它看起来像在MySQL中的AUTO_INCREMENT id在交易开始而不是COMMIT。

情景。

1. Let say the table has 5 rows with the MAX(id) also being 5.
2. Transaction 1 to insert a new row to my_table starts, it will get an internal id of 6.
3. Transaction 2 to insert a new row to my_table starts, it will get an internal id of 7.
4. Transaction 2 commits.
5. My application which reads the "new" data runs the query on Step 1 (previous lastProcessedId is 5).
6. My result set will include row with id 7. My application updates lastProcessedId to 7.
7. Transaction 1 commits with id of 6.
8. With the next iteration of my application, I would have missed processing row with id 6.

有没有办法从MySQL表中逐步处理行,并保证我的应用程序可以处理任何行。我可以更改表模式和应用程序逻辑,但还没有找到任何解决问题的方法。我发现使用“dateadded”列有类似的问题。

任何想法,或者这样的解决方案是不可能的?

0 个答案:

没有答案