


Lösungen für Probleme, die auftreten, wenn PHP die Multiprozesssimulation gleichzeitiger Transaktionen implementiert
Der Inhalt dieses Artikels befasst sich mit der Lösung von Problemen, die auftreten, wenn PHP die Multiprozesssimulation gleichzeitiger Transaktionen implementiert. Ich hoffe, dass er für Sie hilfreich ist.
Tabelle
drop table if exists `test`; create table if not exists `test` ( id int not null auto_increment , count int default 0 , primary key `id` (`id`) ) engine=innodb character set utf8mb4 collate = utf8mb4_bin comment '测试表'; insert into test (`count`) values (100);
PHP-Code
// 进程数量 $pro_count = 100; $pids = []; for ($i = 0; $i < $pro_count; ++$i) { $pid = pcntl_fork(); if ($pid < 0) { // 主进程 throw new Exception('创建子进程失败: ' . $i); } else if ($pid > 0) { // 主进程 $pids[] = $pid; } else { // 子进程 try { $pdo = new PDO(...); $pdo->beginTransaction(); $stmt = $pdo->query('select `count` from test'); $count = $stmt->fetch(PDO::FETCH_ASSOC)['count']; $count = intval($count); if ($count > 0) { $count--; $pdo->query('update test set `count` = ' . $count . ' where id = 2'); } $pdo->commit(); } catch(Exception $e) { $pdo->rollBack(); throw $e; } // 退出子进程 exit; } }
Erwartetes Ergebnis
Das Zählfeld wird voraussichtlich um mehr als 100 sinken und zu einer negativen Zahl werden! Das heißt, mehr reduzieren!
Tatsächliche Ergebnisse
Bei 200 Parallelität sind die Ergebnisse nach mehrmaliger Ausführung wie folgt:
1. count = 65 2. count = 75 3. count = 55 4. count = 84 ...
Es ist weit von den Erwartungen entfernt Ergebnis! Warum passiert das?
Erklärung
Lassen Sie uns zunächst die aktuelle Programmausführungsumgebung und die Parallelitätsszenarien klar verstehen. Was ist Parallelität? Die nahezu gleichzeitige Ausführung wird als Parallelität bezeichnet. Die konkrete Erklärung lautet wie folgt:
进程 过程 获取 更新 1-40 同时创建并运行 100 99 41-80 同时创建并运行 99 98 81 - 100 同时创建并运行 98 97
Um die erste Zeile oben zu erklären, wird der 1-40
-Unterprozess fast gleichzeitig erstellt und läuft fast gleichzeitig:
进程 1 获取 count = 100,更新 99 进程 2 获取 count = 100,更新 99 ... 进程 40 获取 count = 100,更新 99
Tatsächlich funktionieren diese Prozesse alle nicht wie erwartet: Prozess 1 erhält count=100 und aktualisiert 99; Prozess 2 erhält das aktualisierte Ergebnis von Prozess 1 count=99 und erhält 98; das aktualisierte Ergebnis von Prozess 98. Das Ergebnis ist count=1, update 0
, und das Phänomen ist, dass es abnimmt! !
Fazit
In dem mit dem oben genannten Ansatz implementierten Programm ist der Bestand immer >= 0.
Frage
Wie entwerfe ich ein Programm, um ein Szenario mit Überbeständen zu simulieren?
Verwenden Sie weiterhin den obigen Code und ändern Sie den folgenden Code:
if ($count > 0) { $count--; $pdo->query('update test set `count` = ' . $count . ' where id = 2'); }
wie folgt:
if ($count > 0) { $pdo->query('update test set `count` = `count` - 1 where id = 2'); }
Das Ergebnis wird ein Überbestand sein! !
Bestand 100, Parallelität 200, endgültiger Bestand reduziert auf -63
. Warum passiert das? Im Folgenden wird der spezifische Prozess zum Ausführen des Programms beschrieben
进程 1 获取库存 100,更新 99 进程 2 获取库存 100,更新 98(99 - 1) 进程 3 获取库存 100,更新 97(98 - 1) .... 进程 168 获取库存 1 ,更新 0(1-1) 进程 169 获取库存 1 ,更新 -1(0 - 1) 进程 170 获取库存 1 ,更新 -2(-1 - 1) .... 进程 200 获取库存 1,更新 -63(-62 - 1)
Es erscheint jetzt verwirrend, wird aber tatsächlich durch die folgende Aussage verursacht:
$pdo->query('update test set `count` = `count` - 1 where id = 2');
Hier finden Sie eine detaillierte Erklärung 进程 1,简称 a;进程 2,简称 b
Ihre Besonderheiten Ausführungsreihenfolge:
1. a Abfrage des Inventars 100
b Abfrage des Inventars 100
a Aktualisieren Sie das Inventar auf 99 (100 - 1), dies sollte in Sekunden verstanden werden
4. b Der aktualisierte Bestand beträgt 98 (99 - 1)
– b erhält den aktualisierten Bestand von a, wenn der Aktualisierungsvorgang ausgeführt wird!
– Warum passiert das? Denn die Update-Anweisung lautet „update test set count = count – 1 where id = 2“
Das obige ist der detaillierte Inhalt vonLösungen für Probleme, die auftreten, wenn PHP die Multiprozesssimulation gleichzeitiger Transaktionen implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

