Laravel進階學習之基於reset實現分散式事務

藏色散人
發布: 2021-11-10 17:11:41
轉載
1807 人瀏覽過

下面由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
登入後複製

phpunit.xml增加testsuite Transaction

  ......  ./vendor/windawake/laravel-reset-transaction/tests   ......
登入後複製

最後執行測試指令./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檔案為範例

 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(); }}
登入後複製

個人筆記

我之前寫了laravel快速服務化包,但它沒有解決資料一致性的問題。嘗試用XA,但XA只能解決單機多個資料庫,沒辦法解決多台機器服務化的問題。然後我又嘗試去研究tcc和seata,但看完後一臉懵逼,不知所措。無奈被逼上絕路,沒辦法了只能自創分散式事務解決方案。一直以來,我一直以為單單只用mysql是沒辦法解決分散式事務的問題,現在終於明白,還是有辦法滴!

以上是Laravel進階學習之基於reset實現分散式事務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!