【问题标题】:MySQL Multiple processes selecting same dataMySQL 多个进程选择相同的数据
【发布时间】:2013-03-17 14:25:31
【问题描述】:

我有多个进程运行完全相同的脚本,问题是它们选择了相同的数据。我有一个标志“in_use”,被选中后设置为1,但其他进程太快,在脚本本身能够将所有数据更新为in_use = 1之前选择相同的数据。我该怎么办,也许在查询内部,确保永远不会选择相同的数据?以某种方式锁定它?

现在我为每个进程更新 in_use,但它不够快或不够安全。

DELIMITER //

DROP PROCEDURE IF EXISTS `getDomainsForWhois`;

CREATE PROCEDURE `getDomainsForWhois`(
    IN in_tld VARCHAR(10), 
    IN in_max_limit INT
) 

BEGIN 
    SELECT 
        d.domainID, 
        CONCAT(SUBSTRING_INDEX(REPLACE(d.domainName, LOWER(d.tld), ''), '.' , -1), LOWER(d.tld)) as domainName, 
        d.tld 
    FROM 
        Domains d 
    WHERE (
        d.parentDomainID IS NULL 
    AND 
        d.tld = in_tld 
    AND 
        d.dateFetched <= DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL 1 DAY) 
    AND 
        d.in_use = 0 
    ) 
    GROUP BY 
        domainName 
    ORDER BY 
        d.dateFetched ASC 
    LIMIT 
        0,in_max_limit
    FOR
        UPDATE;
END//

这基本上就是我运行脚本的方式。该脚本从多个进程(cron)同时运行:

domains=`mysql -u USER -pPASSWORD DBNAME --skip-column-names -e "LOCK TABLE Domains WRITE; CALL getDomainsForWhois('.$1', $2)"`;
while read domainID domainName domainTld
do
        mysql -u USER -pPASSWORD DBNAME -e "UPDATE Domains SET in_use = 1 WHERE domainID = $domainID";
done << EOF
$domains
EOF

mysql -u USER -pPASSWORD DBNAME -e "UNLOCK TABLES;";

【问题讨论】:

  • 您可以使用选择查询吗? `Update tbl set MyLock = UniqueIDForPRocess 然后 Select * from tbl where MyLock = UniqueIDForProcess

标签: mysql select stored-procedures locking multiple-processes


【解决方案1】:

可能只考虑锁定表

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

所以在你做 SELECT 之前

LOCK TABLE Domains WRITE;

在你这样做之后

UNLOCK TABLES;

【讨论】:

  • 这会导致所有其他进程失败,还是会在解锁后立即获取数据?
  • 任何其他请求都会等到锁被释放。然后他们也可以锁定桌子。实际上,尽管这会使多个进程变得毫无用处,除非这些进程对它们检索到的数据进行大量处理,因为每个单独的进程都将在那里等待锁被释放。另一种方法是在调用程序的脚本中执行某些操作,该程序会精确选择他们选择的内容,而不是依赖于此。
  • 当我使用“SELECT d.* FROM Domains d”时,锁定似乎不起作用,只有在不给表提供别名时(在本例中为“d”)。我怎样才能解决这个问题?
  • 进程是否共享一个 MySQL 会话?如果是这样,这可能是原因。我建议查看我链接的文档,因为它涵盖了有关锁的行为方式的大量信息。
  • 我不确定。如果有任何帮助,我添加了一些关于如何运行查询的代码。
猜你喜欢
  • 1970-01-01
  • 2010-09-29
  • 2014-01-17
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多