-4

我有一个如下的mysql表;

*客户表:

IDcustomer、cname、cadress、readedToProcess、.....*

为了执行一个关键进程,有 400 个客户端/PC 正在这个表上工作。每个客户端/电脑正在读取下一个尚未处理的客户。并执行该过程......每个客户不得被阅读(处理)超过一次。这个非常重要。

该表有大约 100 万条记录。每秒几乎有 1 次读取/处理。为此,我正在使用 readToProcess 字段。当我读取客户记录时,我立即将 readedToProcess 更新为 1... 在读取下一条记录时,我首先检查 readedToProcess 字段,如果它不是 1,我会读取。但这并不能解决我的问题。客户端/PC 读取了客户记录,其他客户端/PC 可能读取相同的记录,在第一个客户端/PC 更新 readToProcess 字段为 1 之前... 处理完所有客户后出现 10 - 100 次重复读取/处理(完成)

我必须限制每条客户记录只能读取一次..(此表不用于其他目标)

我怎么解决这个问题?是否可以将 readToProcess 字段更新为 1,而我在同一查询中读取该行...如果可能的话,您可以为上面的表编写 sql 查询...。

或者你推荐什么?

非常感谢,

对不起,我的英语不好...

4

3 回答 3

1

我不太确定我是否理解正确,我的英语也不是最好的。

无论如何,我想提一下,绑定在 SELECT 行上的存储过程可能是您更新 readedToProcess 值的方法。不幸的是,触发器不能绑定到选择 - 看看我可以在 mysql 中的 select 语句上启动触发器吗?

不过,这听起来不像是面向未来的设计……

于 2013-05-06T12:27:44.183 回答
1

我认为您将需要一些读取锁定,如本文所示: http: //dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

在某些情况下,一致(非锁定)读取并不方便,而是需要锁定读取。InnoDB 支持两种类型的锁定读取:

SELECT ... LOCK IN SHARE MODE 在读取的行上设置共享模式锁。共享模式锁使其他会话能够读取行但不能修改它们。读取的行是最新可用的,因此如果它们属于尚未提交的另一个事务,则读取会阻塞,直到该事务结束。

对于搜索遇到的索引记录,SELECT ... FOR UPDATE 阻止其他会话执行 SELECT ... LOCK IN SHARE MODE 或读取某些事务隔离级别。一致读取将忽略在读取视图中存在的记录上设置的任何锁定。(旧版本的记录不能被锁定;它们将通过在记录的内存副本上应用撤消日志来重建。)

由 LOCK IN SHARE MODE 和 FOR UPDATE 读取设置的锁在事务提交或回滚时被释放。

于 2013-05-06T12:30:19.430 回答
0

另一个想法:

创建一个新表 - 仅使用您在第一个表中更新的主键列。

每个工作站读取它认为要处理的行,然后将其插入到这个新表中。

如果插入有效,那么好的,如果插入失败并违反 UNIQUENESS(来自唯一索引),那么您不应该继续。

于 2013-05-06T12:37:28.037 回答