PHP code example of vhnnnbj / laravel-rt
1. Go to this page and download the library: Download vhnnnbj/laravel-rt library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
vhnnnbj / laravel-rt example snippets
namespace Tests\Transaction;
use App\Models\ResetAccountModel;
use Tests\TestCase;
use Illuminate\Support\Facades\DB;
use App\Models\ResetOrderModel;
use App\Models\ResetStorageModel;
use GuzzleHttp\Client;
use Laravel\ResetTransaction\Facades\RT;
class ServiceTest extends TestCase
{
private $baseUri = 'http://127.0.0.1:8000';
/**
* @var \GuzzleHttp\Client
*/
private $client;
protected function setUp(): void
{
parent::setUp();
DB::setDefaultConnection('service_order'); //默认是订单服务
$this->client = new Client([
'base_uri' => $this->baseUri,
'timeout' => 60,
]);
$requestId = session_create_id();
session()->put('rt_request_id', $requestId);
}
public function testCreateOrderWithCommit()
{
$orderCount1 = ResetOrderModel::count();
$storageItem1 = ResetStorageModel::find(1);
$accountItem1 = ResetAccountModel::find(1);
// 开启RT模式分布式事务
$transactId = RT::beginTransaction();
$orderNo = rand(1000, 9999); // 随机订单号
$stockQty = 2; // 占用2个库存数量
$amount = 20.55; // 订单总金额20.55元
ResetOrderModel::create([
'order_no' => $orderNo,
'stock_qty' => $stockQty,
'amount' => $amount
]);
// 请求库存服务,减库存
$requestId = session_create_id();
$response = $this->client->put('/api/resetStorage/1', [
'json' => [
'decr_stock_qty' => $stockQty
],
'headers' => [
'rt_request_id' => $requestId,
'rt_transact_id' => $transactId,
]
]);
$resArr1 = $this->responseToArray($response);
$this->assertTrue($resArr1['result'] == 1, 'lack of stock'); //返回值是1,说明操作成功
// 请求账户服务,减金额
$requestId = session_create_id();
$response = $this->client->put('/api/resetAccount/1', [
'json' => [
'decr_amount' => $amount
],
'headers' => [
'rt_request_id' => $requestId,
'rt_transact_id' => $transactId,
]
]);
$resArr2 = $this->responseToArray($response);
$this->assertTrue($resArr2['result'] == 1, 'not enough money'); //返回值是1,说明操作成功
// 提交RT模式分布式事务
RT::commit();
$orderCount2 = ResetOrderModel::count();
$storageItem2 = ResetStorageModel::find(1);
$accountItem2 = ResetAccountModel::find(1);
$this->assertTrue(($orderCount1 + 1) == $orderCount2); //事务内创建了一个订单
$this->assertTrue(($storageItem1->stock_qty - $stockQty) == $storageItem2->stock_qty); //事务内创建订单后需要扣减库存
$this->assertTrue(($accountItem1->amount - $amount) == $accountItem2->amount); //事务内创建订单后需要扣减账户金额
}
private function responseToArray($response)
{
$contents = $response->getBody()->getContents();
return json_decode($contents, true);
}
}
shell
php artisan resetTransact:create-examples && php artisan serve --host=0.0.0.0 --port=8000
shell
php artisan serve --host=0.0.0.0 --port=8001
shell
DESKTOP:/web/linux/php/laravel/laravel62# ./vendor/bin/phpunit --testsuite=Transaction --filter=ServiceTest
Time: 219 ms, Memory: 22.00 MB
OK (3 tests, 12 assertions)