blob: ad9928a2a1e0c8e57f173f7292c4cca45a5366f1 [file] [log] [blame]
<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate hreflang=zh-cn href=https://cn.dubbo.apache.org/zh-cn/overview/tasks/ecosystem/transaction/><link rel=canonical href=https://cn.dubbo.apache.org/en/overview/tasks/ecosystem/transaction/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta http-equiv=Content-Security-Policy content="frame-src *"><meta name=generator content="Hugo 0.122.0"><link rel="shortcut icon" type=image/png href=/imgs/favicon.png><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=manifest href=/manifest.webmanifest><title>Transaction Management | Apache Dubbo</title><meta property="og:title" content="Transaction Management">
<meta property="og:description" content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><meta property="og:type" content="article"><meta property="og:url" content="https://cn.dubbo.apache.org/en/overview/tasks/ecosystem/transaction/"><meta property="article:section" content="overview"><meta property="article:modified_time" content="2023-01-02T18:18:49+08:00"><meta itemprop=name content="Transaction Management"><meta itemprop=description content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><meta itemprop=dateModified content="2023-01-02T18:18:49+08:00"><meta itemprop=wordCount content="837"><meta itemprop=keywords content><meta name=twitter:card content="summary"><meta name=twitter:title content="Transaction Management"><meta name=twitter:description content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><script async src="https://www.googletagmanager.com/gtag/js?id=G-NM6FFMT51J"></script><script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css as=style><link href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin=anonymous></script><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><meta property="og:description" content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><meta name=twitter:description content="This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency."><meta property="og:url" content="https://cn.dubbo.apache.org/en/overview/tasks/ecosystem/transaction/"><meta property="og:title" content="Transaction Management"><meta name=twitter:title content="Transaction Management"><meta name=twitter:image:alt content="Apache Dubbo"><meta property="og:type" content="article"><meta name=viewport content="width=device-width"><script async defer src=/js/github-buttons.js></script><link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/en/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class="td-navbar-nav-scroll ml-md-auto" id=main_navbar><ul class="navbar-nav mt-2 mt-lg-0"><li class="nav-item mr-4 mb-2 mb-lg-0"><a class="nav-link active" href=/en/overview/><span class=active>Overview</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/docs3-v2/><span>SDK Manual</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/blog/><span>Blog</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/download/><span>Download</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=https://start.dubbo.apache.org/bootstrap.html target=_blank><span>Initializer</span><i class='fas fa-external-link-alt'></i></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdownMenuLink role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>English</a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=navbarDropdownMenuLink><a class=dropdown-item href=/zh-cn/overview/tasks/ecosystem/transaction/>中文</a></div></li><li class="nav-item dropdown d-lg-block"><div class="nav-item d-none d-lg-block"></div></li></ul></div></nav><section class="header-hero text-white pb-0 light-text"></section></header><div class="container-fluid td-outer"><div class=td-main><div class="row flex-md-nowrap"><div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none"><script>$(function(){$("#td-section-nav a").removeClass("active"),$("#td-section-nav #m-enoverviewtasksecosystemtransaction").addClass("active"),$("#td-section-nav #m-enoverviewtasksecosystemtransaction-li span").addClass("td-sidebar-nav-active-item"),$("#td-section-nav #m-enoverviewtasksecosystemtransaction").parents("li").addClass("active-path"),$("#td-section-nav li.active-path").addClass("show"),$("#td-section-nav li.active-path").children("input").prop("checked",!0),$("#td-section-nav #m-enoverviewtasksecosystemtransaction-li").siblings("li").addClass("show"),$("#td-section-nav #m-enoverviewtasksecosystemtransaction-li").children("ul").children("li").addClass("show"),$("#td-sidebar-menu").toggleClass("d-none")})</script><div id=td-sidebar-menu class="td-sidebar__inner d-none"><div id=content-mobile><form class="td-sidebar__search d-flex align-items-center"><button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav foldable-nav" id=td-section-nav><ul class="td-sidebar-nav__section pr-md-3 ul-0"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverview-li><ul class=ul-1><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewwhat-li><input type=checkbox id=m-enoverviewwhat-check>
<label for=m-enoverviewwhat-check><a href=/en/overview/what/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewwhat><span>What is Dubbo</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewwhatoverview-li><input type=checkbox id=m-enoverviewwhatoverview-check>
<label for=m-enoverviewwhatoverview-check><a href=/en/overview/what/overview/ title="Introduction to Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewwhatoverview><span>Introduction</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewwhatdubbo3-li><input type=checkbox id=m-enoverviewwhatdubbo3-check>
<label for=m-enoverviewwhatdubbo3-check><a href=/en/overview/what/dubbo3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewwhatdubbo3><span>Dubbo 3 Quick Facts</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewwhatarchitecture-li><input type=checkbox id=m-enoverviewwhatarchitecture-check>
<label for=m-enoverviewwhatarchitecture-check><a href=/en/overview/what/architecture/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewwhatarchitecture><span>Architecture</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewwhatextensibility-li><input type=checkbox id=m-enoverviewwhatextensibility-check>
<label for=m-enoverviewwhatextensibility-check><a href=/en/overview/what/extensibility/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewwhatextensibility><span>Extensibility</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewwhatecosystem-li><input type=checkbox id=m-enoverviewwhatecosystem-check>
<label for=m-enoverviewwhatecosystem-check><a href=/en/overview/what/ecosystem/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewwhatecosystem><span>Ecosystem</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewquickstart-li><input type=checkbox id=m-enoverviewquickstart-check>
<label for=m-enoverviewquickstart-check><a href=/en/overview/quickstart/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewquickstart><span>Quick Start</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewquickstartgo-li><input type=checkbox id=m-enoverviewquickstartgo-check>
<label for=m-enoverviewquickstartgo-check><a href=/en/overview/quickstart/go/ title="Quick Start With Golang" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewquickstartgo><span>Quick Start</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewquickstartrust-li><input type=checkbox id=m-enoverviewquickstartrust-check>
<label for=m-enoverviewquickstartrust-check><a href=/en/overview/quickstart/rust/ title="Quick Start With Rust" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewquickstartrust><span>Quick Start</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtasks-li><input type=checkbox id=m-enoverviewtasks-check>
<label for=m-enoverviewtasks-check><a href=/en/overview/tasks/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtasks><span>Tasks</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtaskstraffic-management-li><input type=checkbox id=m-enoverviewtaskstraffic-management-check>
<label for=m-enoverviewtaskstraffic-management-check><a href=/en/overview/tasks/traffic-management/ title="Traffic Management" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtaskstraffic-management><span>Traffic Governance</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementweight-li><input type=checkbox id=m-enoverviewtaskstraffic-managementweight-check>
<label for=m-enoverviewtaskstraffic-managementweight-check><a href=/en/overview/tasks/traffic-management/weight/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementweight><span>Adjust traffic distribution by weight</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementtimeout-li><input type=checkbox id=m-enoverviewtaskstraffic-managementtimeout-check>
<label for=m-enoverviewtaskstraffic-managementtimeout-check><a href=/en/overview/tasks/traffic-management/timeout/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementtimeout><span>Dynamic adjustment of service timeout</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementtraffic-routing-li><input type=checkbox id=m-enoverviewtaskstraffic-managementtraffic-routing-check>
<label for=m-enoverviewtaskstraffic-managementtraffic-routing-check><a href=/en/overview/tasks/traffic-management/traffic-routing/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementtraffic-routing><span>Request Routing</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementzone-li><input type=checkbox id=m-enoverviewtaskstraffic-managementzone-check>
<label for=m-enoverviewtaskstraffic-managementzone-check><a href=/en/overview/tasks/traffic-management/zone/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementzone><span>Same computer room/area priority</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementisolation-li><input type=checkbox id=m-enoverviewtaskstraffic-managementisolation-check>
<label for=m-enoverviewtaskstraffic-managementisolation-check><a href=/en/overview/tasks/traffic-management/isolation/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementisolation><span>Temporarily kick out the problem service instance</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementtraffic-gray-li><input type=checkbox id=m-enoverviewtaskstraffic-managementtraffic-gray-check>
<label for=m-enoverviewtaskstraffic-managementtraffic-gray-check><a href=/en/overview/tasks/traffic-management/traffic-gray/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementtraffic-gray><span>Traffic Grayscale</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstraffic-managementtraffic-condition-li><input type=checkbox id=m-enoverviewtaskstraffic-managementtraffic-condition-check>
<label for=m-enoverviewtaskstraffic-managementtraffic-condition-check><a href=/en/overview/tasks/traffic-management/traffic-condition/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstraffic-managementtraffic-condition><span>Traffic Isolation</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtaskskubernetes-li><input type=checkbox id=m-enoverviewtaskskubernetes-check>
<label for=m-enoverviewtaskskubernetes-check><a href=/en/overview/tasks/kubernetes/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtaskskubernetes><span>Kubernetes Deployment Solution</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskskubernetesdeploy-on-k8s-li><input type=checkbox id=m-enoverviewtaskskubernetesdeploy-on-k8s-check>
<label for=m-enoverviewtaskskubernetesdeploy-on-k8s-check><a href=/en/overview/tasks/kubernetes/deploy-on-k8s/ title="Deploying to Kubernetes" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskskubernetesdeploy-on-k8s><span>Native K8S Service based on API-SERVER</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtasksmesh-li><input type=checkbox id=m-enoverviewtasksmesh-check>
<label for=m-enoverviewtasksmesh-check><a href=/en/overview/tasks/mesh/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtasksmesh><span>Mesh Deployment Solution</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksmeshdubbo-mesh-li><input type=checkbox id=m-enoverviewtasksmeshdubbo-mesh-check>
<label for=m-enoverviewtasksmeshdubbo-mesh-check><a href=/en/overview/tasks/mesh/dubbo-mesh/ title="Dubbo proxy mesh using Envoy & Istio" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksmeshdubbo-mesh><span>Sidecar mode</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksmeshproxyless-li><input type=checkbox id=m-enoverviewtasksmeshproxyless-check>
<label for=m-enoverviewtasksmeshproxyless-check><a href=/en/overview/tasks/mesh/proxyless/ title="Istio + Proxyless" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksmeshproxyless><span>Proxyless mode</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtaskstriple-li><input type=checkbox id=m-enoverviewtaskstriple-check>
<label for=m-enoverviewtaskstriple-check><a href=/en/overview/tasks/triple/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtaskstriple><span>Triple Usage Example</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstripleidl-li><input type=checkbox id=m-enoverviewtaskstripleidl-check>
<label for=m-enoverviewtaskstripleidl-check><a href=/en/overview/tasks/triple/idl/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstripleidl><span>Using IDL + Protobuf to define services across languages</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstriplewrap-li><input type=checkbox id=m-enoverviewtaskstriplewrap-check>
<label for=m-enoverviewtaskstriplewrap-check><a href=/en/overview/tasks/triple/wrap/ title="Pojo Serialization Compatibility Mode" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstriplewrap><span>Pojo serialization compatibility mode</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtaskstriplestreaming-li><input type=checkbox id=m-enoverviewtaskstriplestreaming-check>
<label for=m-enoverviewtaskstriplestreaming-check><a href=/en/overview/tasks/triple/streaming/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtaskstriplestreaming><span>Streaming communication mode</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtasksmigration-li><input type=checkbox id=m-enoverviewtasksmigration-check>
<label for=m-enoverviewtasksmigration-check><a href=/en/overview/tasks/migration/ title="How to smoothly migrate to the new functions of Dubbo3" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtasksmigration><span>Migrate to Dubbo3</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksmigration2to3-li><input type=checkbox id=m-enoverviewtasksmigration2to3-check>
<label for=m-enoverviewtasksmigration2to3-check><a href=/en/overview/tasks/migration/2to3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksmigration2to3><span>Upgrade to Dubbo3</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksmigrationmigration-triple-li><input type=checkbox id=m-enoverviewtasksmigrationmigration-triple-check>
<label for=m-enoverviewtasksmigrationmigration-triple-check><a href=/en/overview/tasks/migration/migration-triple/ title="Guide to Migrating Dubbo Protocol to Triple Protocol" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksmigrationmigration-triple><span>Triple Protocol</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksmigrationservice-discovery-samples-li><input type=checkbox id=m-enoverviewtasksmigrationservice-discovery-samples-check>
<label for=m-enoverviewtasksmigrationservice-discovery-samples-check><a href=/en/overview/tasks/migration/service-discovery-samples/ title="Dubbo3 application-level service discovery" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksmigrationservice-discovery-samples><span>Application-Level Service Discovery</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtasksecosystem-li><input type=checkbox id=m-enoverviewtasksecosystem-check>
<label for=m-enoverviewtasksecosystem-check><a href=/en/overview/tasks/ecosystem/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtasksecosystem><span>Microservice Governance</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksecosystemtransaction-li><input type=checkbox id=m-enoverviewtasksecosystemtransaction-check>
<label for=m-enoverviewtasksecosystemtransaction-check><a href=/en/overview/tasks/ecosystem/transaction/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksecosystemtransaction><span>Transaction Management</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksecosystemrate-limit-li><input type=checkbox id=m-enoverviewtasksecosystemrate-limit-check>
<label for=m-enoverviewtasksecosystemrate-limit-check><a href=/en/overview/tasks/ecosystem/rate-limit/ title="Current Limit Downgrade" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksecosystemrate-limit><span>Current limit downgrade</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewtasksextensibility-li><input type=checkbox id=m-enoverviewtasksextensibility-check>
<label for=m-enoverviewtasksextensibility-check><a href=/en/overview/tasks/extensibility/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewtasksextensibility><span>Custom Extensions</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksextensibilityprotocol-li><input type=checkbox id=m-enoverviewtasksextensibilityprotocol-check>
<label for=m-enoverviewtasksextensibilityprotocol-check><a href=/en/overview/tasks/extensibility/protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksextensibilityprotocol><span>Protocol</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksextensibilityregistry-li><input type=checkbox id=m-enoverviewtasksextensibilityregistry-check>
<label for=m-enoverviewtasksextensibilityregistry-check><a href=/en/overview/tasks/extensibility/registry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksextensibilityregistry><span>Registry</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksextensibilityrouter-li><input type=checkbox id=m-enoverviewtasksextensibilityrouter-check>
<label for=m-enoverviewtasksextensibilityrouter-check><a href=/en/overview/tasks/extensibility/router/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksextensibilityrouter><span>Router</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewtasksextensibilityfilter-li><input type=checkbox id=m-enoverviewtasksextensibilityfilter-check>
<label for=m-enoverviewtasksextensibilityfilter-check><a href=/en/overview/tasks/extensibility/filter/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewtasksextensibilityfilter><span>Custom extension</span></a></label></li></ul></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewmannual-li><input type=checkbox id=m-enoverviewmannual-check>
<label for=m-enoverviewmannual-check><a href=/en/overview/mannual/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewmannual><span>SDK Manual</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewmannualjava-li><input type=checkbox id=m-enoverviewmannualjava-check>
<label for=m-enoverviewmannualjava-check><a href=/en/docs3-v2/java-sdk/ title="Java SDK" target=_blank rel=noopener class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewmannualjava><span>Java</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewmannualgolang-li><input type=checkbox id=m-enoverviewmannualgolang-check>
<label for=m-enoverviewmannualgolang-check><a href=/en/docs3-v2/golang-sdk/ title="Golang SDK" target=_blank rel=noopener class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewmannualgolang><span>Golang</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewmannualrust-li><input type=checkbox id=m-enoverviewmannualrust-check>
<label for=m-enoverviewmannualrust-check><a href=/en/docs3-v2/rust-sdk/ title="Rust SDK" target=_blank rel=noopener class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewmannualrust><span>Rust</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewcore-features-li><input type=checkbox id=m-enoverviewcore-features-check>
<label for=m-enoverviewcore-features-check><a href=/en/overview/core-features/ title="Core Features" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewcore-features><span>Features</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresservice-definition-li><input type=checkbox id=m-enoverviewcore-featuresservice-definition-check>
<label for=m-enoverviewcore-featuresservice-definition-check><a href=/en/overview/core-features/service-definition/ title="Develop microservice with Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresservice-definition><span>Microservice develop</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresservice-mesh-li><input type=checkbox id=m-enoverviewcore-featuresservice-mesh-check>
<label for=m-enoverviewcore-featuresservice-mesh-check><a href=/en/overview/core-features/service-mesh/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresservice-mesh><span>Service Mesh</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresservice-discovery-li><input type=checkbox id=m-enoverviewcore-featuresservice-discovery-check>
<label for=m-enoverviewcore-featuresservice-discovery-check><a href=/en/overview/core-features/service-discovery/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresservice-discovery><span>Service Discovery</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresmore-li><input type=checkbox id=m-enoverviewcore-featuresmore-check>
<label for=m-enoverviewcore-featuresmore-check><a href=/en/overview/core-features/more/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresmore><span>More Advanced Features</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresload-balance-li><input type=checkbox id=m-enoverviewcore-featuresload-balance-check>
<label for=m-enoverviewcore-featuresload-balance-check><a href=/en/overview/core-features/load-balance/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresload-balance><span>Load Balancing</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewcore-featurestraffic-li><input type=checkbox id=m-enoverviewcore-featurestraffic-check>
<label for=m-enoverviewcore-featurestraffic-check><a href=/en/overview/core-features/traffic/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewcore-featurestraffic><span>流量管控</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featurestrafficcondition-rule-li><input type=checkbox id=m-enoverviewcore-featurestrafficcondition-rule-check>
<label for=m-enoverviewcore-featurestrafficcondition-rule-check><a href=/en/overview/core-features/traffic/condition-rule/ title="Conditional Routing Rules" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featurestrafficcondition-rule><span>Conditional Routing</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featurestraffictag-rule-li><input type=checkbox id=m-enoverviewcore-featurestraffictag-rule-check>
<label for=m-enoverviewcore-featurestraffictag-rule-check><a href=/en/overview/core-features/traffic/tag-rule/ title=标签路由规则 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featurestraffictag-rule><span>标签路由</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featurestrafficscript-rule-li><input type=checkbox id=m-enoverviewcore-featurestrafficscript-rule-check>
<label for=m-enoverviewcore-featurestrafficscript-rule-check><a href=/en/overview/core-features/traffic/script-rule/ title=脚本路由规则 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featurestrafficscript-rule><span>脚本路由</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featurestrafficconfiguration-rule-li><input type=checkbox id=m-enoverviewcore-featurestrafficconfiguration-rule-check>
<label for=m-enoverviewcore-featurestrafficconfiguration-rule-check><a href=/en/overview/core-features/traffic/configuration-rule/ title=动态配置规则 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featurestrafficconfiguration-rule><span>动态配置</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featurestrafficmesh-rule-li><input type=checkbox id=m-enoverviewcore-featurestrafficmesh-rule-check>
<label for=m-enoverviewcore-featurestrafficmesh-rule-check><a href=/en/overview/core-features/traffic/mesh-rule/ title=基于服务网格的路由规则 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featurestrafficmesh-rule><span>服务网格</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresprotocols-li><input type=checkbox id=m-enoverviewcore-featuresprotocols-check>
<label for=m-enoverviewcore-featuresprotocols-check><a href=/en/overview/core-features/protocols/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresprotocols><span>Protocols</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresextensibility-li><input type=checkbox id=m-enoverviewcore-featuresextensibility-check>
<label for=m-enoverviewcore-featuresextensibility-check><a href=/en/overview/core-features/extensibility/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresextensibility><span>Extensibility Adaptation</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresobservability-li><input type=checkbox id=m-enoverviewcore-featuresobservability-check>
<label for=m-enoverviewcore-featuresobservability-check><a href=/en/overview/core-features/observability/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresobservability><span>Observability</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuressecurity-li><input type=checkbox id=m-enoverviewcore-featuressecurity-check>
<label for=m-enoverviewcore-featuressecurity-check><a href=/en/overview/core-features/security/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuressecurity><span>Authentication</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewcore-featuresecosystem-li><input type=checkbox id=m-enoverviewcore-featuresecosystem-check>
<label for=m-enoverviewcore-featuresecosystem-check><a href=/en/overview/core-features/ecosystem/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewcore-featuresecosystem><span>Microservices Ecosystem</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enoverviewnotices-li><input type=checkbox id=m-enoverviewnotices-check>
<label for=m-enoverviewnotices-check><a href=/en/overview/notices/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enoverviewnotices><span>Security Notice</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesserialization-li><input type=checkbox id=m-enoverviewnoticesserialization-check>
<label for=m-enoverviewnoticesserialization-check><a href=/en/overview/notices/serialization/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesserialization><span>Serialization Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesprotocol-li><input type=checkbox id=m-enoverviewnoticesprotocol-check>
<label for=m-enoverviewnoticesprotocol-check><a href=/en/overview/notices/protocol/ title="RPC Protocol Security" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesprotocol><span>RPC protocol security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesregistry-li><input type=checkbox id=m-enoverviewnoticesregistry-check>
<label for=m-enoverviewnoticesregistry-check><a href=/en/overview/notices/registry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesregistry><span>Registration Center Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesadmin-li><input type=checkbox id=m-enoverviewnoticesadmin-check>
<label for=m-enoverviewnoticesadmin-check><a href=/en/overview/notices/admin/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesadmin><span>Dubbo Admin Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticeslog4j-li><input type=checkbox id=m-enoverviewnoticeslog4j-check>
<label for=m-enoverviewnoticeslog4j-check><a href=/en/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticeslog4j><span>Log4j vulnerability impact</span></a></label></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/overview/>Overview</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/overview/tasks/>Tasks</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/overview/tasks/ecosystem/>Microservice Governance</a></li><li class="breadcrumb-item active" aria-current=page><a href=https://cn.dubbo.apache.org/en/overview/tasks/ecosystem/transaction/ aria-disabled=true class="btn-link disabled">Transaction Management</a></li></ol></nav><div class=td-content><h1>Transaction Management</h1><div class=lead>This example demonstrates how to implement transaction management of distributed Dubbo services through Seata to ensure data consistency.</div><header class=article-meta></header><h2 id=what-is-seata>What is Seata</h2><p>Seata is an open source distributed transaction solution dedicated to providing high-performance and easy-to-use distributed transaction services. Seata will provide users with AT, TCC, SAGA and XA transaction modes to create a one-stop distributed solution for users.</p><h2 id=1-example-architecture-description>1. Example architecture description</h2><p>The user purchases commodity business, and the whole business includes 3 microservices:</p><ul><li>Inventory service: deduction of the inventory quantity of a given item.</li><li>Order service: Generate orders based on purchase requests.</li><li>Account Services: deduction of the user account amount.</li></ul><p><img src=/imgs/docs3-v2/java-sdk/seata/transaction-1.png alt=image.png></p><h3 id=storageservice>StorageService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>StorageService</span> {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Deducted storage quantity
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>deduct</span>(String commodityCode, <span style=color:#dc322f>int</span> count);
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=orderservice>OrderService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>OrderService</span> {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Create Order
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> Order <span style=color:#268bd2>create</span>(String userId, String commodityCode, <span style=color:#dc322f>int</span> orderCount);
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=accountservice>AccountService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>AccountService</span> {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Borrow from user account
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>debit</span>(String userId, <span style=color:#dc322f>int</span> money);
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=two-the-main-business-logic>Two, the main business logic</h2><h3 id=businessservice>BusinessService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>BusinessServiceImpl</span> <span style=color:#268bd2>implements</span> BusinessService {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> StorageService storageService;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> OrderService orderService;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Purchasing
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>purchase</span>(String userId, String commodityCode, <span style=color:#dc322f>int</span> orderCount) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// Deduct storage amount</span>
</span></span><span style=display:flex><span> storageService.deduct(commodityCode, orderCount);
</span></span><span style=display:flex><span> <span style=color:#586e75>// Create Order</span>
</span></span><span style=display:flex><span> orderService.create(userId, commodityCode, orderCount);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=storageservice-1>StorageService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>StorageServiceImpl</span> <span style=color:#268bd2>implements</span> StorageService {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> JdbcTemplate jdbcTemplate;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>deduct</span>(String commodityCode, <span style=color:#dc322f>int</span> count) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// Modify the database: deduct the amount of storage</span>
</span></span><span style=display:flex><span> jdbcTemplate.update(<span style=color:#2aa198>&#34;update storage_tbl set count = count - ? where commodity_code = ?&#34;</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>new</span> Object<span style=color:#719e07>[]</span>{count, commodityCode});
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=orderservice-1>OrderService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>OrderServiceImpl</span> <span style=color:#268bd2>implements</span> OrderService {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> AccountService accountService;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> JdbcTemplate jdbcTemplate;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> Order <span style=color:#268bd2>create</span>(String userId, String commodityCode, <span style=color:#dc322f>int</span> orderCount) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// calculate the amount</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>int</span> orderMoney <span style=color:#719e07>=</span> calculate(commodityCode, orderCount);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// The amount deducted from the user account</span>
</span></span><span style=display:flex><span> accountService.debit(userId, orderMoney);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// Modify the database: create a new order</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> Order order <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Order();
</span></span><span style=display:flex><span> order.userId <span style=color:#719e07>=</span> userId;
</span></span><span style=display:flex><span> order.commodityCode <span style=color:#719e07>=</span> commodityCode;
</span></span><span style=display:flex><span> order.count <span style=color:#719e07>=</span> orderCount;
</span></span><span style=display:flex><span> order.money <span style=color:#719e07>=</span> orderMoney;
</span></span><span style=display:flex><span> KeyHolder keyHolder <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> GeneratedKeyHolder();
</span></span><span style=display:flex><span> jdbcTemplate. <span style=color:#268bd2>update</span>(con <span style=color:#719e07>-&gt;</span> {
</span></span><span style=display:flex><span> PreparedStatement pst <span style=color:#719e07>=</span> con. <span style=color:#268bd2>prepareStatement</span>(
</span></span><span style=display:flex><span> <span style=color:#2aa198>&#34;insert into order_tbl (user_id, commodity_code, count, money) values (?, ?, ?, ?)&#34;</span>,
</span></span><span style=display:flex><span> PreparedStatement. RETURN_GENERATED_KEYS);
</span></span><span style=display:flex><span> pst.setObject(1, order.userId);
</span></span><span style=display:flex><span> pst.setObject(2, order.commodityCode);
</span></span><span style=display:flex><span> pst.setObject(3, order.count);
</span></span><span style=display:flex><span> pst.setObject(4, order.money);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> pst;
</span></span><span style=display:flex><span> }, keyHolder);
</span></span><span style=display:flex><span> order.id <span style=color:#719e07>=</span> keyHolder.getKey().longValue();
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> order;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=accountservice-1>AccountService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AccountServiceImpl</span> <span style=color:#268bd2>implements</span> AccountService {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> JdbcTemplate jdbcTemplate;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>debit</span>(String userId, <span style=color:#dc322f>int</span> money) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// Modify the database: deduct the amount from the user account</span>
</span></span><span style=display:flex><span> jdbcTemplate.update(<span style=color:#2aa198>&#34;update account_tbl set money = money - ? where user_id = ?&#34;</span>, <span style=color:#719e07>new</span> Object<span style=color:#719e07>[]</span>{money, userId});
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=3-quick-start-example>3. Quick start example</h2><h3 id=step-1-download-the-source-code>Step 1: Download the source code</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span>git clone -b master https://github.com/apache/dubbo-samples.git
</span></span><span style=display:flex><span><span style=color:#b58900>cd</span> ./dubbo-samples-transaction/
</span></span></code></pre></div><h3 id=step-2-start-seata-server-and-mysql-through-docker-compose>Step 2: Start Seata-Server and MySQL through docker-compose</h3><p>In this example, we use docker-compose to quickly pull up services like seata-server and mysql.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span><span style=color:#b58900>cd</span> src/main/resources/docker
</span></span><span style=display:flex><span>docker-compose up
</span></span></code></pre></div><h3 id=step-3-build-use-cases>Step 3: Build use cases</h3><p>Execute the maven command to package the demo project</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>mvn clean package
</span></span></code></pre></div><h3 id=step-4-start-accountservice>Step 4: Start AccountService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>java <span style=color:#719e07>-</span>classpath .<span style=color:#719e07>/</span>target<span style=color:#719e07>/</span>dubbo<span style=color:#719e07>-</span>samples<span style=color:#719e07>-</span>transaction<span style=color:#719e07>-</span>1.0<span style=color:#719e07>-</span>SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboAccountServiceStarter
</span></span></code></pre></div><h3 id=step-5-start-orderservice>Step 5: Start OrderService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>java <span style=color:#719e07>-</span>classpath .<span style=color:#719e07>/</span>target<span style=color:#719e07>/</span>dubbo<span style=color:#719e07>-</span>samples<span style=color:#719e07>-</span>transaction<span style=color:#719e07>-</span>1.0<span style=color:#719e07>-</span>SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboOrderServiceStarter
</span></span></code></pre></div><h3 id=step-6-start-storageservice>Step 6: Start StorageService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>java <span style=color:#719e07>-</span>classpath .<span style=color:#719e07>/</span>target<span style=color:#719e07>/</span>dubbo<span style=color:#719e07>-</span>samples<span style=color:#719e07>-</span>transaction<span style=color:#719e07>-</span>1.0<span style=color:#719e07>-</span>SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboStorageServiceStarter
</span></span></code></pre></div><h3 id=step-7-start-businessservice>Step 7: Start BusinessService</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>java <span style=color:#719e07>-</span>classpath .<span style=color:#719e07>/</span>target<span style=color:#719e07>/</span>dubbo<span style=color:#719e07>-</span>samples<span style=color:#719e07>-</span>transaction<span style=color:#719e07>-</span>1.0<span style=color:#719e07>-</span>SNAPSHOT.jar org.apache.dubbo.samples.starter.DubboBusinessTester
</span></span></code></pre></div><h2 id=4-example-core-process>4. Example core process</h2><p><img src=/imgs/docs3-v2/java-sdk/seata/transaction-2.png alt=image.png></p><h3 id=step-1-modify-the-business-code>Step 1: Modify the business code</h3><p>Here only one line of annotation <code>@GlobalTransactional</code> is required to be written on the method of the business initiator:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@GlobalTransactional</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>purchase</span>(String userId, String commodityCode, <span style=color:#dc322f>int</span> orderCount) {
</span></span><span style=display:flex><span>  …
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=step-2-install-the-database>Step 2: Install the database</h3><ul><li>Requirements: MySQL (InnoDB storage engine).</li></ul><p><strong>Tips:</strong> In fact, the 3 microservices in the example require 3 independent databases, but for convenience we use the same physical database and configure 3 logical connection strings.</p><p>Change the database url, username and password in the following xml files</p><p>dubbo-account-service.xml
dubbo-order-service.xml
dubbo-storage-service.xml</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=display:flex><span> <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;url&#34;</span> value=<span style=color:#2aa198>&#34;jdbc:mysql://x.x.x.x:3306/xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;username&#34;</span> value=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;password&#34;</span> value=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
</span></span></code></pre></div><h3 id=step-3-create-undo_log-table-for-seata>Step 3: Create undo_log table for Seata</h3><p><code>UNDO_LOG</code> This table is used in Seata&rsquo;s AT mode.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#586e75>-- Note that when the Seata version is upgraded to 0.3.0+, the normal index will be changed to a unique index.
</span></span></span><span style=display:flex><span><span style=color:#586e75></span><span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>undo_log<span style=color:#719e07>`</span> (
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>bigint</span>(<span style=color:#2aa198>20</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>branch_id<span style=color:#719e07>`</span> <span style=color:#b58900>bigint</span>(<span style=color:#2aa198>20</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>xid<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>100</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>context<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>128</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>rollback_info<span style=color:#719e07>`</span> longblob <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>log_status<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>log_created<span style=color:#719e07>`</span> datetime <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>log_modified<span style=color:#719e07>`</span> datetime <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>ext<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>100</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>),
</span></span><span style=display:flex><span> <span style=color:#719e07>UNIQUE</span> <span style=color:#719e07>KEY</span> <span style=color:#719e07>`</span>ux_undo_log<span style=color:#719e07>`</span> (<span style=color:#719e07>`</span>xid<span style=color:#719e07>`</span>,<span style=color:#719e07>`</span>branch_id<span style=color:#719e07>`</span>)
</span></span><span style=display:flex><span>) ENGINE<span style=color:#719e07>=</span>InnoDB AUTO_INCREMENT<span style=color:#719e07>=</span><span style=color:#2aa198>1</span> <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
</span></span></code></pre></div><h3 id=step-4-create-related-business-tables>Step 4: Create related business tables</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>storage_tbl<span style=color:#719e07>`</span>;
</span></span><span style=display:flex><span><span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>storage_tbl<span style=color:#719e07>`</span> (
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span><span style=color:#719e07>count</span><span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>),
</span></span><span style=display:flex><span> <span style=color:#719e07>UNIQUE</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span>)
</span></span><span style=display:flex><span>) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>order_tbl<span style=color:#719e07>`</span>;
</span></span><span style=display:flex><span><span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>order_tbl<span style=color:#719e07>`</span> (
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>user_id<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span><span style=color:#719e07>count</span><span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>money<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>)
</span></span><span style=display:flex><span>) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>account_tbl<span style=color:#719e07>`</span>;
</span></span><span style=display:flex><span><span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>account_tbl<span style=color:#719e07>`</span> (
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>user_id<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>`</span>money<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
</span></span><span style=display:flex><span> <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>)
</span></span><span style=display:flex><span>) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
</span></span></code></pre></div><h3 id=step-5-start-the-seata-server-service>Step 5: Start the Seata-Server service</h3><ul><li>Download the <a href=https://github.com/seata/seata/releases>server package</a>, unzip it.</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span>Usage: sh seata-server.sh<span style=color:#719e07>(</span><span style=color:#719e07>for</span> linux and mac<span style=color:#719e07>)</span> or cmd seata-server.bat<span style=color:#719e07>(</span><span style=color:#719e07>for</span> windows<span style=color:#719e07>)</span> <span style=color:#719e07>[</span>options<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span> Options:
</span></span><span style=display:flex><span> --host, -h
</span></span><span style=display:flex><span> The host to bind.
</span></span><span style=display:flex><span> Default: 0.0.0.0
</span></span><span style=display:flex><span> --port, -p
</span></span><span style=display:flex><span> The port to listen.
</span></span><span style=display:flex><span> Default: <span style=color:#2aa198>8091</span>
</span></span><span style=display:flex><span> --storeMode, -m
</span></span><span style=display:flex><span> log store mode: file, db
</span></span><span style=display:flex><span> Default: file
</span></span><span style=display:flex><span> --help
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>e.g.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>sh seata-server.sh -p <span style=color:#2aa198>8091</span> -h 127.0.0.1 -m file
</span></span></code></pre></div><div id=pre-footer><h2>Feedback</h2><p class=feedback--prompt>Was this page helpful?</p><button class="btn btn-primary mb-4 feedback--yes">Yes</button>
<button class="btn btn-primary mb-4 feedback--no">No</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled"),no.disabled=!0,no.classList.add("feedback--button__disabled")};yes.addEventListener("click",()=>{sendFeedback(1),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")}),no.addEventListener("click",()=>{sendFeedback(0),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")})</script><br><div class="text-muted mt-5 pt-3 border-top">Last modified January 2, 2023: <a href=https://github.com/apache/dubbo-website/commit/95a9f4f6c1cbb4425fe12411cd046f4463fee6b5>Enhance en docs (#1798) (95a9f4f6c1c)</a></div></div></main><div class="d-none d-xl-block col-xl-2 td-toc d-print-none"><div class="td-page-meta ml-2 pb-1 pt-2 mb-0"><a href=https://github.com/apache/dubbo-website/edit/master/content/en/overview/tasks/ecosystem/transaction.md target=_blank><i class="fa fa-edit fa-fw"></i> Edit this page</a>
<a href="https://github.com/apache/dubbo-website/new/master/content/en/overview/tasks/ecosystem/transaction.md?filename=change-me.md&amp;value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" target=_blank><i class="fa fa-edit fa-fw"></i> Create child page</a>
<a href="https://github.com/apache/dubbo-website/issues/new?title=Transaction%20Management" target=_blank><i class="fab fa-github fa-fw"></i> Create an issue</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#what-is-seata>What is Seata</a></li><li><a href=#1-example-architecture-description>1. Example architecture description</a><ul><li><a href=#storageservice>StorageService</a></li><li><a href=#orderservice>OrderService</a></li><li><a href=#accountservice>AccountService</a></li></ul></li><li><a href=#two-the-main-business-logic>Two, the main business logic</a><ul><li><a href=#businessservice>BusinessService</a></li><li><a href=#storageservice-1>StorageService</a></li><li><a href=#orderservice-1>OrderService</a></li><li><a href=#accountservice-1>AccountService</a></li></ul></li><li><a href=#3-quick-start-example>3. Quick start example</a><ul><li><a href=#step-1-download-the-source-code>Step 1: Download the source code</a></li><li><a href=#step-2-start-seata-server-and-mysql-through-docker-compose>Step 2: Start Seata-Server and MySQL through docker-compose</a></li><li><a href=#step-3-build-use-cases>Step 3: Build use cases</a></li><li><a href=#step-4-start-accountservice>Step 4: Start AccountService</a></li><li><a href=#step-5-start-orderservice>Step 5: Start OrderService</a></li><li><a href=#step-6-start-storageservice>Step 6: Start StorageService</a></li><li><a href=#step-7-start-businessservice>Step 7: Start BusinessService</a></li></ul></li><li><a href=#4-example-core-process>4. Example core process</a><ul><li><a href=#step-1-modify-the-business-code>Step 1: Modify the business code</a></li><li><a href=#step-2-install-the-database>Step 2: Install the database</a></li><li><a href=#step-3-create-undo_log-table-for-seata>Step 3: Create undo_log table for Seata</a></li><li><a href=#step-4-create-related-business-tables>Step 4: Create related business tables</a></li><li><a href=#step-5-start-the-seata-server-service>Step 5: Start the Seata-Server service</a></li></ul></li></ul></nav></div></div></div></div><footer class="bg-dark py-5 row d-print-none footer-margin-0"><div class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 text-xs-center order-sm-2"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a class=text-white target=_blank rel="noopener noreferrer" href=https://lists.apache.org/list.html?dev@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-6 col-sm-4 text-right text-xs-center order-sm-3"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title=GitHub aria-label=GitHub><a class=text-white target=_blank rel="noopener noreferrer" href=https://github.com/apache/dubbo><i class="fab fa-github"></i></a></li><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Subscribe to mailing list" aria-label="Subscribe to mailing list"><a class=text-white target=_blank rel="noopener noreferrer" href=mailto:dev-subscribe@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-12 col-sm-4 text-center py-2 order-sm-2"><small class=text-white>&copy; 2024 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation. All Rights Reserved</small></div></div></div></footer><div class="row pt-2 pb-2 footer-margin-0"><div class="container-fluid mx-sm-5"><div class=text-center id=my-footer><img alt=apache_logo src=/imgs/apache_logo.png><ul><li><a href=https://www.apache.org>Foundation</a></li><li><a href=https://www.apache.org/licenses/>License</a></li><li><a href=https://dubbo.apache.org/en/overview/notices/>Security</a></li><li><a href=https://www.apache.org/events/current-event>Events</a></li><li><a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a></li><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html>Privacy</a></li><li><a href=https://www.apache.org/foundation/thanks.html>Thanks</a></li></ul></div></div></div><script src=/js/popper.min.js integrity=sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossorigin=anonymous></script><script src=/js/bootstrap.min.js integrity=sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy crossorigin=anonymous></script><script src=/js/main.min.b075178d232d3b0039b3cb6af2fc2e9d90071820167a60f4eea3a79169975ee8.js integrity="sha256-sHUXjSMtOwA5s8tq8vwunZAHGCAWemD07qOnkWmXXug=" crossorigin=anonymous></script><script async src=https://widget.kapa.ai/kapa-widget.bundle.js data-website-id=d763c4f2-f871-400b-aeca-d986c4af73c2 data-project-name="Apache Dubbo" data-project-color=#E8442E data-button-text="Ask AI" data-search-mode-enabled=true data-modal-open-on-command-k=true data-modal-disclaimer="The AI supports multiple languages, but it may not be accessible in China due to recaptcha, a proxy is required." data-project-logo=https://pbs.twimg.com/profile_images/1011849068283191302/FJbH5vbF_400x400.jpg data-modal-example-questions="What is Apache Dubbo?,How to run Apache Dubbo?" data-button-position-top data-button-position-right=20px data-button-position-bottom=200px data-button-position-left></script><script>(function(e,t,n,s){e[s]=e[s]||[];var a=t.getElementsByTagName(n)[0],i=t.createElement(n);i.async=!0,i.id="beacon-aplus",i.setAttribute("exparams","userid=&aplus&sidx=aplusSidex&ckx=aplusCkx"),i.src="//g.alicdn.com/alilog/mlog/aplus_v2.js",i.crossorigin="anonymous",a.parentNode.insertBefore(i,a)})(window,document,"script","aplus_queue"),function(e){var t=e.createElement("script");t.type="text/javascript",t.async=!0,t.src="//g.alicdn.com/aes/??tracker/3.3.4/index.js,tracker-plugin-pv/3.0.5/index.js,tracker-plugin-event/3.0.0/index.js,tracker-plugin-autolog/3.0.3/index.js,tracker-plugin-survey/3.0.3/index.js,tracker-plugin-jserror/3.0.3/index.js,tracker-plugin-resourceError/3.0.3/index.js",t.onload=function(){window.AES_CONFIG=window.AES_CONFIG||{env:"prod"},window.aes=new AES({pid:"zN245h",user_type:6}),window.AESPluginAutologConfig={exposure:"auto"},window.AEMPluginInstances=[aes.use(AESPluginPV,window.AESPluginPVConfig||{enableHistory:!0}),aes.use(AESPluginEvent,window.AESPluginEventConfig||{}),aes.use(AESPluginSurvey,window.AESPluginEventConfig||{}),aes.use(AESPluginAutolog,window.AESPluginAutologConfig||{}),aes.use(AESPluginJSError,window.AESPluginJSError||{}),aes.use(AESPluginResourceError,window.AESPluginResourceError||{})]},setTimeout(function(){e.getElementsByTagName("body")[0].appendChild(t)},800)}(document)</script></body></html>