我有一個帶有電子郵件的MySQL表將被髮送出去。避免競爭條件,但仍然能夠回滾
在每個頁面加載時,我檢查是否有任何未發送的電子郵件,接收它們中的一些併發送它們。
爲了防止兩個同時發生的頁面加載從發出相同的電子郵件,我想在做這樣的事情的:
$pdo = new PDO(...);
// Start blocking other page loads
$pdo->beginTransaction();
$stmt = $pdo->query("SELECT id, recipient, subject, body
FROM emails WHERE sent = 0 LIMIT 1 FOR UPDATE");
$mail = $stmt->fetch();
if(false !== $mail)
$pdo->exec("UPDATE emails SET sent = 1 WHERE id = $mail['id']");
// End blocking other page loads
$pdo->commit();
if(false !== $mail) {
// Send e-mail
}
但如果執行後提交中止什麼,但電子前郵件成功發送?電子郵件將作爲發送的市場,但實際上並未發送。當然,我可以等到發送電子郵件之後再進行提交,但這會導致更長的阻止時間。我通過SMTP發送電子郵件,發送單個電子郵件大約需要10秒。
你對如何解決這個問題有什麼想法嗎?一種選擇可能是檢測表是否被鎖定,然後跳過整個步驟。這可能嗎?
你是否在頁面加載中檢查了這個,因爲你不能在你的webspace上使用cronjobs? –