Erweiterte PHP-Datenbankverbindungen: Transaktionen, Sperren und Parallelitätskontrolle

WBOY
Freigeben: 2024-06-01 11:43:56
Original
329 Leute haben es durchsucht

Erweiterte PHP-Datenbankverbindungen umfassen Transaktionen, Sperren und Parallelitätskontrolle, um die Datenintegrität sicherzustellen und Fehler zu vermeiden. Eine Transaktion ist eine atomare Einheit einer Reihe von Vorgängen, die über die Methoden beginTransaction(), commit() und rollback() verwaltet werden. Sperren verhindern den gleichzeitigen Zugriff auf Daten über PDO::LOCK_SHARED und PDO::LOCK_EXCLUSIVE. Die Parallelitätskontrolle koordiniert den Zugriff auf mehrere Transaktionen über MySQL-Isolationsstufen (Read Uncommitted, Read Committed, Repeatable Read, Serializable). In praktischen Anwendungen werden Transaktionen, Sperren und Parallelitätskontrolle für die Produktbestandsverwaltung auf Einkaufswebsites verwendet, um die Datenintegrität sicherzustellen und Bestandsprobleme zu vermeiden.

高级 PHP 数据库连接:事务、锁和并发控制

Erweiterte PHP-Datenbankverbindung: Transaktionen, Sperren und Parallelitätskontrolle

Bei der Interaktion mit Datenbanken mithilfe von PHP ist das Verständnis fortgeschrittener Konzepte wie Transaktionen, Sperren und Parallelitätskontrolle von entscheidender Bedeutung, um die Datenintegrität sicherzustellen und Fehler in Ihrer Anwendung zu vermeiden.

Transaktionen

Eine Transaktion ist eine Sammlung von Datenbankoperationen, die als atomare Einheit ausgeführt werden. Dies bedeutet, dass alle Vorgänge in der Transaktion entweder alle erfolgreich sind oder alle fehlschlagen.

Verwenden Sie die Methoden beginTransaction(), commit() und rollback(), um Transaktionen zu starten, festzuschreiben und zurückzusetzen: beginTransaction()commit()rollback() 方法来启动、提交和回滚事务:

$db->beginTransaction();
try {
    // 执行数据库操作
    $db->commit();
} catch (\Exception $e) {
    $db->rollback();
}
Nach dem Login kopieren

锁用于防止事务同时访问相同的数据库数据。PHP 的 PDO 提供了两种锁定模式:

  • PDO::LOCK_SHARED:允许事务读取数据,但不能写入。
  • PDO::LOCK_EXCLUSIVE:允许事务读取和写入数据,但其他事务无法同时访问。

要通过 query() 方法对表行进行锁定:

$stmt = $db->query('SELECT * FROM table WHERE id = 1 FOR UPDATE');
Nach dem Login kopieren

并发控制

并发控制机制确保当多个事务同时访问数据库时不会发生数据冲突。MySQL 提供了以下隔离级别:

  • 读未提交 (READ UNCOMMITTED):事务可以读取其他事务未提交的数据。
  • 读已提交 (READ COMMITTED):事务只能读取其他已提交的事务的数据。
  • 可重复读 (REPEATABLE READ):事务在整个生命周期内都可以看到其他已提交事务的数据,但不能看到未提交的事务的数据。
  • 串行化 (SERIALIZABLE):事务串行执行,避免任何并发冲突。

您可以在连接到数据库时通过 PDO::ATTR_DEFAULT_FETCH_MODE

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_TRANSACTION_ISOLATION, PDO::ISOLATION_READ_COMMITTED);
Nach dem Login kopieren

Lock

Sperren werden verwendet, um zu verhindern, dass Transaktionen gleichzeitig auf dieselben Datenbankdaten zugreifen. Das PDO von PHP bietet zwei Sperrmodi:

  • PDO::LOCK_SHARED: ermöglicht Transaktionen das Lesen von Daten, aber nicht das Schreiben.
  • PDO::LOCK_EXCLUSIVE: Transaktionen dürfen Daten lesen und schreiben, andere Transaktionen können jedoch nicht gleichzeitig darauf zugreifen.

So sperren Sie Tabellenzeilen über die Methode query():

// 启动事务
$db->beginTransaction();

// 锁定产品行
$stmt = $db->query('SELECT * FROM products WHERE id = :id FOR UPDATE');
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 获取产品数量
$product = $stmt->fetch();
$quantity = $product['quantity'];

// 检查库存
if ($quantity <= 0) {
    $db->rollback();
    throw new RuntimeException('Product is out of stock.');
}

// 更新库存
$quantity--;
$stmt = $db->prepare('UPDATE products SET quantity = :quantity WHERE id = :id');
$stmt->bindParam(':quantity', $quantity);
$stmt->bindParam(':id', $productId);
$stmt->execute();

// 提交事务
$db->commit();
Nach dem Login kopieren
Parallelitätskontrolle🎜🎜Der Parallelitätskontrollmechanismus stellt sicher, dass es nicht auftritt, wenn mehrere Transaktionen auf die Datenbank zugreifen gleichzeitig Datenkonflikt. MySQL bietet die folgenden Isolationsstufen: 🎜
  • READ UNCOMMITTED:Transaktionen können nicht festgeschriebene Daten aus anderen Transaktionen lesen.
  • READ COMMITTED: Transaktionen können nur Daten von anderen festgeschriebenen Transaktionen lesen.
  • WIEDERHOLBARES LESEN: Eine Transaktion kann die Daten anderer festgeschriebener Transaktionen während ihres gesamten Lebenszyklus sehen, nicht jedoch die Daten nicht festgeschriebener Transaktionen.
  • SERIALISIERBAR: Transaktionen werden seriell ausgeführt, um Parallelitätskonflikte zu vermeiden.
🎜Sie können die Isolationsstufe über die Option PDO::ATTR_DEFAULT_FETCH_MODE festlegen, wenn Sie eine Verbindung zur Datenbank herstellen: 🎜rrreee🎜Praktischer Fall🎜🎜Stellen Sie sich eine Online-Shopping-Website vor, auf der Benutzer dies tun können Produkt in den Warenkorb legen und kaufen. Um Probleme zu verhindern, wie z. B. das gleichzeitige Hinzufügen desselben Produkts zum Warenkorb durch mehrere Benutzer, können Transaktionen, Sperren und Parallelitätskontrolle verwendet werden, um die Datenintegrität sicherzustellen: 🎜rrreee🎜 Durch den Einsatz von Transaktionen, Sperren und Parallelitätskontrolle So können wir die Datenbankintegrität des Benutzers beim Kauf von Produkten sicherstellen und Bestandsprobleme vermeiden. 🎜

Das obige ist der detaillierte Inhalt vonErweiterte PHP-Datenbankverbindungen: Transaktionen, Sperren und Parallelitätskontrolle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage