Rumah  >  Artikel  >  rangka kerja php  >  Pembelajaran lanjutan Laravel: melaksanakan transaksi yang diedarkan berdasarkan tetapan semula

Pembelajaran lanjutan Laravel: melaksanakan transaksi yang diedarkan berdasarkan tetapan semula

藏色散人
藏色散人ke hadapan
2021-11-09 15:37:282001semak imbas

Perkara berikut disyorkan oleh lajur tutorial Laravel untuk memperkenalkan cara LLaravel melaksanakan transaksi yang diedarkan berdasarkan mekanisme penetapan semula. Saya harap ia akan membantu semua orang.

Pratonton pantas

Pasang versi antara laravel5.5 - laravel8, dan kemudian pasang pakej perkhidmatan pantas

komposer memerlukan windawake / laravel-reset-transaction dev-master

Mula-mula buat pengawal ResetProductController.php, buat model ResetProductModel.php dan buat dua jadual pangkalan data, reset_transaction dan reset_product. Semua operasi ini perlu diselesaikan dengan melaksanakan arahan berikut

php artisan resetTransact:create-examples

phpunit.xml Tambah Transaksi testsuite

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

Akhirnya jalankan arahan ujian ./vendor/bin/phpunit --testsuite=Transaction
Hasil yang sedang dijalankan adalah seperti berikut, 5 Ujian contoh lulus.

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)

Ciri Fungsian

  • Ia boleh digunakan di luar kotak Tidak perlu membina semula kod projek asal . Ia konsisten dengan kaedah penulisan transaksi mysql yang Mudah dan mudah digunakan.

  • Menyokong antara muka perkhidmatan protokol http Jika anda ingin menyokong protokol lain, anda perlu menulis semula perisian tengah.

  • Menyokong bacaan komited, bacaan berulang dan disegerakkan dengan tahap pengasingan transaksi mysql.

Analisis Prinsip

Setelah menonton filem "Edge of Tomorrow", anda akan mengetahui operasi pengarkiban dan pemuatan. Komponen urus niaga yang diedarkan ini meniru prinsip filem "Edge of Tomorrow" Setiap kali perkhidmatan asas diminta, fail dibaca pada permulaan, dan kemudian diteruskan dengan operasi seterusnya Pada akhirnya, semua operasi digulung semula dan diarkibkan , dan akhirnya komit dilaksanakan dengan jayanya. Keseluruhan proses mengikut protokol komit dua peringkat, mula-mula sediakan dan akhirnya komit.

Cara menggunakan

Ambil vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php fail sebagai contoh

<?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();
    }}

Nota peribadi

Saya menulis laravel dengan pantas sebelum pakej Perkhidmatan, tetapi ia tidak menyelesaikan masalah ketekalan data. Saya cuba menggunakan XA, tetapi XA hanya boleh menyelesaikan masalah berbilang pangkalan data pada satu mesin dan tidak dapat menyelesaikan masalah servis berbilang mesin. Kemudian saya cuba belajar tcc dan seata, tetapi selepas membacanya, saya keliru dan buntu. Kerana terpaksa menemui jalan buntu, saya tidak mempunyai pilihan selain mencipta penyelesaian transaksi yang diedarkan saya sendiri. Untuk masa yang lama, saya sentiasa berfikir bahawa menggunakan MySQL sahaja tidak dapat menyelesaikan masalah transaksi yang diedarkan Sekarang saya akhirnya faham bahawa masih ada cara!

Atas ialah kandungan terperinci Pembelajaran lanjutan Laravel: melaksanakan transaksi yang diedarkan berdasarkan tetapan semula. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam