>  기사  >  백엔드 개발  >  PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.

PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.

藏色散人
藏色散人앞으로
2021-09-22 15:32:394108검색

TCC 구성 TCC는 3단계로 나누어진다

시도 단계: 실행 시도, 모든 사업 점검 완료(일관성), 필요한 사업 자원 확보(준격리)
  • 확정 단계: 전 지점인 경우 경우 시도가 성공하면 확인 단계로 이동합니다. 확인은 실제 업무를 실행하며 어떠한 업무 확인도 하지 않고 Try 단계에서 예약된 비즈니스 자원만 사용합니다. 취소는 시도 단계에서 예약된 비즈니스 리소스를 해제합니다.
  • TCC 분산 트랜잭션에는 클래식 XA 분산 트랜잭션과 동일한 3가지 역할이 있습니다.
글로벌 트랜잭션을 시작하고 글로벌 트랜잭션에 포함되는 트랜잭션 분기를 정의하는 AP/Application

RM/Resource Manager, 담당 지점 거래의 다양한 자원 관리를 위해
  • TM/Transaction Manager, 확인 및 취소 실행, 네트워크 예외 처리 등 글로벌 거래의 올바른 실행을 조정하는 역할
  • 은행 간 이체, 이체(TransOut) 및 이체(TransIn)는 각각 다른 마이크로서비스에 있습니다. 성공적으로 완료된 TCC 거래의 일반적인 시퀀스 다이어그램은 다음과 같습니다.

PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.TCC Practice

다음 TCC 거래를 진행하겠습니다. 구체적인 개발현재 TCC에서 사용할 수 있는 오픈 소스 프레임워크는 주로 Seata로 대표되는 Java 언어입니다. 우리의 예에서는 nodejs를 사용하고 있으며, 사용된 분산 트랜잭션 프레임워크는 분산 트랜잭션을 매우 우아하게 지원하는 dtm입니다. TCC의 구성을 자세히 설명해보자

이제 구체적인 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 롤백

은행에서 금액 이체를 준비하는 경우 사용자에게 2시쯤에 사용자 2의 계정이 비정상인 것으로 확인되어 반환에 실패하게 됩니다. TransIn이 실패를 반환하도록 하여 이 상황을 시뮬레이션할 수 있습니다
$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의 차이점은 하위 트랜잭션이 실패를 반환하면 전역 롤백이 트랜잭션을 따른다는 것입니다. , 각 하위 트랜잭션의 취소 작업을 호출하여 모든 전역 트랜잭션이 롤백되도록 합니다.

PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.TCC 거래 모드에서 많은 독자들이 '확인/취소'에 실패하면 어떻게 되나요?라고 묻습니다. 이는 TCC 거래 모델에 대해 깊이 생각하고 있다는 의미이므로 좋은 질문입니다. 첫 번째 경우는 네트워크 오류, 애플리케이션 또는 데이터베이스 가동 중지 시간과 같은 일시적인 오류입니다. 이러한 오류는 결국 성공으로 돌아갑니다. 다른 경우는 TCC 계약에 따라 리소스가 잠겨 있습니다. 즉, 프로그램 로직 측면에서 확인/취소가 비즈니스 실패를 반환하는 것을 허용하지 않는 것은 버그이므로 개발자에게 필요합니다. 버그를 수동으로 수정하려면

요약

이 글에서는 TCC에 대한 이론적 지식을 소개하고, 정상적인 성공적인 완료와 성공적인 롤백을 포함하여 TCC 트랜잭션을 작성하는 전체 과정을 예제를 통해 제공했습니다. 이 글을 통해 독자들은 TCC에 대한 깊은 이해를 가지게 되었다고 믿습니다. 분산 트랜잭션에 대한 보다 포괄적인 지식은 "

분산 트랜잭션을 위한 가장 고전적인 7가지 솔루션

"을 참조하세요.

기사에 사용된 예제는 yedf/dtm(https://github.com/yedf/ dtm), TCC, SAGA, .pub/summary/code.html#go 등 다양한 트랜잭션 모드를 지원합니다. 멱등성, 정지, 널 보상 등의 문제를 우아하게 해결하기 위한 하위 트랜잭션 장벽 기능을 제공합니다. 이 기사를 읽은 후 github.com/yedf/dtm 프로젝트를 방문하여 별표를 주시고 후원해 주세요!

위 내용은 PHP를 사용하여 분산 트랜잭션 TCC를 완료하는 방법을 단계별로 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제