首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

解決 PHP 高併發下 MySQL 資料表鎖衝突:表鎖機制實戰

     編輯:PHP 相關知識

問題背景

多用戶同時對同一資料表執行 INSERT 或 UPDATE 時,可能出現重複資料、資料不一致等競態條件。MySQL 提供表鎖機制可實現佇列式存取。

PHP 中實作表鎖流程

<?php
// 1. 寫鎖定(排他鎖,阻塞其他讀寫)
$sql = "LOCK TABLES alliance_perf WRITE";
mysql_query($sql, $conn);

// 2. 執行核心寫入操作
// INSERT / UPDATE 等業務邏輯
mysql_query("INSERT INTO alliance_perf ...", $conn);

// 3. 釋放鎖定
$sql = "UNLOCK TABLES";
mysql_query($sql, $conn);
?>

關鍵說明

  • WRITE 鎖:當前連線可讀寫,其他連線阻塞等待(不可讀不可寫)。
  • READ 鎖:當前連線可讀,其他連線可讀但不可寫。
  • 必須在同一連線內完成「鎖定 → 操作 → 解鎖」,否則鎖定無效。
  • 若腳本異常終止,MySQL 會自動釋放鎖定,避免死鎖。

效能與替代方案

最佳實踐建議

  1. 優先評估是否可用 InnoDB 行鎖 + 事務 替代表鎖。
  2. 若必須用表鎖,將鎖定範圍縮至最小(僅核心寫入 SQL)。
  3. 避免在鎖定期間進行網路請求、複雜運算等耗時操作。
  4. 監控 Table_locks_waited 與 Table_locks_immediate 狀態變數,評估鎖爭用程度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案適用場景備註
表鎖 (MyISAM)讀多寫少、簡單業務鎖粒度大,併發效能低
行鎖高併發寫入需 InnoDB 引擎,配合索引
樂觀鎖衝突機率低版本號/時間戳檢查,無資料庫鎖開銷
分散式鎖多伺服器叢集Redis SETNX、ZooKeeper、etcd