Heim  >  Artikel  >  Datenbank  >  Können MySQL-Transaktionen mit PDO gleichzeitig ohne Beeinträchtigung ausgeführt werden?

Können MySQL-Transaktionen mit PDO gleichzeitig ohne Beeinträchtigung ausgeführt werden?

Linda Hamilton
Linda HamiltonOriginal
2024-10-28 04:16:02829Durchsuche

 Can MySQL Transactions with PDO Run Concurrently Without Interference?

Untersuchung der Parallelität von MySQL-Transaktionen mit PDO

Das Thema Datenbanktransaktionen wird häufig von der Abkürzung ACID begleitet, die für Atomizität, Konsistenz, Isolation und Haltbarkeit steht. Vereinfacht ausgedrückt stellen Transaktionen sicher, dass Datenbankoperationen zuverlässig ausgeführt werden und nicht durch andere gleichzeitige Verbindungen beeinträchtigt werden.

Es stellt sich jedoch die Frage: Können mehrere PHP-Skripte gleichzeitig Transaktionen ohne Interferenzen ausführen? Um dies zu verstehen, stellen Sie sich das folgende Szenario vor:

Gehen Sie von einer Tabelle mit dem Namen „Mitarbeiter“ und zwei Feldern aus: „ID“ und „Gehalt“. Zwei Skripte, script1.php und script2.php, führen gleichzeitig den folgenden Code aus:

<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;

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit();</code>

Wie hoch wäre das resultierende Gehalt für „ana“ in diesem Szenario?

Die Antwort hängt davon ab die für die MySQL InnoDB-Tabellen-Engine konfigurierte Isolationsstufe. InnoDB unterstützt vier Isolationsstufen, wie im SQL-Standard angegeben:

  • Read Uncommitted
  • Read Committed
  • Repeatable Read
  • Serializable

Standardmäßig verwendet MySQL die Isolationsstufe „Read Committed“. In dieser Ebene wäre das Ergebnis 11000. Dies liegt daran, dass script1.php und script2.php dieselben Daten lesen, bevor einer von ihnen einen Commit durchführt.

Wenn die Isolationsstufe „Serialisierbar“ verwendet wird, wäre das Ergebnis 12000. Dies liegt daran, dass Serializable sicherstellt, dass Transaktionen nacheinander ausgeführt werden, und verhindert, dass andere Transaktionen gesperrte Daten beeinträchtigen.

Im gegebenen Beispiel ist die Reihenfolge der Ereignisse:

  1. script1.php wählt aus Daten
  2. script2.php wählt Daten aus
  3. script1.php aktualisiert Daten
  4. script2.php aktualisiert Daten
  5. script1.php verpflichtet sich
  6. script2.php schreibt fest

Mit der Isolation „Read Committed“ lesen beide Skripte die gleichen Daten, bevor eines von ihnen festgeschrieben wird. Daher ist die Gehaltserhöhung nicht isoliert und wird zweimal angewendet, was zu einer Erhöhung um 2000 führt.

Bei „Serializable“-Isolation sperrt die erste Transaktion (script1.php) die Zeile für „ana“, wenn sie ausgeführt wird wählt die Daten aus. Wenn script2.php versucht, dieselben Daten auszuwählen, wartet es, bis die erste Transaktion festgeschrieben wird. Dadurch wird sichergestellt, dass die Daten während des Lesens nicht durch eine andere Transaktion geändert werden und die Gehaltserhöhung nur einmal angewendet wird, was zu einer Erhöhung um 1000 führt.

Daher hängt die Interferenz zwischen gleichzeitigen Transaktionen davon ab Isolationsstufe und die spezifische Abfolge von Vorgängen. Das Verständnis der Auswirkungen verschiedener Isolationsstufen ist entscheidend, um sicherzustellen, dass sich Transaktionen in gleichzeitigen Umgebungen wie beabsichtigt verhalten.

Das obige ist der detaillierte Inhalt vonKönnen MySQL-Transaktionen mit PDO gleichzeitig ohne Beeinträchtigung ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn