1. Go to this page and download the library: Download weaving/php-dtm 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/ */
weaving / php-dtm example snippets
use DtmClient\Constants\Protocol;
use DtmClient\Constants\DbType;
return [
// The communication protocol between the client and the DTM Server, supports Protocol::HTTP and Protocol::GRPC
'protocol' => Protocol::HTTP,
// DTM Server address
'server' => '127.0.0.1',
// DTM Server port
'port' => [
'http' => 36789,
'grpc' => 36790,
],
// Sub-transaction barrier
'barrier' => [
// Subtransaction barrier configuration in DB mode
'db' => [
'type' => DbType::MySQL
],
// Subtransaction barrier configuration in Redis mode
'redis' => [
// Timeout for subtransaction barrier records
'expire_seconds' => 7 * 86400,
],
// Classes that apply sub-transaction barriers in non-Hyperf frameworks or without annotation usage
'apply' => [],
],
// Options of Guzzle client under HTTP protocol
'guzzle' => [
'options' => [],
],
];
namespace App\Controller;
use DtmClient\TCC;
use DtmClient\TransContext;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Throwable;
#[Controller(prefix: '/tcc')]
class TccController
{
protected string $serviceUri = 'http://127.0.0.1:9501';
#[Inject]
protected TCC $tcc;
#[GetMapping(path: 'successCase')]
public function successCase()
{
try {
$this->tcc->globalTransaction(function (TCC $tcc) {
// Create call data for subtransaction A
$tcc->callBranch(
// Arguments for calling the Try method
['amount' => 30],
// URL of Try stage
$this->serviceUri . '/tcc/transA/try',
// URL of Confirm stage
$this->serviceUri . '/tcc/transA/confirm',
// URL of Cancel stage
$this->serviceUri . '/tcc/transA/cancel'
);
// Create call data for subtransaction B, and so on
$tcc->callBranch(
['amount' => 30],
$this->serviceUri . '/tcc/transB/try',
$this->serviceUri . '/tcc/transB/confirm',
$this->serviceUri . '/tcc/transB/cancel'
);
});
} catch (Throwable $e) {
var_dump($e->getMessage(), $e->getTraceAsString());
}
// Get the global transaction ID through TransContext::getGid() and return it to the client
return TransContext::getGid();
}
}
namespace App\Controller;
use DtmClient\Saga;
use DtmClient\TransContext;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
#[Controller(prefix: '/saga')]
class SagaController
{
protected string $serviceUri = 'http://127.0.0.1:9501';
#[Inject]
protected Saga $saga;
#[GetMapping(path: 'successCase')]
public function successCase(): string
{
$payload = ['amount' => 50];
// Init Saga global transaction
$this->saga->init();
// Add TransOut sub-transaction
$this->saga->add(
$this->serviceUri . '/saga/transOut',
$this->serviceUri . '/saga/transOutCompensate',
$payload
);
// Add TransIn sub-transaction
$this->saga->add(
$this->serviceUri . '/saga/transIn',
$this->serviceUri . '/saga/transInCompensate',
$payload
);
// Submit Saga global transaction
$this->saga->submit();
// Get the global transaction ID through TransContext::getGid() and return it to the client
return TransContext::getGid();
}
}