What is TCC? TCC is the abbreviation of Try, Confirm, and Cancel. It was first proposed by Pat Helland in a paper titled "Life beyond Distributed Transactions: an Apostate's Opinion" published in 2007. .
TCC is divided into 3 phases
In TCC distributed transactions, there are three roles, which are the same as classic XA distributed transactions:
If we want to conduct a business similar to inter-bank transfers, the transfer out (TransOut) and the transfer in (TransIn) are in different microservices, and a successfully completed The typical sequence diagram of a TCC transaction is as follows:
$vega->handleFunc('/api/TransOutTry', function (Mix\Vega\Context $ctx) { var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\Vega\Context $ctx) { var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) { var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\Vega\Context $ctx) { var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');
Dtmcli\tccGlobalTransaction($dtm, function ($tcc) use ($svc) { /** @var Dtmcli\Tcc $tcc */ $req = ['amount' => 30]; $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel'); $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel'); });
# 部署启动dtm# 需要docker版本18以上git clone https://github.com/yedf/dtmcd dtm docker-compose up# 另起一个命令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-sample composer installphp demo.php start
$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) { var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'FAILURE']);})->methods('POST');
The Seven Most Classic Solutions for Distributed Transactions"
The examples used in this article are excerpted from yedf /dtm (https://github.com/yedf/dtm), which supports multiple transaction modes: TCC, SAGA, XA, cross-language support for transaction messages, and has supported customers in golang, python, Java, Teach you step by step how to use Teach you step by step how to use PHP to complete a distributed transaction TCC to complete a distributed transaction TCC, nodejs and other languages. terminal, refer to each language SDK (https://dtm.pub/summary/code.html#go). Provides sub-transaction barrier function to elegantly solve problems such as idempotence, suspension, and null compensation. After reading this article, you are welcome to visit the github.com/yedf/dtm project and give a star to support it!The above is the detailed content of Teach you step by step how to use PHP to complete a distributed transaction TCC. For more information, please follow other related articles on the PHP Chinese website!