多用戶同時對同一資料表執行 INSERT 或 UPDATE 時,可能出現重複資料、資料不一致等競態條件。MySQL 提供表鎖機制可實現佇列式存取。
<?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 鎖:當前連線可讀,其他連線可讀但不可寫。| 方案 | 適用場景 | 備註 |
|---|---|---|
| 表鎖 (MyISAM) | 讀多寫少、簡單業務 | 鎖粒度大,併發效能低 |
| 行鎖 | 高併發寫入 | 需 InnoDB 引擎,配合索引 |
| 樂觀鎖 | 衝突機率低 | 版本號/時間戳檢查,無資料庫鎖開銷 |
| 分散式鎖 | 多伺服器叢集 | Redis SETNX、ZooKeeper、etcd |