TCC Practice
이제 구체적인 Try/Confirm/Cancel 처리 함수를 작성해보자
$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');
이제 각 하위 트랜잭션의 처리 함수는 OK이고, 이후 TCC 트랜잭션을 시작하고 Branch Call을 한다.
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'); });
이 시점에서 완전한 TCC 분산 트랜잭션이 완료됩니다.
성공적인 예제를 완벽하게 실행하려면 yedf/dtmcli-php-sample 예제를 참조하세요. 실행하는 것은 매우 간단합니다
# 部署启动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
TCC 롤백
$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');
TCC 거래 모드에서 많은 독자들이 '확인/취소'에 실패하면 어떻게 되나요?라고 묻습니다. 이는 TCC 거래 모델에 대해 깊이 생각하고 있다는 의미이므로 좋은 질문입니다. 첫 번째 경우는 네트워크 오류, 애플리케이션 또는 데이터베이스 가동 중지 시간과 같은 일시적인 오류입니다. 이러한 오류는 결국 성공으로 돌아갑니다. 다른 경우는 TCC 계약에 따라 리소스가 잠겨 있습니다. 즉, 프로그램 로직 측면에서 확인/취소가 비즈니스 실패를 반환하는 것을 허용하지 않는 것은 버그이므로 개발자에게 필요합니다. 버그를 수동으로 수정하려면
요약
"을 참조하세요.
기사에 사용된 예제는 yedf/dtm(https://github.com/yedf/ dtm), TCC, SAGA, .pub/summary/code.html#go 등 다양한 트랜잭션 모드를 지원합니다. 멱등성, 정지, 널 보상 등의 문제를 우아하게 해결하기 위한 하위 트랜잭션 장벽 기능을 제공합니다. 이 기사를 읽은 후 github.com/yedf/dtm 프로젝트를 방문하여 별표를 주시고 후원해 주세요!
위 내용은 PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!