다음 튜토리얼 칼럼인 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 = '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(); }}기능적 특징
vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php
파일을 예로 들어🎜rrreee🎜개인 메모🎜🎜라라벨 래피드를 작성했습니다 이전 서비스 패키지는 데이터 일관성 문제를 해결하지 못했습니다. XA를 사용해 보았는데, XA는 단일 머신에 있는 여러 데이터베이스의 문제만 해결할 수 있고, 여러 머신을 서비스하는 문제는 해결할 수 없습니다. 그러다가 tcc와 Seata를 공부하려고 했는데, 읽고 나서 혼란스럽고 헤매었습니다. 막다른 골목에 이르게 되자 나만의 분산 트랜잭션 솔루션을 만들 수밖에 없었습니다. 오랫동안 나는 MySQL만으로는 분산 트랜잭션 문제를 해결할 수 없다고 항상 생각했습니다. 이제 마침내 방법이 있다는 것을 이해하게 되었습니다. 🎜위 내용은 Laravel 고급 학습: 재설정을 기반으로 분산 트랜잭션 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!