首頁  >  文章  >  資料庫  >  PDO MySQL 中的並發 PHP 交易會互相干擾嗎?

PDO MySQL 中的並發 PHP 交易會互相干擾嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-01 04:43:27378瀏覽

 Can Concurrent PHP Transactions in PDO MySQL Interfere with Each other?

了解 PDO MySQL 中的事務隔離

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 標準,有四個隔離等級:

  • READ UNCOMMITTED: 允許讀取未提交的資料。並發事務可能會相互幹擾。
  • READ COMMITTED: 只允許讀取其他交易提交的資料。並發事務通常不會幹擾。
  • 可重複讀取: 防止其他交易修改目前交易讀取的資料。如果並發事務嘗試修改相同的數據,它們仍然可能會產生幹擾。
  • SERIALIZABLE:確保交易以串列方式執行,防止並發交易之間出現任何干擾。

在給定的場景中,使用 SERIALIZABLE 隔離等級並停用自動提交將導致工資為 12000,因為每個事務都是隔離的並按順序執行。

但是,使用任何其他隔離等級或啟用自動提交的 SERIALIZABLE ,結果將為 11000。這是因為在這些情況下事務可能會重疊,從而存在潛在的干擾。使用鎖定讀取也會影響結果,可能會導致在所有隔離等級下工資為 12000。

因此,所採用的特定隔離等級和組態設定將決定 PHP 腳本中並發事務之間的干擾或缺乏.

以上是PDO MySQL 中的並發 PHP 交易會互相干擾嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn