>PHP 프레임워크 >Laravel >Laravel 고급 학습: 재설정을 기반으로 분산 트랜잭션 구현

Laravel 고급 학습: 재설정을 기반으로 분산 트랜잭션 구현

藏色散人
藏色散人앞으로
2021-11-09 15:37:282054검색

다음 튜토리얼 칼럼인 Laravel에서는 Llaravel이 재설정 메커니즘을 기반으로 분산 트랜잭션을 구현하는 방법을 소개합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

빠른 미리보기

laravel5.5 - laravel8 사이의 버전을 설치한 다음 빠른 서비스 패키지를 설치하세요

composer require windawake/laravel-reset-transaction dev-master

먼저 ResetProductController.php 컨트롤을 생성하세요 Converter를 사용하여 ResetProductModel.php 모델을 생성하고 두 개의 데이터베이스 테이블, Reset_transaction 및 Reset_product를 생성합니다. 이러한 모든 작업은 다음 명령을 실행하여 완료해야 합니다

php artisan resetTransact:create-examples

phpunit.xml 테스트 스위트 트랜잭션 추가

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

마지막으로 테스트 명령 ./vendor/bin/phpunit --testsuite=Transaction
실행 결과 아래와 같이 5개의 예제가 테스트를 통과했습니다. ./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();
    }}

기능적 특징

  • 즉시 사용되므로 mysql 트랜잭션 작성과 일치하여 원본 프로젝트의 코드를 재구성할 필요가 없습니다. 간단하고 쉬운 사용. 🎜
  • 🎜http 프로토콜의 서비스 인터페이스를 지원합니다. 다른 프로토콜을 지원하려면 미들웨어를 다시 작성해야 합니다. 🎜
  • 🎜읽기 커밋, 반복 읽기를 지원하며 mysql의 트랜잭션 격리 수준과 동기화됩니다. 🎜
🎜🎜🎜원리 분석🎜🎜영화 '엣지 오브 투모로우'를 보신 분들이라면 아카이빙과 로딩 동작을 아실 겁니다. 이 분산 트랜잭션 구성 요소는 영화 "Edge of Tomorrow"의 원리를 모방합니다. 기본 서비스를 요청할 때마다 처음에 파일을 읽은 다음 마지막에는 모든 작업을 롤백하고 후속 작업을 계속합니다. 아카이브되고 마지막으로 커밋이 성공적으로 실행됩니다. 전체 프로세스는 먼저 준비하고 마지막으로 커밋하는 2단계 커밋 프로토콜을 따릅니다. 🎜🎜🎜🎜사용방법🎜🎜vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php 파일을 예로 들어🎜rrreee🎜개인 메모🎜🎜라라벨 래피드를 작성했습니다 이전 서비스 패키지는 데이터 일관성 문제를 해결하지 못했습니다. XA를 사용해 보았는데, XA는 단일 머신에 있는 여러 데이터베이스의 문제만 해결할 수 있고, 여러 머신을 서비스하는 문제는 해결할 수 없습니다. 그러다가 tcc와 Seata를 공부하려고 했는데, 읽고 나서 혼란스럽고 헤매었습니다. 막다른 골목에 이르게 되자 나만의 분산 트랜잭션 솔루션을 만들 수밖에 없었습니다. 오랫동안 나는 MySQL만으로는 분산 트랜잭션 문제를 해결할 수 없다고 항상 생각했습니다. 이제 마침내 방법이 있다는 것을 이해하게 되었습니다. 🎜

위 내용은 Laravel 고급 학습: 재설정을 기반으로 분산 트랜잭션 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제