Mysql:限制一行只读一次

时间:2013-05-06 12:22:10

标签: mysql

我有一个像下面这样的mysql表;

* CUSTOMMERS表:

IDcustomer,cname,cadress,readedToProcess,..... *

为执行关键流程,400客户端/个人正在使用此表。每个客户端/ PC正在读取尚未处理的下一个客户。并执行该过程......每个客户都不得超过一次阅读(处理)。这是非常重要的。

该表有大约100万条记录。每秒几乎有1次读取/处理。我正在使用readedToProcess字段来实现此目的。当我读取客户记录时,我立即将readedToProcess更新为1 ...在读取下一条记录时,我首先检查readedToProcess字段,如果它不是1,我读了。但这不能解决我的问题。客户端/ PC重新读取客户记录,其他客户端/ PC可以读取相同的记录,在第一次客户端/ PC更新readedToProcess字段为1之前...是读取和更新时间非常低,以便公开读取但它的发生。所有客户处理(完成)

后,将显示10 - 100个公开阅读/处理

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

我该如何解决这个问题?是否有可能将readedToProcess字段更新为1,同时我读取了行,同样的查询......如果可能的话,你可以为上面的表编写sql查询....

或者你推荐什么?

非常感谢,

抱歉我的英语不好......

3 个答案:

答案 0 :(得分:1)

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

无论如何,我想提一下绑定在SELECT行上的存储过程可能是更新readedToProcess值的方法。不幸的是,触发器无法选择 - 请参阅can i launch a trigger on select statement in mysql?

虽然听起来不像未来的设计......

答案 1 :(得分: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读取在事务提交或回滚时释放。

答案 2 :(得分:0)

另一个想法:

创建一个新表 - 只包含您要在第一个表中更新的主键列。

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

如果插入有效,那么好吧,如果插入失败且UNIQUENESS违规(来自唯一索引)那么你就不应该继续了。