PHP bleibt in der modernen Webentwicklung wichtig, insbesondere in Content-Management- und E-Commerce-Plattformen. 1) PHP hat ein reichhaltiges Ökosystem und eine starke Rahmenunterstützung wie Laravel und Symfony. 2) Die Leistungsoptimierung kann durch OPCACHE und NGINX erreicht werden. 3) Php8.0 führt den JIT -Compiler ein, um die Leistung zu verbessern. 4) Cloud-native Anwendungen werden über Docker und Kubernetes bereitgestellt, um die Flexibilität und Skalierbarkeit zu verbessern.

PHP ist immer noch dynamisch und nimmt immer noch eine wichtige Position im Bereich der modernen Programmierung ein. 1) Einfachheit und leistungsstarke Unterstützung von PHP machen es in der Webentwicklung weit verbreitet. 2) Seine Flexibilität und Stabilität machen es ausstehend bei der Behandlung von Webformularen, Datenbankoperationen und Dateiverarbeitung; 3) PHP entwickelt sich ständig weiter und optimiert, geeignet für Anfänger und erfahrene Entwickler.

PHP wird verwendet, um dynamische Websites zu erstellen. Zu den Kernfunktionen gehören: 1. Dynamische Inhalte generieren und Webseiten in Echtzeit generieren, indem Sie eine Verbindung mit der Datenbank herstellen; 2. Verarbeiten Sie Benutzerinteraktions- und Formulareinreichungen, überprüfen Sie Eingaben und reagieren Sie auf Operationen. 3. Verwalten Sie Sitzungen und Benutzerauthentifizierung, um eine personalisierte Erfahrung zu bieten. 4. Optimieren Sie die Leistung und befolgen Sie die Best Practices, um die Effizienz und Sicherheit der Website zu verbessern.

Apache verbindet eine Verbindung zu einer Datenbank erfordert die folgenden Schritte: Installieren Sie den Datenbanktreiber. Konfigurieren Sie die Datei web.xml, um einen Verbindungspool zu erstellen. Erstellen Sie eine JDBC -Datenquelle und geben Sie die Verbindungseinstellungen an. Verwenden Sie die JDBC -API, um über den Java -Code auf die Datenbank zuzugreifen, einschließlich Verbindungen, Erstellen von Anweisungen, Bindungsparametern, Ausführung von Abfragen oder Aktualisierungen und Verarbeitungsergebnissen.

PHP wird in E-Commerce, Content Management Systems und API-Entwicklung häufig verwendet. 1) E-Commerce: Wird für die Einkaufswagenfunktion und Zahlungsabwicklung verwendet. 2) Content -Management -System: Wird für die Erzeugung der dynamischen Inhalte und die Benutzerverwaltung verwendet. 3) API -Entwicklung: Wird für die erholsame API -Entwicklung und die API -Sicherheit verwendet. Durch Leistungsoptimierung und Best Practices werden die Effizienz und Wartbarkeit von PHP -Anwendungen verbessert.

PHP und Python haben ihre eigenen Vor- und Nachteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1.PHP eignet sich für eine schnelle Entwicklung und Wartung großer Webanwendungen. 2. Python dominiert das Gebiet der Datenwissenschaft und des maschinellen Lernens.

PHP verwendet MySQLI- und PDO-Erweiterungen, um in Datenbankvorgängen und serverseitiger Logikverarbeitung zu interagieren und die serverseitige Logik durch Funktionen wie Sitzungsverwaltung zu verarbeiten. 1) Verwenden Sie MySQLI oder PDO, um eine Verbindung zur Datenbank herzustellen und SQL -Abfragen auszuführen. 2) Behandeln Sie HTTP -Anforderungen und Benutzerstatus über Sitzungsverwaltung und andere Funktionen. 3) Verwenden Sie Transaktionen, um die Atomizität von Datenbankvorgängen sicherzustellen. 4) Verhindern Sie die SQL -Injektion, verwenden Sie Ausnahmebehandlung und Schließen von Verbindungen zum Debuggen. 5) Optimieren Sie die Leistung durch Indexierung und Cache, schreiben Sie hochlesbarer Code und führen Sie die Fehlerbehandlung durch.
