MySQL锁定需要选择

时间:2015-10-01 10:44:15

标签: php mysql mysqli transactions

我有一个相当大的表,有150个单独的PHP脚本连接,选择要处理的数据,更新为in_use,然后处理。

因此,在同一会话中没有脚本选择与另一个相同的数据,in_use已设置,并且事务锁用于确保没有脚本选择与另一个相同的数据。这是代码(在PHP中):

$sql - "select data....FOR UPDATE;" // <-- real query is much longer and not really neccesary here.

mysqli_autocommit($db_connect, FALSE);
mysqli_begin_transaction($db_connect, MYSQLI_TRANS_START_READ_WRITE);
$b = mysqli_query($db_connect, $sql);
$to_process = mysqli_fetch_all($b, MYSQLI_ASSOC);
$s = "'" . implode("', '", $to_process) . "'";
mysqli_query($db_connect, "UPDATE `users` SET `in_use` = 1 WHERE `username` IN ({$s});");
mysqli_commit($db_connect);

问题在于,每次选择(手动完成需要几秒钟),在150个查询中的每个查询之间需要10分钟(这意味着总共只需要1500分钟选择数据)。是否有MySQL使用的频率变量来查看何时检查锁是否空闲?我真的需要加快速度,因为每个SELECT查询之间只需要几秒钟。

全部谢谢!

修改

查询是:

SELECT DISTINCT `username` 
FROM `users` 
WHERE `in_use` = 0 
  AND `username_from` IN 
      ( SELECT DISTINCT `username` 
        FROM `source_accounts` 
        WHERE `group_users` = '{$owner['group_users']}' 
          AND (`type` = 'users' OR `type` = 'both') 
          AND `use` = '1'
      ) 
   AND `username` NOT IN 
      ( SELECT `user_request` 
        FROM `request_history` 
        WHERE `owner_account` = '{$owner['username']}'
      ) 
   LIMIT {$owner['follow']} FOR UPDATE;

0 个答案:

没有答案