Heim> PHP-Framework> Laravel> Hauptteil

Laravel进阶学习之基于reset实现分布式事务

藏色散人
Freigeben: 2021-11-10 17:11:41
nach vorne
1798 Leute haben es durchsucht

下面由Laravel教程栏目带大家推荐介绍关于LLaravel怎么基于reset机制实现分布式事务,希望对大家有所帮助!

快速预览

安装laravel5.5 - laravel8之间的版本,然后安装快速服务化的package

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

首先创建ResetProductController.php控制器,创建ResetProductModel.php模型,创建reset_transaction和reset_product两张数据库表。这些操作只需要执行下面命令全部完成

php artisan resetTransact:create-examples
Nach dem Login kopieren

phpunit.xml增加testsuite Transaction

  ......  ./vendor/windawake/laravel-reset-transaction/tests   ......
Nach dem Login kopieren

最后运行测试命令./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)
Nach dem Login kopieren

功能特性

  • 开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。

  • 支持http协议的服务化接口,想要支持其它协议则需要重写中间件。

  • 支持读已提交,可重复读,与mysql的事务隔离级别同步。

原理解析

看过《明日边缘》电影就会知道,存档和读档的操作。这个分布式事务组件仿造《明日边缘》电影的原理,每次请求基础服务一开始时读档,然后继续后面的操作,结束时所有操作全部回滚并且存档,最后commit把存档全部执行成功。整个过程是遵守两段提交协议,先prepare,最后commit。

如何使用

vendor/windawake/laravel-reset-transaction/tests/TransactionTest.php文件为例子

 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(); }}
Nach dem Login kopieren

个人笔记

我之前写了laravel快速服务化包,但是它没有解决数据一致性的问题。尝试用XA,但是XA只能解决单机多个数据库,没法解决多台机器服务化的问题。然后我又尝试去研究tcc和seata,但是看完后一脸懵逼,不知所措。无奈被逼上绝路,没办法了只能自创分布式事务解决方案。一直以来,我一直以为单单只用mysql是没法解决分布式事务的问题,现在终于明白,还是有办法滴!

Das obige ist der detaillierte Inhalt vonLaravel进阶学习之基于reset实现分布式事务. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!