首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL行锁myisam innodb

MySQL行锁myisam innodb
EN

Stack Overflow用户
提问于 2012-02-25 03:21:36
回答 4查看 1.5K关注 0票数 1

我有一个理论上的问题,在网上找不到一个好的解决方案:

对于有100,000个recs的tblA。

我希望运行多个进程/应用程序,每个进程/应用程序都访问tblA。

我不希望这些应用程序访问相同的recs。也就是说,我希望appA访问前50行,appB访问下50行,appC访问后50行。

因此,基本上我希望应用程序在表中的下一个"N“个recs上执行一种抓取。我正在寻找一种方法来尽可能快地访问/处理行数据,本质上是以同时运行的方式运行应用程序。但我不希望应用程序处理相同的行。

那么,这种过程到底应该如何建立呢?

它是不是只是在做一种:

代码语言:javascript
复制
 select from tblA limit 50 
 and doing some kind of row locking for each row (which requires innodb)

指针/psuedo代码会很有用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-25 06:08:30

以下是数据库管理员StackExchange关于此问题的一些帖子

它讨论了SELECT ... LOCK IN SHARE MODE和随之而来的潜在问题。

Percona和SELECT ... FOR UPDATE就此写了一篇很好的文章

票数 1
EN

Stack Overflow用户

发布于 2012-02-25 06:26:45

您的应用程序应该处理它想要访问的数据。在其中创建一个指针。如果您使用的是存储过程,请使用另一个表来存储指针。每个进程将在开始处理之前“保留”一组行。每个进程都应该检查其中的最大值,并查看它是否大于表的长度。

票数 0
EN

Stack Overflow用户

发布于 2012-02-25 10:17:44

如果您专门寻找处理第一个集合、第二个集合等,则可以使用带有ORDER BY的LIMIT #(即0,50 51,100 101,150)。锁定是不必要的,因为进程甚至不会尝试访问彼此的记录集。但是我不能想象这样的场景会是一个很好的实现。

另一种方法是只使用有限制的update,然后选择已更新的记录。您可以使用进程ID、随机数或几乎可以保证在所有进程中唯一的其他值。在您的表中添加一个"status“字段,指示记录是否可用于处理(即值为NULL)。然后,每个进程将状态字段更新为“拥有”要处理的记录。

代码语言:javascript
复制
UPDATE tblA SET status=1234567890 WHERE status IS NULL LIMIT 50;
SELECT * FROM tblA WHERE status=1234567890;

这将适用于MyISAM或Innodb。使用Innodb,您将能够同时运行多个更新,从而提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9436728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档