我正在构建一个需要从一致且同时插入的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”列有类似的问题。
任何想法,或者这样的解决方案是不可能的?