簡體   English   中英

如何同步mysql數據庫請求?

[英]how to synchronize mysql database requests?

我在表中有很多條目是為執行工作而提取的。 它可以擴展到多個服務器。

當服務器獲取一堆要添加到其自己的作業隊列中的行時,應將它們“鎖定”,以便其他服務器都無法獲取它們。 執行更新時,時間戳會增加,並且它們會“解鎖”。

我目前通過更新表中默認為null且具有工作服務器ID的表中稱為“工作服務器”的字段來實現此目的。

作業服務器僅選擇字段為空的行。

處理完所有行后,它們的時間戳將更新,最后job字段再次設置為null。

所以我需要同步這個:

$jobs = mysql_query("
SELECT itemId 
FROM items 
WHERE 
jobserver IS NULL 
AND 
DATE_ADD(updated_at, INTERVAL 1 DAY) < NOW()
LIMIT 100
");

mysql_query("UPDATE items SET jobserver = 'current_job_server' WHERE itemId IN (".join(',',mysql_fetch_assoc($jobs)).")");

// do the update process in foreach loop
// update updated_at for each item and set jobserver to null

每個服務器都會無限循環地執行上述操作。 如果未返回任何字段,則所有內容均為2日期(最近更新不早於24小時),並發送至10分鍾。

我目前擁有MyIsam,我想繼續使用它,因為在我的情況下,它的性能比innodb更好,但是我聽說innodb具有ACID事務。

這樣我就可以執行選擇和更新。 但是外觀和效果如何?

問題是我負擔不起鎖定表或其他東西,因為其他進程需要讀/寫並且不能被鎖定。

我也願意接受更高級別的解決方案,例如共享信號燈等。問題是同步需要跨多個服務器進行。

  • 這種方法通常理智嗎? 你會做不同的事情嗎?

  • 我該如何同步作業選擇以確保兩台服務器不更新相同的行?

您可以先運行UPDATE,但要使用SELECT上的WHERE和LIMIT。 然后,選擇將jobserver字段設置為服務器的行。

如果您負擔不起鎖定表的費用,那么我將使更新以不被修改的行為條件。 就像是:

$timestamp = mysql_query("SELECT DATE_SUB(NOW(), INTERVAL 1 DAY)");

$jobs = mysql_query("
SELECT itemId 
FROM items 
WHERE 
jobserver IS NULL 
AND 
updated_at < ".$timestamp."
LIMIT 100
");

// Update only those which haven't been updated in the meantime
mysql_query("UPDATE items SET jobserver = 'current_job_server' WHERE itemId IN (".join(',',mysql_fetch_assoc($jobs)).") AND updated_at < ".$timestamp);

// Now get a list of jobs which were updated
$actual_jobs_to_do = mysql_query("
SELECT itemId
FROM items
WHERE jobserver = 'current_job_server'
");

// Continue processing, with the actual list of jobs

您甚至可以組合選擇查詢和更新查詢,如下所示:

mysql_query("
UPDATE items
SET jobserver = 'current_job_server'
WHERE jobserver IS NULL
AND updated_at < ".$timestamp."
LIMIT 100
");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM