Heim  >  Artikel  >  PHP-Framework  >  Fortgeschrittenes Laravel-Lernen: Implementieren verteilter Transaktionen basierend auf Zurücksetzen

Fortgeschrittenes Laravel-Lernen: Implementieren verteilter Transaktionen basierend auf Zurücksetzen

藏色散人
藏色散人nach vorne
2021-11-09 15:37:281846Durchsuche

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!

Schnelle Vorschau

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=TransactionLaufergebnisse 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 = &#39;php &#39; . $num;
        $data = [
            &#39;store_id&#39; => 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

  • Sofort einsatzbereit, keine Notwendigkeit, den Code des Originalprojekts zu rekonstruieren, konsistent mit dem Schreiben von MySQL-Transaktionen, einfache und einfache Bedienung. 🎜
  • 🎜Unterstützt die Serviceschnittstelle des http-Protokolls. Wenn Sie andere Protokolle unterstützen möchten, müssen Sie die Middleware neu schreiben. 🎜
  • 🎜Unterstützt Read Commit, wiederholbares Lesen und ist mit der Transaktionsisolationsstufe von MySQL synchronisiert. 🎜
🎜🎜🎜Prinzipienanalyse🎜🎜Wenn Sie den Film „Edge of Tomorrow“ gesehen haben, kennen Sie den Vorgang des Archivierens und Ladens. Diese verteilte Transaktionskomponente ahmt das Prinzip des Films „Edge of Tomorrow“ nach. Bei jeder Anforderung eines Basisdienstes wird die Datei zu Beginn gelesen und die nachfolgenden Vorgänge werden am Ende fortgesetzt archiviert und schließlich wird das Commit erfolgreich ausgeführt. Der gesamte Prozess folgt einem zweistufigen Festschreibungsprotokoll: Zuerst vorbereiten und schließlich festschreiben. 🎜🎜🎜🎜So verwenden Sie🎜🎜Nehmen Sie die Datei 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen