Heim >PHP-Framework >Laravel >Fortgeschrittenes Laravel-Lernen: Implementieren verteilter Transaktionen basierend auf Zurücksetzen
Die folgende Tutorial-Kolumne von Laravel stellt Ihnen vor, wie LLaravel verteilte Transaktionen basierend auf dem Reset-Mechanismus implementiert. Ich hoffe, dass es für alle hilfreich ist!
Installieren Sie die Version zwischen laravel5.5 und laravel8 und installieren Sie dann das schnelle Servicepaket.
Composer benötigt Windawake/Laravel-Reset-Transaction Dev-Master.
Erstellen Sie zunächst das ResetProductController.php-Steuerelement Konverter, erstellen Sie das Modell ResetProductModel.php und erstellen Sie zwei Datenbanktabellen, reset_transaction und reset_product. Alle diese Vorgänge müssen durch Ausführen der folgenden Befehle abgeschlossen werden
php artisan resetTransact:create-examples
phpunit.xml, um testsuite Transaction hinzuzufügen
<?xml version="1.0" encoding="UTF-8"?><phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true"> <testsuites> ...... <testsuite name="Transaction"> <directory>./vendor/windawake/laravel-reset-transaction/tests</directory> </testsuite> </testsuites> ......</phpunit>
Führen Sie abschließend den Testbefehl aus./vendor/bin/phpunit --testsuite=Transaction
Laufergebnisse Wie unten gezeigt, haben 5 Beispiele den Test bestanden. ./vendor/bin/phpunit --testsuite=Transaction
运行结果如下所示,5个例子测试通过。
oot@DESKTOP-VQOELJ5:/web/linux/php/laravel/laravel62# ./vendor/bin/phpunit --testsuite=TransactionPHPUnit 8.5.20 by Sebastian Bergmann and contributors...... 5 / 5 (100%)Time: 219 ms, Memory: 22.00 MB OK (5 tests, 5 assertions)
开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。
支持http协议的服务化接口,想要支持其它协议则需要重写中间件。
支持读已提交,可重复读,与mysql的事务隔离级别同步。
看过《明日边缘》电影就会知道,存档和读档的操作。这个分布式事务组件仿造《明日边缘》电影的原理,每次请求基础服务一开始时读档,然后继续后面的操作,结束时所有操作全部回滚并且存档,最后commit把存档全部执行成功。整个过程是遵守两段提交协议,先prepare,最后commit。
以vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php
<?php namespace Tests\Feature;use Tests\TestCase;use Illuminate\Support\Facades\DB;class TransactionTest extends TestCase{ public function testCreateWithCommit() { $num = rand(1, 10000); $productName = 'php ' . $num; $data = [ 'store_id' => 1, 'product_name' => $productName, ]; // 开启分布式事务,其实是生成全局唯一id $transactId = $this->beginDistributedTransaction(); $header = [ 在header 'transact_id' => $transactId, ]; // 分布式事务内,请求都需要在request header带上transact_id $response = $this->post('api/resetProduct', $data, $header); $product = $response->json(); // 分布式事务提交,也是接口请求,把之前的存档记录全部处理 $this->commitDistributedTransaction($transactId); $response = $this->get('/api/resetProduct/' . $product['pid']); $product = $response->json(); $this->assertEquals($productName, $product['product_name']); } private function beginDistributedTransaction() { return session_create_id(); } private function commitDistributedTransaction($transactId) { $response = $this->post('/api/resetTransaction/commit', [], ['transact_id' => $transactId]); return $response->getStatusCode(); } private function rollbackDistributedTransaction($transactId) { $response = $this->post('/api/resetTransaction/rollback', [], ['transact_id' => $transactId]); return $response->getStatusCode(); }}Funktionsmerkmale
vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php
als Beispiel🎜rrreee🎜Persönliche Notizen🎜🎜Ich habe einen Laravel Rapid geschrieben Servicepaket vor, löst jedoch nicht das Problem der Datenkonsistenz. Ich habe versucht, XA zu verwenden, aber XA kann nur das Problem mehrerer Datenbanken auf einem einzelnen Computer lösen und nicht das Problem der Bedienung mehrerer Computer. Dann habe ich versucht, TCC und Seata zu studieren, aber nachdem ich es gelesen hatte, war ich verwirrt und ratlos. Da ich in eine Sackgasse gedrängt wurde, blieb mir keine andere Wahl, als meine eigene verteilte Transaktionslösung zu entwickeln. Lange Zeit habe ich immer geglaubt, dass die Verwendung von MySQL allein das Problem verteilter Transaktionen nicht lösen kann. Jetzt verstehe ich endlich, dass es immer noch einen Weg gibt! 🎜Das obige ist der detaillierte Inhalt vonFortgeschrittenes Laravel-Lernen: Implementieren verteilter Transaktionen basierend auf Zurücksetzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!