PHP文件強調了事務的好處,強調它們確保資料庫內原子、一致、隔離和持久操作的能力.
問題:
這是否意味著並發運行事務的單獨PHP 腳本可以不受干擾地運行?
關於幹擾的詳細說明:
考慮兩個具有以下資料的員工表:
id | name | salary |
---|---|---|
1 | ana | 10000 |
具有相似程式碼的兩個腳本同時執行:
script1.php 和script2.php:
<code class="php">$conn->beginTransaction(); $stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?"); $stmt->execute(['ana']); $row = $stmt->fetch(PDO::FETCH_ASSOC); $salary = $row['salary']; $salary = $salary + 1000;//increasing salary $stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?"); $stmt->execute(['ana']); $conn->commit();</code>
問題是關於「ana」在不同執行場景下的薪資結果。
答案:
結果取決於隔離等級為 MySQL 中的 InnoDB 表引擎配置。根據 SQL 標準,有四個隔離等級:
在給定的場景中,使用 SERIALIZABLE 隔離等級並停用自動提交將導致工資為 12000,因為每個事務都是隔離的並按順序執行。
但是,使用任何其他隔離等級或啟用自動提交的 SERIALIZABLE ,結果將為 11000。這是因為在這些情況下事務可能會重疊,從而存在潛在的干擾。使用鎖定讀取也會影響結果,可能會導致在所有隔離等級下工資為 12000。
因此,所採用的特定隔離等級和組態設定將決定 PHP 腳本中並發事務之間的干擾或缺乏.
以上是PDO MySQL 中的並發 PHP 交易會互相干擾嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!