{"id":108108,"date":"2026-09-21T01:11:57","date_gmt":"2026-09-20T17:11:57","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/108108.html"},"modified":"2026-09-21T01:11:57","modified_gmt":"2026-09-20T17:11:57","slug":"%e5%88%86%e5%b8%83%e5%bc%8f%e4%ba%8b%e5%8a%a1-%e5%9c%a8%e4%b8%8d%e5%8f%af%e9%9d%a0%e7%9a%84%e7%bd%91%e7%bb%9c%e4%b8%8a%ef%bc%8c%e6%8a%8a%e8%b4%a6%e7%ae%97%e5%b9%b3","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/108108.html","title":{"rendered":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73"},"content":{"rendered":"<h2>\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a&#xff0c;\u628a\u8d26\u7b97\u5e73<\/h2>\n<p>\u8fd9\u662f\u4e00\u4efd\u7ed9\u4e00\u7ebf\u5de5\u7a0b\u5e08\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u7b14\u8bb0&#xff1a;\u4e0d\u80cc\u5b9a\u4e49&#xff0c;\u4ece\u201c\u4e3a\u4ec0\u4e48\u5355\u673a\u597d\u597d\u7684&#xff0c;\u4e00\u62c6\u6210\u5fae\u670d\u52a1\u5c31\u5168\u662f\u5751\u201d\u8bb2\u8d77\u3002\u5148\u628a\u5355\u673a\u4e8b\u52a1\u7684\u8001\u5e95&#xff08;WAL\u3001\u4e24\u9636\u6bb5\u9501\u3001MVCC&#xff09;\u7ffb\u51fa\u6765&#xff0c;\u518d\u770b\u5206\u5e03\u5f0f\u628a\u4ec0\u4e48\u6253\u788e\u4e86&#xff1a;\u65f6\u949f\u4e0d\u53ef\u4fe1\u3001\u7f51\u7edc\u4f1a\u4e22\u5305\u3001\u673a\u5668\u4f1a\u5b95\u673a\u3002\u7136\u540e\u4e00\u4e2a\u4e2a\u62c6\u4e3b\u6d41\u89e3\u6cd5\u2014\u20142PC\/XA\u3001TCC\u3001Saga\u3001\u672c\u5730\u6d88\u606f\u8868\u3001Outbox&#043;CDC\u3001MQ\u4e8b\u52a1\u6d88\u606f\u3001Seata&#xff0c;\u4ee5\u53ca Spanner\u3001Percolator\u3001Calvin \u8fd9\u4e9b\u6570\u636e\u5e93\u539f\u751f\u7684\u786c\u6838\u8def\u7ebf\u3002Mermaid \u56fe\u76f4\u63a5\u6e32\u67d3\u5c31\u80fd\u770b&#xff0c;\u5efa\u8bae\u5bf9\u7167\u7740\u4ee3\u7801\u548c\u8868\u7ed3\u6784\u4e00\u8d77\u8bfb\u3002<\/p>\n<h3>1. \u75db\u4ece\u54ea\u6765&#xff1a;\u5355\u673a\u4e00\u53e5 commit&#xff0c;\u5206\u5e03\u5f0f\u4e00\u5730\u9e21\u6bdb<\/h3>\n<p>\u5355\u673a\u65f6\u4ee3&#xff0c;\u4e8b\u52a1\u662f\u6570\u636e\u5e93\u8d4f\u4f60\u7684\u3002\u4e00\u53e5 BEGIN; UPDATE account SET balance &#061; balance &#8211; 100 WHERE id &#061; A; UPDATE account SET balance &#061; balance &#043; 100 WHERE id &#061; B; COMMIT;&#xff0c;\u8981\u4e48\u5168\u6210&#xff0c;\u8981\u4e48\u5168\u4e0d\u6210\u3002\u7a0b\u5e8f\u5458\u4e0d\u7528\u64cd\u5fc3\u78c1\u76d8\u534a\u8def\u65ad\u7535\u3001\u4e24\u4e2a\u7ebf\u7a0b\u540c\u65f6\u6539\u4e00\u884c\u600e\u4e48\u529e&#xff0c;InnoDB \u90fd\u515c\u4e86\u5e95\u3002<\/p>\n<p>\u5fae\u670d\u52a1\u4e00\u628a\u628a\u5b83\u6495\u788e\u4e86\u3002\u73b0\u5728 A \u7684\u94b1\u5728 account-service \u8fde\u7684 MySQL \u91cc&#xff0c;B \u7684\u94b1\u5728\u53e6\u4e00\u4e2a\u5e93&#xff0c;\u8ba2\u5355\u5728 order-service&#xff0c;\u5e93\u5b58\u8981\u53bb\u8c03 stock-service \u7684 HTTP \u63a5\u53e3\u3002\u4f60\u5199\u4e2a\u201c\u8f6c\u8d26\u201d\u4e1a\u52a1&#xff0c;\u4ee3\u7801\u957f\u8fd9\u6837&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ \u4f2a\u4ee3\u7801&#xff0c;\u770b\u7740\u6ca1\u6bdb\u75c5&#xff0c;\u8dd1\u8d77\u6765\u5168\u662f\u96f7<\/span><br \/>\naccountService<span class=\"token punctuation\">.<\/span><span class=\"token function\">deduct<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">A<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ RPC 1&#xff1a;\u672c\u5730\u4e8b\u52a11&#xff0c;\u5df2\u63d0\u4ea4<\/span><br \/>\naccountService<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">B<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ RPC 2&#xff1a;\u7f51\u7edc\u8d85\u65f6\u4e86&#xff0c;\u5230\u5e95\u52a0\u4e0a\u6ca1&#xff1f;<\/span><br \/>\norderService<span class=\"token punctuation\">.<\/span><span class=\"token function\">createLog<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/\/ RPC 3&#xff1a;\u8fd8\u6ca1\u8c03&#xff0c;\u524d\u4e24\u6b65\u80fd\u9000\u5417&#xff1f;<\/span><\/p>\n<p>\u5355\u673a\u4e8b\u52a1\u9760\u201c\u5171\u4eab\u5185\u5b58 &#043; \u5171\u4eab\u78c1\u76d8 &#043; \u4e00\u4e2a\u9501\u7ba1\u7406\u5668\u201d\u5c31\u80fd\u8bf4\u4e86\u7b97\u3002\u5206\u5e03\u5f0f\u4e0b\u8fd9\u4e09\u6837\u5168\u6ca1\u4e86&#xff1a;<\/p>\n<ul>\n<li>\u6ca1\u6709\u5171\u4eab\u65f6\u949f&#xff1a;A \u673a\u5668\u8ba4\u4e3a 12:00:01&#xff0c;B \u673a\u5668\u53ef\u80fd\u662f 12:00:07&#xff0c;\u4f60\u62ff\u65f6\u95f4\u6233\u5b9a\u8c01\u5148\u8c01\u540e&#xff0c;\u5929\u7136\u4e0d\u51c6\u3002<\/li>\n<li>\u7f51\u7edc\u4e0d\u662f\u7535\u7ebf&#xff0c;\u662f\u6cbc\u6cfd&#xff1a;\u8d85\u65f6\u4e0d\u7b49\u4e8e\u5931\u8d25&#xff0c;\u5bf9\u65b9\u53ef\u80fd\u5df2\u7ecf\u6267\u884c\u5b8c\u4e86&#xff0c;\u53ea\u662f\u56de\u5305\u4e22\u4e86\u3002\u4f60\u91cd\u8bd5&#xff0c;\u5c31\u53ef\u80fd\u6267\u884c\u4e24\u904d\u3002<\/li>\n<li>\u6545\u969c\u662f\u5e38\u6001&#xff1a;\u534f\u8c03\u8005\u6302\u4e86\u3001\u53c2\u4e0e\u8005\u6302\u4e86\u3001\u6302\u5728\u4e00\u534a\u7684\u90fd\u6709\u3002\u5355\u673a crash \u91cd\u542f\u9760 redo log \u6062\u590d\u5c31\u884c&#xff0c;\u5206\u5e03\u5f0f crash \u5b8c\u8fd8\u8981\u95ee\u522b\u4eba\u201c\u6211\u4e0a\u6b21\u5e72\u5230\u54ea\u4e86\u201d\u3002<\/li>\n<\/ul>\n<p>\u6240\u4ee5\u5206\u5e03\u5f0f\u4e8b\u52a1\u7684\u672c\u8d28\u95ee\u9898\u5c31\u4e00\u53e5\u8bdd&#xff1a;\u4e00\u7fa4\u4e92\u4e0d\u4fe1\u4efb\u65f6\u949f\u3001\u53ea\u80fd\u9760\u4e0d\u53ef\u9760\u7f51\u7edc\u901a\u4fe1\u7684\u8282\u70b9&#xff0c;\u5982\u4f55\u5bf9\u201c\u505a\u8fd8\u662f\u4e0d\u505a\u201d\u8fbe\u6210\u4e00\u81f4&#xff0c;\u5e76\u4e14\u6545\u969c\u540e\u8fd8\u80fd\u628a\u8d26\u7b97\u5e73\u3002<\/p>\n<p>#mermaid-svg-Ouy0YjqRNDTnXIK6{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .error-icon{fill:#552222;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .marker.cross{stroke:#333333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 p{margin:0;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster-label text{fill:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster-label span{color:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster-label span p{background-color:transparent;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .label text,#mermaid-svg-Ouy0YjqRNDTnXIK6 span{fill:#333;color:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .node rect,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node circle,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node ellipse,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node polygon,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .rough-node .label text,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node .label text,#mermaid-svg-Ouy0YjqRNDTnXIK6 .image-shape .label,#mermaid-svg-Ouy0YjqRNDTnXIK6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .rough-node .label,#mermaid-svg-Ouy0YjqRNDTnXIK6 .node .label,#mermaid-svg-Ouy0YjqRNDTnXIK6 .image-shape .label,#mermaid-svg-Ouy0YjqRNDTnXIK6 .icon-shape .label{text-align:center;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .node.clickable{cursor:pointer;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .arrowheadPath{fill:#333333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ouy0YjqRNDTnXIK6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ouy0YjqRNDTnXIK6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster text{fill:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .cluster span{color:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ouy0YjqRNDTnXIK6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .icon-shape,#mermaid-svg-Ouy0YjqRNDTnXIK6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .icon-shape p,#mermaid-svg-Ouy0YjqRNDTnXIK6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .icon-shape .label rect,#mermaid-svg-Ouy0YjqRNDTnXIK6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ouy0YjqRNDTnXIK6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ouy0YjqRNDTnXIK6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ouy0YjqRNDTnXIK6 :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>\u62c6\u5206\u4e4b\u540e<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5206\u5e03\u5f0f\u4e8b\u52a1&#xff1a;\u4e09\u4e2a\u5404\u6000\u5fc3\u601d\u7684\u4eba<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>RPC\/HTTP\u53ef\u80fd\u8d85\u65f6\u3001\u91cd\u53d1\u3001\u4e71\u5e8f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>RPC\/HTTP<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>RPC\/HTTP<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5404\u81ea\u672c\u5730\u4e8b\u52a1\u5404\u7ba1\u5404\u7684\u63d0\u4ea4<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5404\u81ea\u672c\u5730\u4e8b\u52a1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u534f\u8c03\u8005order-service<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53c2\u4e0e\u80051account-db<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53c2\u4e0e\u80052stock-service<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53c2\u4e0e\u80053MQ \/ \u7b2c\u4e09\u65b9\u652f\u4ed8<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5e931<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5e932<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5355\u673a\u4e8b\u52a1&#xff1a;\u4e00\u4e2a\u8bf4\u4e86\u7b97\u7684\u4eba<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5e94\u7528\u7ebf\u7a0b<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u9501\u7ba1\u7406\u5668 &#043; Buffer Pool &#043; WAL<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u672c\u5730\u78c1\u76d8Redo \/ Undo \u4e00\u76d8\u68cb<\/p>\n<p><\/span><\/p>\n<p>\u8fd9\u4e2a\u56fe\u503c\u5f97\u591a\u770b\u4e00\u773c&#xff1a;\u5de6\u8fb9\u662f\u201c\u96c6\u4e2d\u5f0f\u5927\u8111\u201d&#xff0c;\u53f3\u8fb9\u662f\u201c\u8054\u90a6\u5236\u201d\u3002\u5206\u5e03\u5f0f\u4e8b\u52a1\u7684\u6240\u6709\u65b9\u6848&#xff0c;\u90fd\u662f\u5728\u56de\u7b54\u8054\u90a6\u5236\u4e0b\u600e\u4e48\u4e0d\u6253\u5185\u6218\u3002\u7b54\u6848\u65e0\u975e\u4e24\u6d3e&#xff1a;\u8981\u4e48\u5f3a\u884c\u9009\u4e2a\u4e2d\u592e\u96c6\u6743&#xff08;2PC\/XA\/Spanner&#xff09;&#xff0c;\u8981\u4e48\u627f\u8ba4\u5206\u6cbb\u3001\u7528\u8865\u507f\u548c\u91cd\u8bd5\u6700\u7ec8\u62b9\u5e73&#xff08;TCC\/Saga\/\u6d88\u606f\u6700\u7ec8\u4e00\u81f4&#xff09;\u3002\u540e\u9762\u5341\u51e0\u7ae0&#xff0c;\u5168\u662f\u8fd9\u4e24\u6d3e\u7684\u53d8\u4f53\u3002<\/p>\n<hr \/>\n<h3>2. \u5148\u8865\u8bfe&#xff1a;ACID\u3001CAP\u3001BASE \u5230\u5e95\u5728\u8bf4\u4ec0\u4e48<\/h3>\n<p>\u9762\u8bd5\u516b\u80a1\u6587\u91cc\u8fd9\u4e09\u4e2a\u8bcd\u88ab\u56bc\u70c2\u4e86&#xff0c;\u4f46\u771f\u5230\u9009\u578b\u65f6&#xff0c;\u5f88\u591a\u4eba\u8fd8\u662f\u628a\u5b83\u4eec\u5f53\u53e3\u53f7\u3002\u8fd9\u91cc\u7528\u4eba\u8bdd\u91cd\u65b0\u8bb2\u4e00\u904d&#xff0c;\u8bb2\u6e05\u695a\u5b83\u4eec\u7ba1\u4ec0\u4e48\u3001\u4e0d\u7ba1\u4ec0\u4e48\u3002<\/p>\n<h4>2.1 ACID&#xff1a;\u6570\u636e\u5e93\u7ed9\u4f60\u7b7e\u7684\u5408\u540c<\/h4>\n<ul>\n<li>A&#xff08;Atomicity&#xff0c;\u539f\u5b50\u6027&#xff09;&#xff1a;\u4e00\u7ec4\u64cd\u4f5c\u8981\u4e48\u5168\u751f\u6548&#xff0c;\u8981\u4e48\u5168\u4e0d\u751f\u6548\u3002\u8f6c\u8d26\u6263\u4e86 A \u6ca1\u52a0\u7ed9 B&#xff0c;\u5c31\u662f\u8fdd\u7ea6\u3002<\/li>\n<li>C&#xff08;Consistency&#xff0c;\u4e00\u81f4\u6027&#xff09;&#xff1a;\u8fd9\u4e2a\u6700\u88ab\u8bef\u89e3\u3002\u5b83\u4e0d\u662f\u6307\u201c\u6240\u6709\u526f\u672c\u4e00\u6837\u201d&#xff0c;\u800c\u662f\u6307\u201c\u6570\u636e\u6ee1\u8db3\u4e1a\u52a1 invariant\u201d\u3002\u6bd4\u5982 A&#043;B \u603b\u989d\u4e0d\u53d8\u3001\u5e93\u5b58\u4e0d\u80fd\u4e3a\u8d1f\u3002\u6ce8\u610f&#xff0c;C \u662f A&#043;I \u5171\u540c\u4fdd\u8bc1\u7684\u7ed3\u679c&#xff0c;\u6570\u636e\u5e93\u81ea\u5df1\u4fdd\u8bc1\u4e0d\u4e86\u4e1a\u52a1\u89c4\u5219\u5199\u9519\u4e86\u3002<\/li>\n<li>I&#xff08;Isolation&#xff0c;\u9694\u79bb\u6027&#xff09;&#xff1a;\u5e76\u53d1\u4e8b\u52a1\u4e92\u76f8\u770b\u4e0d\u89c1\u4e2d\u95f4\u72b6\u6001\u3002\u4f60\u8f6c\u8d26\u5230\u4e00\u534a&#xff0c;\u522b\u4eba\u67e5\u8d26\u4e0d\u80fd\u770b\u5230 A \u5c11\u4e86\u3001B \u8fd8\u6ca1\u591a\u3002<\/li>\n<li>D&#xff08;Durability&#xff0c;\u6301\u4e45\u6027&#xff09;&#xff1a;\u4e00\u65e6 commit&#xff0c;\u6389\u7535\u4e5f\u4e0d\u4e22\u3002\u9760 redo log &#043; \u5237\u76d8\u4fdd\u8bc1\u3002<\/li>\n<\/ul>\n<p>\u5355\u673a\u4e0b\u8fd9\u56db\u6761\u662f\u6570\u636e\u5e93\u5185\u6838\u7528\u9501 &#043; \u65e5\u5fd7\u786c\u625b\u51fa\u6765\u7684\u3002\u5206\u5e03\u5f0f\u4e0b&#xff0c;A \u548c I \u6700\u96be&#xff0c;\u56e0\u4e3a\u64cd\u4f5c\u6563\u5728\u591a\u53f0\u673a\u5668\u4e0a&#xff0c;\u9501\u4e0d\u4f4f&#xff0c;\u4e5f\u4e0d\u597d\u4e00\u8d77\u56de\u6eda\u3002<\/p>\n<h4>2.2 CAP&#xff1a;\u4e0d\u662f\u4e09\u9009\u4e8c\u7684\u9009\u62e9\u9898&#xff0c;\u662f\u53d6\u820d\u9898<\/h4>\n<p>CAP \u8bf4&#xff1a;\u5728\u7f51\u7edc\u5206\u533a&#xff08;P&#xff09;\u53d1\u751f\u65f6&#xff0c;\u4f60\u53ea\u80fd\u5728\u4e00\u81f4\u6027&#xff08;C&#xff09;\u548c\u53ef\u7528\u6027&#xff08;A&#xff09;\u4e4b\u95f4\u4e8c\u9009\u4e00\u3002\u5f88\u591a\u4eba\u7406\u89e3\u6210\u201c\u5e73\u65f6\u53ef\u4ee5\u4e09\u8005\u517c\u5f97\u201d&#xff0c;\u9519\u4e86\u3002\u5206\u5e03\u5f0f\u7cfb\u7edf\u8bbe\u8ba1\u8005 Eric Brewer \u540e\u6765\u81ea\u5df1\u6f84\u6e05&#xff1a;CAP \u7684\u771f\u76f8\u662f P \u4e00\u5b9a\u4f1a\u6765&#xff0c;\u4f60\u5e73\u65f6\u5c31\u8981\u4e3a P \u505a\u51c6\u5907\u3002<\/p>\n<p>\u4e3e\u4e2a\u7535\u5546\u4f8b\u5b50&#xff1a;\u4e0b\u5355\u8981\u6263\u5e93\u5b58&#xff0c;\u5e93\u5b58\u670d\u52a1\u548c\u8ba2\u5355\u670d\u52a1\u4e4b\u95f4\u7f51\u7edc\u65ad\u4e86\u3002\u4f60\u600e\u4e48\u529e&#xff1f;<\/p>\n<ul>\n<li>\u9009 C&#xff1a;\u8ba2\u5355\u670d\u52a1\u76f4\u63a5\u62a5\u9519\u201c\u5e93\u5b58\u672a\u77e5&#xff0c;\u7a0d\u540e\u518d\u8bd5\u201d\u3002\u6570\u636e\u4e0d\u4f1a\u9519&#xff0c;\u4f46\u7528\u6237\u9a82\u5a18&#xff0c;\u53ef\u7528\u6027\u6389\u4e86\u3002<\/li>\n<li>\u9009 A&#xff1a;\u5148\u8ba9\u7528\u6237\u4e0b\u5355\u6210\u529f&#xff0c;\u5e93\u5b58\u663e\u793a\u201c\u53ef\u80fd\u6709\u8d27\u201d&#xff0c;\u540e\u53f0\u6162\u6162\u5bf9\u8d26\u3002\u4f53\u9a8c\u4fdd\u4f4f\u4e86&#xff0c;\u4f46\u53ef\u80fd\u8d85\u5356&#xff0c;\u8981\u4e8b\u540e\u8865\u507f\u3002<\/li>\n<\/ul>\n<p>\u4e92\u8054\u7f51\u7edd\u5927\u591a\u6570\u6838\u5fc3\u94fe\u8def\u9009 A &#043; \u6700\u7ec8\u4e00\u81f4&#xff0c;\u53ea\u6709\u94b1\u3001\u5238\u3001\u5e93\u5b58\u6263\u51cf\u90a3\u4e00\u4e0b&#xff0c;\u5c40\u90e8\u9009 C\u3002\u8fd9\u5c31\u662f BASE \u7684\u7531\u6765\u3002<\/p>\n<h4>2.3 BASE&#xff1a;\u628a\u8981\u6c42\u653e low \u4e00\u70b9&#xff0c;\u65e5\u5b50\u597d\u8fc7\u4e00\u70b9<\/h4>\n<p>BASE \u662f eBay \u90a3\u5e2e\u4eba\u603b\u7ed3\u7684\u91ce\u8def\u5b50&#xff0c;\u548c ACID \u9010\u6761\u5bf9\u5e94&#xff1a;<\/p>\n<ul>\n<li>BA&#xff08;Basically Available&#xff0c;\u57fa\u672c\u53ef\u7528&#xff09;&#xff1a;\u5141\u8bb8\u90e8\u5206\u5931\u8d25&#xff0c;\u964d\u7ea7\u3001\u9650\u6d41\u3001\u8fd4\u56de\u515c\u5e95\u6570\u636e\u90fd\u884c&#xff0c;\u522b\u6574\u4f53\u6302\u3002<\/li>\n<li>S&#xff08;Soft state&#xff0c;\u8f6f\u72b6\u6001&#xff09;&#xff1a;\u5141\u8bb8\u4e2d\u95f4\u72b6\u6001\u5b58\u5728\u3002\u6bd4\u5982\u8ba2\u5355\u5148\u662f PAYING&#xff0c;\u51e0\u79d2\u540e\u624d\u53d8 PAID&#xff0c;\u4e2d\u95f4\u67e5\u5230\u4ec0\u4e48\u90fd\u522b\u60ca\u8bb6\u3002<\/li>\n<li>E&#xff08;Eventually consistent&#xff0c;\u6700\u7ec8\u4e00\u81f4&#xff09;&#xff1a;\u4e0d\u8981\u6c42\u8bfb\u5230\u6700\u65b0&#xff0c;\u4f46\u4fdd\u8bc1\u5728\u6ca1\u6709\u65b0\u5199\u5165\u540e&#xff0c;\u6700\u7ec8\u6240\u6709\u526f\u672c\u6536\u655b\u5230\u4e00\u6837\u3002\u81f3\u4e8e\u201c\u6700\u7ec8\u201d\u662f 50ms \u8fd8\u662f 5 \u5206\u949f&#xff0c;\u770b\u65b9\u6848\u3002<\/li>\n<\/ul>\n<p>\u4e00\u53e5\u8bdd\u603b\u7ed3&#xff1a;ACID \u662f\u201c\u5f53\u573a\u7b97\u6e05\u201d&#xff0c;BASE \u662f\u201c\u5148\u8bb0\u5c0f\u672c\u672c&#xff0c;\u4e8b\u540e\u7b97\u6e05\u201d\u3002 \u540e\u9762\u8bb2\u7684 Saga\u3001TCC\u3001\u6d88\u606f\u4e8b\u52a1&#xff0c;\u5168\u662f\u201c\u5c0f\u672c\u672c\u201d \u7684\u4e0d\u540c\u8bb0\u6cd5\u3002<\/p>\n<p>#mermaid-svg-hGcUb1A1tyhEg7yE{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hGcUb1A1tyhEg7yE .error-icon{fill:#552222;}#mermaid-svg-hGcUb1A1tyhEg7yE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hGcUb1A1tyhEg7yE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hGcUb1A1tyhEg7yE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hGcUb1A1tyhEg7yE .marker.cross{stroke:#333333;}#mermaid-svg-hGcUb1A1tyhEg7yE svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hGcUb1A1tyhEg7yE p{margin:0;}#mermaid-svg-hGcUb1A1tyhEg7yE .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster-label text{fill:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster-label span{color:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster-label span p{background-color:transparent;}#mermaid-svg-hGcUb1A1tyhEg7yE .label text,#mermaid-svg-hGcUb1A1tyhEg7yE span{fill:#333;color:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE .node rect,#mermaid-svg-hGcUb1A1tyhEg7yE .node circle,#mermaid-svg-hGcUb1A1tyhEg7yE .node ellipse,#mermaid-svg-hGcUb1A1tyhEg7yE .node polygon,#mermaid-svg-hGcUb1A1tyhEg7yE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hGcUb1A1tyhEg7yE .rough-node .label text,#mermaid-svg-hGcUb1A1tyhEg7yE .node .label text,#mermaid-svg-hGcUb1A1tyhEg7yE .image-shape .label,#mermaid-svg-hGcUb1A1tyhEg7yE .icon-shape .label{text-anchor:middle;}#mermaid-svg-hGcUb1A1tyhEg7yE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hGcUb1A1tyhEg7yE .rough-node .label,#mermaid-svg-hGcUb1A1tyhEg7yE .node .label,#mermaid-svg-hGcUb1A1tyhEg7yE .image-shape .label,#mermaid-svg-hGcUb1A1tyhEg7yE .icon-shape .label{text-align:center;}#mermaid-svg-hGcUb1A1tyhEg7yE .node.clickable{cursor:pointer;}#mermaid-svg-hGcUb1A1tyhEg7yE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hGcUb1A1tyhEg7yE .arrowheadPath{fill:#333333;}#mermaid-svg-hGcUb1A1tyhEg7yE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hGcUb1A1tyhEg7yE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hGcUb1A1tyhEg7yE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hGcUb1A1tyhEg7yE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hGcUb1A1tyhEg7yE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hGcUb1A1tyhEg7yE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster text{fill:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE .cluster span{color:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hGcUb1A1tyhEg7yE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hGcUb1A1tyhEg7yE rect.text{fill:none;stroke-width:0;}#mermaid-svg-hGcUb1A1tyhEg7yE .icon-shape,#mermaid-svg-hGcUb1A1tyhEg7yE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hGcUb1A1tyhEg7yE .icon-shape p,#mermaid-svg-hGcUb1A1tyhEg7yE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hGcUb1A1tyhEg7yE .icon-shape .label rect,#mermaid-svg-hGcUb1A1tyhEg7yE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hGcUb1A1tyhEg7yE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hGcUb1A1tyhEg7yE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hGcUb1A1tyhEg7yE :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>\u7f51\u7edc\u5206\u533a\u65f6\u505a\u4e0d\u5230<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>BASE&#xff1a;\u5148\u8bb0\u8d26&#xff0c;\u4e8b\u540e\u62b9\u5e73<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6263 A 100 \u6210\u529f\u8bb0\u6d41\u6c34 TRYING<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8c03 B \u52a0\u94b1\u8d85\u65f6\u672a\u77e5<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u540e\u53f0\u91cd\u8bd5 \/ \u5bf9\u8d26 \/ \u8865\u507f\u6700\u7ec8\u4e24\u8fb9\u5e73<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>ACID&#xff1a;\u5f53\u573a\u7b97\u6e05<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6263 A 100<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u52a0 B 100<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e00\u8d77\u63d0\u4ea4\u5931\u8d25\u4e00\u8d77\u6eda<\/p>\n<p><\/span><\/p>\n<h4>2.4 \u4e00\u81f4\u6027\u5149\u8c31&#xff1a;\u522b\u518d\u53ea\u8bf4\u201c\u5f3a\u4e00\u81f4 \/ \u6700\u7ec8\u4e00\u81f4\u201d<\/h4>\n<p>\u5de5\u7a0b\u4e0a\u4e00\u81f4\u6027\u662f\u4e2a\u5149\u8c31&#xff0c;\u4ece\u5f3a\u5230\u5f31\u5927\u81f4\u662f&#xff1a;\u7ebf\u6027\u4e00\u81f4 &gt; \u987a\u5e8f\u4e00\u81f4 &gt; \u56e0\u679c\u4e00\u81f4 &gt; \u4f1a\u8bdd\u4e00\u81f4 &gt; \u6700\u7ec8\u4e00\u81f4\u3002\u9009\u578b\u65f6\u95ee\u81ea\u5df1\u4e24\u4e2a\u95ee\u9898\u5c31\u884c&#xff1a;<\/p>\n<li>\u5e76\u53d1\u5199\u540c\u4e00\u6761\u6570\u636e\u65f6&#xff0c;\u80fd\u4e0d\u80fd\u63a5\u53d7\u77ed\u6682\u5206\u53c9&#xff1f; \u8f6c\u8d26\u3001\u6263\u5e93\u5b58\u4e0d\u884c&#xff0c;\u70b9\u8d5e\u6570\u3001\u8bc4\u8bba\u6570\u884c\u3002<\/li>\n<li>\u8bfb\u5230\u65e7\u6570\u636e&#xff0c;\u540e\u679c\u662f\u8c01\u627f\u62c5&#xff1f; \u7528\u6237\u591a\u5237\u4e00\u6b21\u80fd\u63a5\u53d7&#xff0c;\u8d85\u5356\u591a\u5356\u4e00\u4ef6\u8001\u677f\u4e0d\u63a5\u53d7\u3002<\/li>\n<p>\u8f6c\u8d26\u3001\u8bc1\u5238\u64ae\u5408\u8981\u7ebf\u6027\u4e00\u81f4&#xff1b;\u5546\u54c1\u8be6\u60c5\u9875\u3001Feed \u6d41&#xff0c;\u6700\u7ec8\u4e00\u81f4\u52a0\u7f13\u5b58\u5c31\u591f\u4e86\u3002\u5206\u5e03\u5f0f\u4e8b\u52a1\u65b9\u6848&#xff0c;\u672c\u8d28\u5c31\u662f\u5728\u8fd9\u4e2a\u5149\u8c31\u4e0a\u9009\u4e2a\u843d\u70b9\u3002<\/p>\n<hr \/>\n<h3>3. \u5355\u673a\u4e8b\u52a1\u7684\u8001\u5e95&#xff1a;WAL\u3001\u9501\u4e0e MVCC<\/h3>\n<p>\u4e0d\u61c2\u5355\u673a&#xff0c;\u5c31\u770b\u4e0d\u61c2\u5206\u5e03\u5f0f\u4e3a\u4ec0\u4e48\u96be\u3002\u8fd9\u4e00\u7ae0\u662f\u5730\u57fa&#xff0c; already \u61c2 InnoDB \u7684\u53ef\u4ee5\u5feb\u901f\u7ffb&#xff0c;\u4f46\u522b\u8df3\u2014\u2014\u540e\u9762 Seata AT\u3001Percolator \u5168\u662f\u5bf9\u8fd9\u4e9b\u8001\u62db\u5f0f\u7684\u5206\u5e03\u5f0f\u7ffb\u7248\u3002<\/p>\n<h4>3.1 Undo &#043; Redo &#043; WAL&#xff1a;\u6570\u636e\u5e93\u4e0d\u4e22\u6570\u636e\u7684\u4e09\u677f\u65a7<\/h4>\n<p>\u6570\u636e\u5e93\u6562\u8bf4 D&#xff08;\u6301\u4e45&#xff09;&#xff0c;\u9760\u7684\u4e0d\u662f\u6bcf\u6b21 commit \u90fd\u628a\u6570\u636e\u9875\u5237\u76d8&#xff08;\u90a3\u592a\u6162\u4e86&#xff09;&#xff0c;\u800c\u662f WAL&#xff08;Write-Ahead Logging&#xff0c;\u9884\u5199\u65e5\u5fd7&#xff09;&#xff1a;\u6539\u6570\u636e\u524d&#xff0c;\u5148\u628a\u201c\u6211\u8981\u5e72\u4ec0\u4e48\u201d\u987a\u5e8f\u5199\u8fdb\u65e5\u5fd7\u5e76\u5237\u76d8&#xff0c;\u6570\u636e\u9875\u6162\u6162\u5237\u90fd\u884c\u3002crash \u4e86\u91cd\u542f\u56de\u653e\u65e5\u5fd7\u5373\u53ef\u3002<\/p>\n<ul>\n<li>Redo log&#xff1a;\u8bb0\u201c\u505a\u8fc7\u4ec0\u4e48\u201d&#xff0c;\u7528\u6765 crash \u540e\u91cd\u505a&#xff0c;\u4fdd\u8bc1\u5df2\u63d0\u4ea4\u4e0d\u4e22\u3002\u987a\u5e8f\u5199&#xff0c;\u5feb\u3002<\/li>\n<li>Undo log&#xff1a;\u8bb0\u201c\u4ee5\u524d\u4ec0\u4e48\u6837\u201d&#xff0c;\u7528\u6765\u56de\u6eda\u548c\u7ed9\u522b\u7684\u4e8b\u52a1\u63d0\u4f9b\u65e7\u7248\u672c\u5feb\u7167\u3002<\/li>\n<li>Checkpoint&#xff1a;\u5b9a\u671f\u628a\u810f\u9875\u5237\u76d8&#xff0c;\u622a\u65ad\u65e5\u5fd7&#xff0c;\u4e0d\u7136\u65e5\u5fd7\u65e0\u9650\u957f&#xff0c;\u6062\u590d\u8981\u56de\u653e\u5230\u5929\u8352\u5730\u8001\u3002<\/li>\n<\/ul>\n<p>#mermaid-svg-COuS1nbqf10qP8dC{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-COuS1nbqf10qP8dC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-COuS1nbqf10qP8dC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-COuS1nbqf10qP8dC .error-icon{fill:#552222;}#mermaid-svg-COuS1nbqf10qP8dC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-COuS1nbqf10qP8dC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-COuS1nbqf10qP8dC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-COuS1nbqf10qP8dC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-COuS1nbqf10qP8dC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-COuS1nbqf10qP8dC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-COuS1nbqf10qP8dC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-COuS1nbqf10qP8dC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-COuS1nbqf10qP8dC .marker.cross{stroke:#333333;}#mermaid-svg-COuS1nbqf10qP8dC svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-COuS1nbqf10qP8dC p{margin:0;}#mermaid-svg-COuS1nbqf10qP8dC .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-COuS1nbqf10qP8dC .cluster-label text{fill:#333;}#mermaid-svg-COuS1nbqf10qP8dC .cluster-label span{color:#333;}#mermaid-svg-COuS1nbqf10qP8dC .cluster-label span p{background-color:transparent;}#mermaid-svg-COuS1nbqf10qP8dC .label text,#mermaid-svg-COuS1nbqf10qP8dC span{fill:#333;color:#333;}#mermaid-svg-COuS1nbqf10qP8dC .node rect,#mermaid-svg-COuS1nbqf10qP8dC .node circle,#mermaid-svg-COuS1nbqf10qP8dC .node ellipse,#mermaid-svg-COuS1nbqf10qP8dC .node polygon,#mermaid-svg-COuS1nbqf10qP8dC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-COuS1nbqf10qP8dC .rough-node .label text,#mermaid-svg-COuS1nbqf10qP8dC .node .label text,#mermaid-svg-COuS1nbqf10qP8dC .image-shape .label,#mermaid-svg-COuS1nbqf10qP8dC .icon-shape .label{text-anchor:middle;}#mermaid-svg-COuS1nbqf10qP8dC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-COuS1nbqf10qP8dC .rough-node .label,#mermaid-svg-COuS1nbqf10qP8dC .node .label,#mermaid-svg-COuS1nbqf10qP8dC .image-shape .label,#mermaid-svg-COuS1nbqf10qP8dC .icon-shape .label{text-align:center;}#mermaid-svg-COuS1nbqf10qP8dC .node.clickable{cursor:pointer;}#mermaid-svg-COuS1nbqf10qP8dC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-COuS1nbqf10qP8dC .arrowheadPath{fill:#333333;}#mermaid-svg-COuS1nbqf10qP8dC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-COuS1nbqf10qP8dC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-COuS1nbqf10qP8dC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-COuS1nbqf10qP8dC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-COuS1nbqf10qP8dC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-COuS1nbqf10qP8dC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-COuS1nbqf10qP8dC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-COuS1nbqf10qP8dC .cluster text{fill:#333;}#mermaid-svg-COuS1nbqf10qP8dC .cluster span{color:#333;}#mermaid-svg-COuS1nbqf10qP8dC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-COuS1nbqf10qP8dC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-COuS1nbqf10qP8dC rect.text{fill:none;stroke-width:0;}#mermaid-svg-COuS1nbqf10qP8dC .icon-shape,#mermaid-svg-COuS1nbqf10qP8dC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-COuS1nbqf10qP8dC .icon-shape p,#mermaid-svg-COuS1nbqf10qP8dC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-COuS1nbqf10qP8dC .icon-shape .label rect,#mermaid-svg-COuS1nbqf10qP8dC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-COuS1nbqf10qP8dC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-COuS1nbqf10qP8dC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-COuS1nbqf10qP8dC :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426 \/ \u56de\u6eda<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e8b\u52a1&#xff1a;UPDATE balance &#061; 900 WHERE id&#061;A<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>1. \u5199 Undo&#xff1a;\u8bb0\u4e0b\u65e7\u503c 1000<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>2. \u6539 Buffer Pool \u5185\u5b58\u9875&#xff1a;1000 -&gt; 900<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>3. \u5199 Redo Log Buffer&#xff1a;\u8bb0\u4e0b\u65b0\u503c 900<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>COMMIT?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5237 Redo \u8fdb\u78c1\u76d8\u5373\u53ef\u8fd4\u56de\u6210\u529f\u6570\u636e\u9875\u7a0d\u540e\u5237<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7528 Undo \u628a\u5185\u5b58\u9875\u6539\u56de 1000<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>crash \u4e86?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u91cd\u542f&#xff1a;\u7528 Redo \u91cd\u505a\u5df2\u63d0\u4ea4\u7528 Undo \u56de\u6eda\u672a\u63d0\u4ea4<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u540e\u53f0\u5237\u810f\u9875 &#043; Checkpoint<\/p>\n<p><\/span><\/p>\n<p>\u7406\u89e3\u8fd9\u5f20\u56fe\u7684\u610f\u4e49\u5728\u4e8e&#xff1a;\u540e\u9762\u6240\u6709\u5206\u5e03\u5f0f\u65b9\u6848&#xff0c;\u90fd\u5728\u6a21\u4eff\u5b83\u30022PC \u7684 prepare \u9636\u6bb5\u5c31\u662f\u5206\u5e03\u5f0f\u7248\u7684\u201c\u5199\u65e5\u5fd7\u4f46\u4e0d\u63d0\u4ea4\u201d&#xff1b;Saga \u7684\u8865\u507f\u8868\u5c31\u662f\u5206\u5e03\u5f0f\u7248\u7684\u201cundo log\u201d&#xff1b;Outbox \u8868\u5c31\u662f\u5206\u5e03\u5f0f\u7248\u7684\u201credo log\u201d\u3002\u6362\u4e86\u8eab\u8863\u670d&#xff0c;\u9b42\u6ca1\u53d8\u3002<\/p>\n<h4>3.2 \u9694\u79bb\u6027&#xff1a;\u5e76\u53d1\u6253\u67b6\u65f6&#xff0c;\u8c01\u5148\u52a8\u624b<\/h4>\n<p>\u4e24\u4e2a\u4e8b\u52a1\u540c\u65f6\u52a8\u540c\u4e00\u884c&#xff0c;\u65e0\u975e\u4e09\u79cd\u51b2\u7a81&#xff1a;\u810f\u8bfb&#xff08;\u8bfb\u5230\u522b\u4eba\u6ca1\u63d0\u4ea4\u7684&#xff09;\u3001\u4e0d\u53ef\u91cd\u590d\u8bfb&#xff08;\u4e24\u6b21\u8bfb\u540c\u4e00\u884c\u7ed3\u679c\u53d8\u4e86&#xff09;\u3001\u5e7b\u8bfb&#xff08;\u4e24\u6b21\u67e5\u8303\u56f4\u884c\u6570\u53d8\u4e86&#xff09;\u3002SQL \u6807\u51c6\u5b9a\u4e86\u56db\u4e2a\u9694\u79bb\u7ea7\u522b&#xff0c;\u672c\u8d28\u662f\u201c\u52a0\u9501\u7684\u72e0\u5ea6\u201d&#xff1a;<\/p>\n<table>\n<tr>\u9694\u79bb\u7ea7\u522b\u810f\u8bfb\u4e0d\u53ef\u91cd\u590d\u8bfb\u5e7b\u8bfb\u5b9e\u73b0\u7c97\u89e3<\/tr>\n<tbody>\n<tr>\n<td>READ UNCOMMITTED<\/td>\n<td>\u53ef\u80fd<\/td>\n<td>\u53ef\u80fd<\/td>\n<td>\u53ef\u80fd<\/td>\n<td>\u57fa\u672c\u4e0d\u52a0\u9501<\/td>\n<\/tr>\n<tr>\n<td>READ COMMITTED<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u53ef\u80fd<\/td>\n<td>\u53ef\u80fd<\/td>\n<td>\u5199\u9501 &#043; \u8bfb\u5df2\u63d0\u4ea4\u5feb\u7167<\/td>\n<\/tr>\n<tr>\n<td>REPEATABLE READ&#xff08;MySQL \u9ed8\u8ba4&#xff09;<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u90e8\u5206\u9632&#xff08;\u9760\u95f4\u9699\u9501&#xff09;<\/td>\n<td>MVCC \u5feb\u7167 &#043; \u95f4\u9699\u9501<\/td>\n<\/tr>\n<tr>\n<td>SERIALIZABLE<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u4e0d\u4f1a<\/td>\n<td>\u5168\u52a0\u9501\u4e32\u884c&#xff0c;\u6027\u80fd\u6700\u5dee<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>MySQL InnoDB \u9ed8\u8ba4 REPEATABLE READ&#xff0c;\u9760\u4e24\u62db&#xff1a;2PL&#xff08;\u4e24\u9636\u6bb5\u9501&#xff09;\u7ba1\u5199&#xff0c;MVCC&#xff08;\u591a\u7248\u672c\u5e76\u53d1\u63a7\u5236&#xff09;\u7ba1\u8bfb\u3002\u5199\u8981\u52a0\u884c\u9501&#xff0c;\u8bfb\u76f4\u63a5\u8bfb\u5feb\u7167&#xff0c;\u4e0d\u4e92\u76f8\u5835&#xff0c;\u8fd9\u5c31\u662f\u8bfb\u5199\u4e0d\u963b\u585e\u7684\u79d8\u5bc6\u3002<\/p>\n<p>MVCC \u4e00\u53e5\u8bdd\u539f\u7406&#xff1a;\u6bcf\u884c\u6570\u636e\u5e26\u4e24\u4e2a\u9690\u85cf\u7248\u672c\u53f7 trx_id&#xff08;\u8c01\u521b\u5efa\u7684&#xff09;\u3001roll_ptr&#xff08;\u6307\u5411\u4e0a\u4e2a\u7248\u672c&#xff09;\u3002\u8bfb\u7684\u65f6\u5019\u53ea\u770b\u5728\u4f60\u4e8b\u52a1\u5f00\u59cb\u524d\u5c31\u63d0\u4ea4\u4e86\u7684\u7248\u672c&#xff0c;\u65b0\u7248\u672c\u5bf9\u4f60\u4e0d\u53ef\u89c1\u3002\u6240\u4ee5\u4f60\u5728\u4e8b\u52a1\u91cc\u53cd\u590d SELECT&#xff0c;\u770b\u5230\u7684\u662f\u540c\u4e00\u4efd\u5feb\u7167\u3002<\/p>\n<p>\u4f46 MVCC \u6709\u4e2a\u8457\u540d\u7684\u5751&#xff1a;\u5199\u504f\u659c&#xff08;Write Skew&#xff09;\u3002\u533b\u751f\u503c\u73ed\u4f8b\u5b50&#xff1a;\u89c4\u5b9a\u81f3\u5c11\u7559\u4e00\u4e2a\u533b\u751f&#xff0c;\u4e24\u4e2a\u4e8b\u52a1\u540c\u65f6\u67e5\u201c\u5728\u5c97\u51e0\u4eba\u201d&#xff0c;\u90fd\u770b\u5230 2 \u4eba&#xff0c;\u5404\u81ea\u8bf7\u5047\u4e00\u4eba&#xff0c;\u90fd\u6210\u529f\u4e86&#xff0c;\u7ed3\u679c 0 \u4eba\u5728\u5c97\u3002RR \u5feb\u7167\u4e0b\u4e24\u4e2a\u8bfb\u90fd\u4e0d\u51b2\u7a81&#xff0c;\u5199\u4e5f\u4e0d\u51b2\u7a81&#xff0c;\u6570\u636e\u5e93\u89c9\u5f97\u6ca1\u95ee\u9898&#xff0c;\u4e1a\u52a1 invariant \u5374\u7834\u4e86\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u94f6\u884c\u3001\u5e93\u5b58\u573a\u666f&#xff0c;\u5149\u9760\u6570\u636e\u5e93\u9694\u79bb\u7ea7\u522b\u4e0d\u591f&#xff0c;\u8fd8\u8981\u5728\u5e94\u7528\u5c42\u52a0\u4e50\u89c2\u9501&#xff08;version \u5217&#xff09;\u6216\u60b2\u89c2\u9501&#xff08;SELECT &#8230; FOR UPDATE&#xff09;\u3002<\/p>\n<p>\u5206\u5e03\u5f0f\u628a\u8fd9\u4e2a\u95ee\u9898\u653e\u5927\u5341\u500d&#xff1a;\u9501\u6563\u5728\u591a\u4e2a\u5e93&#xff0c;MVCC \u5feb\u7167\u5404\u7ba1\u5404\u7684&#xff0c;\u6ca1\u6709\u5168\u5c40 trx_id\u3002\u540e\u9762\u8bb2 Spanner \u7528 TrueTime \u9020\u5168\u5c40\u65f6\u95f4\u6233\u3001TiDB \u7528 TSO \u9020\u5168\u5c40\u9012\u589e\u53f7&#xff0c;\u90fd\u662f\u4e3a\u4e86\u89e3\u51b3\u201c\u5206\u5e03\u5f0f\u4e0b\u8c01\u5148\u8c01\u540e\u201d\u3002<\/p>\n<hr \/>\n<h3>4. \u5f3a\u4e00\u81f4\u6d3e&#xff1a;2PC\u30013PC \u4e0e XA<\/h3>\n<p>\u5f3a\u4e00\u81f4\u6d3e\u7684\u601d\u8def\u5f88\u76f4&#xff1a;\u627e\u4e2a\u8001\u5927&#xff08;\u534f\u8c03\u8005&#xff09;&#xff0c;\u6240\u6709\u4eba\u542c\u4ed6\u7684\u3002\u8001\u5927\u8bf4\u201c\u90fd\u51c6\u5907\u597d\u6ca1\u201d&#xff0c;\u5927\u5bb6\u8bf4\u201c\u597d\u4e86\u201d&#xff0c;\u8001\u5927\u518d\u8bf4\u201c\u63d0\u4ea4\u201d\u3002\u8fd9\u5c31\u662f\u4e24\u9636\u6bb5\u63d0\u4ea4&#xff08;2PC&#xff09;\u3002<\/p>\n<h4>4.1 2PC \u5168\u6d41\u7a0b&#xff1a;\u51c6\u5907 &#043; \u63d0\u4ea4&#xff0c;\u542c\u7740\u7b80\u5355&#xff0c;\u5751\u5168\u5728\u7ec6\u8282<\/h4>\n<p>\u89d2\u8272\u5c31\u4e24\u4e2a&#xff1a;\u534f\u8c03\u8005&#xff08;Coordinator&#xff09; \u548c \u53c2\u4e0e\u8005&#xff08;Participant&#xff09;\u3002\u6b63\u5e38\u6d41\u7a0b\u5206\u4e24\u9636\u6bb5&#xff1a;<\/p>\n<p>\u53c2\u4e0e\u8005 RM2(stock-db)\u53c2\u4e0e\u8005 RM1(account-db)\u534f\u8c03\u8005 TM\u53c2\u4e0e\u8005 RM2(stock-db)\u53c2\u4e0e\u8005 RM1(account-db)\u534f\u8c03\u8005 TM#mermaid-svg-SP0Zk8wzd44MIw6s{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SP0Zk8wzd44MIw6s .error-icon{fill:#552222;}#mermaid-svg-SP0Zk8wzd44MIw6s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SP0Zk8wzd44MIw6s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SP0Zk8wzd44MIw6s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SP0Zk8wzd44MIw6s .marker.cross{stroke:#333333;}#mermaid-svg-SP0Zk8wzd44MIw6s svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SP0Zk8wzd44MIw6s p{margin:0;}#mermaid-svg-SP0Zk8wzd44MIw6s .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SP0Zk8wzd44MIw6s text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SP0Zk8wzd44MIw6s .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-SP0Zk8wzd44MIw6s .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-SP0Zk8wzd44MIw6s #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-SP0Zk8wzd44MIw6s .sequenceNumber{fill:white;}#mermaid-svg-SP0Zk8wzd44MIw6s #sequencenumber{fill:#333;}#mermaid-svg-SP0Zk8wzd44MIw6s #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-SP0Zk8wzd44MIw6s .messageText{fill:#333;stroke:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SP0Zk8wzd44MIw6s .labelText,#mermaid-svg-SP0Zk8wzd44MIw6s .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .loopText,#mermaid-svg-SP0Zk8wzd44MIw6s .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SP0Zk8wzd44MIw6s .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-SP0Zk8wzd44MIw6s .noteText,#mermaid-svg-SP0Zk8wzd44MIw6s .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-SP0Zk8wzd44MIw6s .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SP0Zk8wzd44MIw6s .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SP0Zk8wzd44MIw6s .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SP0Zk8wzd44MIw6s .actorPopupMenu{position:absolute;}#mermaid-svg-SP0Zk8wzd44MIw6s .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-SP0Zk8wzd44MIw6s .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SP0Zk8wzd44MIw6s .actor-man circle,#mermaid-svg-SP0Zk8wzd44MIw6s line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-SP0Zk8wzd44MIw6s :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}\u9636\u6bb51&#xff1a;Prepare&#xff08;\u6295\u7968&#xff09;\u9636\u6bb52&#xff1a;Commit&#xff08;\u6267\u884c&#xff09;prepare(XID)1prepare(XID)2\u5199 undo\/redo &#043; \u62ff\u884c\u9501\u4f46\u4e0d\u63d0\u4ea43\u5199 undo\/redo &#043; \u62ff\u884c\u9501\u4f46\u4e0d\u63d0\u4ea44YES&#xff08;\u6211\u51c6\u5907\u597d\u4e86&#xff09;5YES&#xff08;\u6211\u51c6\u5907\u597d\u4e86&#xff09;6\u90fd YES&#xff0c;\u5199 commit \u65e5\u5fd77commit8commit9\u771f\u6b63\u63d0\u4ea4&#xff0c;\u91ca\u653e\u950110\u771f\u6b63\u63d0\u4ea4&#xff0c;\u91ca\u653e\u950111ACK12ACK13<\/p>\n<p>\u770b\u7740\u6ca1\u6bdb\u75c5&#xff0c;\u4f46\u9b54\u9b3c\u5728\u5f02\u5e38\u5206\u652f\u3002\u753b\u4e2a\u72b6\u6001\u673a\u4f60\u5c31\u660e\u767d\u4e3a\u4ec0\u4e48 2PC \u88ab\u5410\u69fd\u662f\u201c\u963b\u585e\u534f\u8bae\u201d&#xff1a;<\/p>\n<p>#mermaid-svg-0Tg0bgfRrMCxzDNn{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0Tg0bgfRrMCxzDNn .error-icon{fill:#552222;}#mermaid-svg-0Tg0bgfRrMCxzDNn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0Tg0bgfRrMCxzDNn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .marker.cross{stroke:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0Tg0bgfRrMCxzDNn p{margin:0;}#mermaid-svg-0Tg0bgfRrMCxzDNn defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-0Tg0bgfRrMCxzDNn g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-0Tg0bgfRrMCxzDNn g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-0Tg0bgfRrMCxzDNn g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-0Tg0bgfRrMCxzDNn g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-0Tg0bgfRrMCxzDNn .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-0Tg0bgfRrMCxzDNn .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-0Tg0bgfRrMCxzDNn .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0Tg0bgfRrMCxzDNn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0Tg0bgfRrMCxzDNn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0Tg0bgfRrMCxzDNn .edgeLabel .label text{fill:#333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .label div .edgeLabel{color:#333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-0Tg0bgfRrMCxzDNn .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-0Tg0bgfRrMCxzDNn .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-0Tg0bgfRrMCxzDNn .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn #statediagram-barbEnd{fill:#333333;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .cluster-label,#mermaid-svg-0Tg0bgfRrMCxzDNn .nodeLabel{color:#131300;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .note-edge{stroke-dasharray:5;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-note text{fill:black;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram-note .nodeLabel{color:black;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagram .edgeLabel{color:red;}#mermaid-svg-0Tg0bgfRrMCxzDNn #dependencyStart,#mermaid-svg-0Tg0bgfRrMCxzDNn #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-0Tg0bgfRrMCxzDNn .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0Tg0bgfRrMCxzDNn :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>\u4e8b\u52a1\u5f00\u59cb<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u534f\u8c03\u8005\u53d1 prepare<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u53c2\u4e0e\u8005\u56de YES\u8fdb\u5165\u4e0d\u786e\u5b9a\u671f&#xff0c;\u9501\u7740\u8d44\u6e90\u7b49<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u4efb\u4e00\u56de NO \/ \u8d85\u65f6\u56de\u6eda\u91ca\u653e\u9501<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6536\u5230 commit&#xff0c;\u63d0\u4ea4<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6536\u5230 rollback&#xff0c;\u56de\u6eda<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>commit\/rollback \u5305\u4e22\u4e86\u6216\u534f\u8c03\u8005\u6302\u4e86\u4e00\u76f4 holding \u9501&#xff0c;\u8c01\u90fd\u52a8\u4e0d\u4e86\u8fd9\u884c<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u91cd\u8fde\u95ee\u5230 commit<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u91cd\u8fde\u95ee\u5230 abort<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u957f\u65f6\u95f4\u95ee\u4e0d\u5230&#xff0c;\u53ea\u80fd\u4eba\u5de5\u4ecb\u5165<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>Init<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Preparing<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Prepared<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Aborted<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Committed<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Blocked<\/p>\n<p><\/span><\/p>\n<p>\u4e24\u4e2a\u81f4\u547d\u4f24&#xff1a;<\/p>\n<li>\u540c\u6b65\u963b\u585e&#xff1a;\u53c2\u4e0e\u8005\u56de\u4e86 YES \u5c31\u88ab\u5957\u7262\u4e86&#xff0c;\u884c\u9501\u4e00\u76f4\u5360\u7740&#xff0c;\u76f4\u5230\u6536\u5230\u7b2c\u4e8c\u9636\u6bb5\u6d88\u606f\u3002\u534f\u8c03\u8005\u8fd9\u65f6\u5019\u6302\u4e86&#xff0c;\u6240\u6709\u53c2\u4e0e\u8005\u4e00\u8d77\u50f5\u4f4f\u3002\u5e93\u5b58\u90a3\u884c\u88ab\u9501\u4f4f&#xff0c;\u522b\u7684\u5355\u5168\u5361\u6b7b\u3002<\/li>\n<li>\u5355\u70b9 &#043; \u8111\u88c2&#xff1a;\u534f\u8c03\u8005\u662f\u5355\u70b9\u3002\u5b83\u5728\u201c\u5199\u5b8c commit \u65e5\u5fd7\u4f46\u8fd8\u6ca1\u5168\u53d1\u51fa\u53bb\u201d\u65f6\u6302\u4e86&#xff0c;\u91cd\u542f\u540e\u600e\u4e48\u77e5\u9053\u4e4b\u524d\u51b3\u5b9a\u4e86\u5565&#xff1f;\u9760\u6062\u590d\u65e5\u5fd7\u95ee\u3002\u4f46\u5982\u679c\u7f51\u7edc\u5206\u533a&#xff0c;\u4e00\u534a\u4eba\u6536\u5230 commit\u3001\u4e00\u534a\u4eba\u6ca1\u6536\u5230&#xff0c;\u4e24\u8fb9\u6570\u636e\u5c31\u5206\u53c9\u4e86\u3002<\/li>\n<p>\u751f\u4ea7\u8840\u6cea&#xff1a;MySQL \u7684 XA &#043; \u8de8\u5e93\u4e8b\u52a1&#xff0c;prepare \u540e\u8fde\u63a5\u65ad\u4e86&#xff0c;\u90a3\u4e2a prepare \u7684\u4e8b\u52a1\u4f1a\u4e00\u76f4\u5360\u7740\u9501&#xff0c;SHOW ENGINE INNODB STATUS \u91cc\u80fd\u770b\u5230\u4e00\u5927\u5806 PREPARED \u60ac\u7740&#xff0c;DBA \u534a\u591c\u88ab\u53eb\u8d77\u6765 XA RECOVER &#043; \u624b\u5de5 XA COMMIT\/ROLLBACK\u3002\u7528\u8fc7\u7684\u4eba\u90fd\u61c2\u3002<\/p>\n<h4>4.2 XA \u4e0e JTA&#xff1a;Java \u4e16\u754c\u7684 2PC \u6807\u51c6\u4ef6<\/h4>\n<p>XA \u662f X\/Open \u5b9a\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u63a5\u53e3&#xff0c;JTA \u662f Java \u5bf9\u5b83\u7684\u5c01\u88c5\u3002\u89d2\u8272\u5206\u4e09\u4e2a&#xff1a;AP&#xff08;\u4f60\u7684\u4e1a\u52a1\u4ee3\u7801&#xff09;\u3001TM&#xff08;Transaction Manager&#xff0c;\u534f\u8c03\u8005&#xff0c;\u5982 Atomikos\u3001Narayana&#xff09;\u3001RM&#xff08;Resource Manager&#xff0c;\u5404\u6570\u636e\u5e93&#xff09;\u3002<\/p>\n<p><span class=\"token comment\">\/\/ JTA \u5199\u8d77\u6765\u5f88\u723d&#xff0c;\u8ddf\u672c\u5730\u4e8b\u52a1\u51e0\u4e4e\u4e00\u6837<\/span><br \/>\n<span class=\"token class-name\">UserTransaction<\/span> utx <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">UserTransaction<\/span><span class=\"token punctuation\">)<\/span> ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">lookup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;java:comp\/UserTransaction&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nutx<span class=\"token punctuation\">.<\/span><span class=\"token function\">begin<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\norderDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insert<\/span><span class=\"token punctuation\">(<\/span>order<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5e931&#xff0c;\u81ea\u52a8 enlist \u4e3a\u5206\u652f<\/span><br \/>\naccountDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">deduct<\/span><span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u5e932&#xff0c;\u81ea\u52a8 enlist \u4e3a\u5206\u652f<\/span><br \/>\nutx<span class=\"token punctuation\">.<\/span><span class=\"token function\">commit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                <span class=\"token comment\">\/\/ TM \u66ff\u4f60\u8dd1\u5b8c 2PC<\/span><\/p>\n<p>\u723d\u7684\u4ee3\u4ef7\u662f&#xff1a;\u6240\u6709 RM \u5fc5\u987b\u662f\u652f\u6301 XA \u7684\u5173\u7cfb\u5e93&#xff0c;TM \u548c RM \u4e4b\u95f4\u957f\u8fde\u63a5&#xff0c;\u9501\u6301\u6709\u65f6\u95f4 &#061; \u4e24\u6b21\u7f51\u7edc\u5f80\u8fd4 &#043; \u4e1a\u52a1\u6267\u884c\u65f6\u95f4\u3002\u5fae\u670d\u52a1\u65f6\u4ee3\u670d\u52a1\u4e4b\u95f4\u662f HTTP&#xff0c;\u4e0d\u662f\u6570\u636e\u5e93\u76f4\u8fde&#xff0c;XA \u63d2\u4e0d\u8fdb\u53bb\u3002\u6240\u4ee5 XA \u5728\u5355\u4f53 &#043; \u591a\u5e93\u3001\u540c\u673a\u623f\u573a\u666f\u8fd8\u80fd\u6253&#xff0c;\u8de8\u670d\u52a1\u3001\u8de8\u516c\u7f51\u57fa\u672c\u51fa\u5c40\u3002<\/p>\n<h4>4.3 3PC&#xff1a;\u60f3\u89e3\u51b3\u963b\u585e&#xff0c;\u7ed3\u679c\u5f15\u5165\u66f4\u591a\u5751<\/h4>\n<p>3PC \u52a0\u4e86\u4e2a CanCommit \u8be2\u95ee\u9636\u6bb5\u548c\u8d85\u65f6\u81ea\u52a8 abort&#xff0c;\u60f3\u8ba9\u53c2\u4e0e\u8005\u5728\u534f\u8c03\u8005\u6302\u4e86\u65f6\u80fd\u81ea\u5df1\u8d85\u65f6\u91ca\u653e\u9501\u3002\u7406\u8bba\u4e0a\u51cf\u5c11\u963b\u585e&#xff0c;\u5b9e\u9645\u4e0a&#xff1a;<\/p>\n<ul>\n<li>\u591a\u4e86\u4e00\u6b21\u7f51\u7edc\u5f80\u8fd4&#xff0c;\u5ef6\u8fdf\u66f4\u9ad8\u3002<\/li>\n<li>\u8d85\u65f6\u81ea\u52a8 abort \u4f1a\u548c\u534f\u8c03\u8005\u7684 commit \u51b3\u5b9a\u5206\u53c9&#xff08;\u53c2\u4e0e\u8005\u8d85\u65f6\u81ea\u6740\u4e86&#xff0c;\u534f\u8c03\u8005\u5176\u5b9e\u60f3\u63d0\u4ea4&#xff09;&#xff0c;\u4e00\u81f4\u6027\u53cd\u800c\u66f4\u5dee\u3002<\/li>\n<li>\u4f9d\u7136\u89e3\u51b3\u4e0d\u4e86\u5206\u533a\u4e0b\u7684\u8111\u88c2\u3002<\/li>\n<\/ul>\n<p>\u6240\u4ee5 3PC \u57fa\u672c\u53ea\u6d3b\u5728\u6559\u79d1\u4e66\u91cc&#xff0c;\u5de5\u4e1a\u754c\u6ca1\u4eba\u7528\u3002\u8bb0\u4f4f\u7ed3\u8bba\u5c31\u884c&#xff1a;\u60f3\u9760\u52a0\u9636\u6bb5\u89e3\u51b3 2PC \u7684\u963b\u585e&#xff0c;\u662f\u6b7b\u80e1\u540c&#xff0c;\u771f\u6b63\u7684\u51fa\u8def\u662f\u6362\u601d\u8def&#xff08;Paxos\/Raft \u5171\u8bc6&#xff09;\u6216\u964d\u8981\u6c42&#xff08;Saga\/\u6d88\u606f\u6700\u7ec8\u4e00\u81f4&#xff09;\u3002<\/p>\n<h4>4.4 \u6570\u636e\u6d41\u56fe&#xff1a;2PC \u7684\u65e5\u5fd7\u5148\u884c<\/h4>\n<p>2PC \u6b63\u786e\u6027\u7684\u547d\u6839\u5b50\u662f\u201c\u65e5\u5fd7\u5148\u884c\u201d&#xff1a;\u534f\u8c03\u8005\u5728\u53d1 commit \u524d\u5fc5\u987b\u5148\u628a\u51b3\u5b9a\u843d\u76d8&#xff0c;\u53c2\u4e0e\u8005\u5728\u56de YES \u524d\u5fc5\u987b\u628a undo\/redo \u843d\u76d8\u3002\u8fd9\u6837\u4efb\u4f55\u4e00\u65b9\u6302\u4e86\u91cd\u542f&#xff0c;\u90fd\u80fd\u4ece\u76d8\u91cc\u627e\u56de\u51b3\u5b9a\u3002<\/p>\n<p>#mermaid-svg-hBjdKwRmvN8A0xzt{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hBjdKwRmvN8A0xzt .error-icon{fill:#552222;}#mermaid-svg-hBjdKwRmvN8A0xzt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hBjdKwRmvN8A0xzt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hBjdKwRmvN8A0xzt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hBjdKwRmvN8A0xzt .marker.cross{stroke:#333333;}#mermaid-svg-hBjdKwRmvN8A0xzt svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hBjdKwRmvN8A0xzt p{margin:0;}#mermaid-svg-hBjdKwRmvN8A0xzt .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster-label text{fill:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster-label span{color:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster-label span p{background-color:transparent;}#mermaid-svg-hBjdKwRmvN8A0xzt .label text,#mermaid-svg-hBjdKwRmvN8A0xzt span{fill:#333;color:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt .node rect,#mermaid-svg-hBjdKwRmvN8A0xzt .node circle,#mermaid-svg-hBjdKwRmvN8A0xzt .node ellipse,#mermaid-svg-hBjdKwRmvN8A0xzt .node polygon,#mermaid-svg-hBjdKwRmvN8A0xzt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hBjdKwRmvN8A0xzt .rough-node .label text,#mermaid-svg-hBjdKwRmvN8A0xzt .node .label text,#mermaid-svg-hBjdKwRmvN8A0xzt .image-shape .label,#mermaid-svg-hBjdKwRmvN8A0xzt .icon-shape .label{text-anchor:middle;}#mermaid-svg-hBjdKwRmvN8A0xzt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hBjdKwRmvN8A0xzt .rough-node .label,#mermaid-svg-hBjdKwRmvN8A0xzt .node .label,#mermaid-svg-hBjdKwRmvN8A0xzt .image-shape .label,#mermaid-svg-hBjdKwRmvN8A0xzt .icon-shape .label{text-align:center;}#mermaid-svg-hBjdKwRmvN8A0xzt .node.clickable{cursor:pointer;}#mermaid-svg-hBjdKwRmvN8A0xzt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hBjdKwRmvN8A0xzt .arrowheadPath{fill:#333333;}#mermaid-svg-hBjdKwRmvN8A0xzt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hBjdKwRmvN8A0xzt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hBjdKwRmvN8A0xzt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hBjdKwRmvN8A0xzt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hBjdKwRmvN8A0xzt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hBjdKwRmvN8A0xzt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster text{fill:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt .cluster span{color:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hBjdKwRmvN8A0xzt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hBjdKwRmvN8A0xzt rect.text{fill:none;stroke-width:0;}#mermaid-svg-hBjdKwRmvN8A0xzt .icon-shape,#mermaid-svg-hBjdKwRmvN8A0xzt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hBjdKwRmvN8A0xzt .icon-shape p,#mermaid-svg-hBjdKwRmvN8A0xzt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hBjdKwRmvN8A0xzt .icon-shape .label rect,#mermaid-svg-hBjdKwRmvN8A0xzt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hBjdKwRmvN8A0xzt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hBjdKwRmvN8A0xzt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hBjdKwRmvN8A0xzt :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"nodeLabel\"><\/p>\n<p>\u53c2\u4e0e\u8005 RM<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u534f\u8c03\u8005 TM<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5168 YES<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6709 NO\/\u8d85\u65f6<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>commit<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>rollback<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u8d85\u65f6\u6ca1\u6536\u5230<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5199 start \u65e5\u5fd7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53d1 prepare<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6536\u9f50 YES?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5237 commit \u65e5\u5fd7\u5230\u76d8\u518d\u53d1 commit<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5237 abort \u65e5\u5fd7\u518d\u53d1 rollback<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6536 prepare<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5199 ready \u65e5\u5fd7 &#043; \u5360\u9501<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u56de YES<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6536 commit?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u63d0\u4ea4 &#043; \u5199 commit \u65e5\u5fd7<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7528 undo \u56de\u6eda<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5361\u4f4f&#xff0c;\u5b9a\u65f6\u95ee\u534f\u8c03\u8005\u4e0d\u80fd\u64c5\u81ea\u51b3\u5b9a<\/p>\n<p><\/span><\/p>\n<hr \/>\n<h3>5. \u5171\u8bc6\u6d3e&#xff1a;Paxos\u3001Raft \u4e0e\u6570\u636e\u5e93\u539f\u751f\u5206\u5e03\u5f0f\u4e8b\u52a1<\/h3>\n<p>2PC \u662f\u201c\u8001\u5927\u8bf4\u4e86\u7b97\u201d&#xff0c;\u8001\u5927\u6302\u4e86\u5168\u5b8c\u3002\u5171\u8bc6\u7b97\u6cd5&#xff08;Paxos\/Raft&#xff09;\u662f\u201c\u591a\u6570\u6d3e\u8bf4\u4e86\u7b97\u201d&#xff0c;\u6302\u6389\u5c11\u6570\u8fd8\u80fd\u6d3b\u3002\u8fd9\u662f\u4e24\u6761\u5b8c\u5168\u4e0d\u540c\u7684\u6280\u672f\u7ebf&#xff0c;\u522b\u641e\u6df7&#xff1a;2PC \u7ba1\u201c\u539f\u5b50\u63d0\u4ea4\u201d&#xff0c;\u5171\u8bc6\u7ba1\u201c\u591a\u526f\u672c\u9009\u4e3b\u4e0e\u65e5\u5fd7\u590d\u5236\u201d\u3002Spanner \u8fd9\u7c7b NewSQL \u5389\u5bb3\u5728\u628a\u4e24\u8005\u62fc\u8d77\u6765\u4e86\u3002<\/p>\n<h4>5.1 \u4e3a\u4ec0\u4e48\u9700\u8981\u5171\u8bc6&#xff1a;\u4e24\u5c06\u519b\u95ee\u9898\u4e0e FLP<\/h4>\n<p>\u4e24\u5c06\u519b\u95ee\u9898\u8bc1\u660e\u4e86&#xff1a;\u5728\u4e0d\u53ef\u9760\u7f51\u7edc\u4e0a&#xff0c;\u6ca1\u6709\u201c\u4e24\u4eba\u540c\u65f6\u786e\u4fe1\u5bf9\u65b9\u4f1a\u8fdb\u653b\u201d\u7684\u786e\u5b9a\u6027\u534f\u8bae\u3002FLP \u4e0d\u53ef\u80fd\u5b9a\u7406\u66f4\u72e0&#xff1a;\u5728\u5f02\u6b65\u7f51\u7edc &#043; \u5bb9\u5fcd\u4e00\u4e2a crash \u8282\u70b9\u65f6&#xff0c;\u4e0d\u5b58\u5728\u540c\u65f6\u4fdd\u8bc1\u5b89\u5168\u6027\u548c\u6d3b\u6027\u7684\u786e\u5b9a\u6027\u5171\u8bc6\u3002\u5de5\u7a0b\u7ffb\u8bd1&#xff1a;\u522b\u60f3\u9020\u4e00\u4e2a\u53c8\u5feb\u3001\u53c8\u51c6\u3001\u53c8\u4e0d\u6015\u6302\u7684\u5b8c\u7f8e\u534f\u8bae&#xff0c;\u53ea\u80fd\u5728\u8d85\u65f6\u3001\u91cd\u8bd5\u3001\u591a\u6570\u6d3e\u4e4b\u95f4\u627e\u5e73\u8861\u3002<\/p>\n<p>Raft \u5c31\u662f\u8fd9\u4e2a\u5e73\u8861\u7684\u4f18\u96c5\u5b9e\u73b0&#xff1a;Leader \u9009\u4e3e &#043; \u65e5\u5fd7\u590d\u5236 &#043; \u591a\u6570\u6d3e\u63d0\u4ea4\u3002\u5199\u8bf7\u6c42\u53ea\u6253\u7ed9 Leader&#xff0c;Leader \u628a log \u53d1\u7ed9 Follower&#xff0c;\u8fc7\u534a ack \u5c31\u7b97\u63d0\u4ea4&#xff0c;\u518d\u5f02\u6b65\u5e94\u7528\u3002\u8fd9\u4fdd\u8bc1\u4e86\u5373\u4f7f\u6302\u6389\u5c11\u6570\u8282\u70b9&#xff0c;\u5df2\u63d0\u4ea4\u7684\u4e0d\u4e22\u3001\u987a\u5e8f\u4e0d\u4e71\u3002<\/p>\n<p>#mermaid-svg-6v3HYJS3AWeMgv1d{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6v3HYJS3AWeMgv1d .error-icon{fill:#552222;}#mermaid-svg-6v3HYJS3AWeMgv1d .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6v3HYJS3AWeMgv1d .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6v3HYJS3AWeMgv1d .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6v3HYJS3AWeMgv1d .marker.cross{stroke:#333333;}#mermaid-svg-6v3HYJS3AWeMgv1d svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6v3HYJS3AWeMgv1d p{margin:0;}#mermaid-svg-6v3HYJS3AWeMgv1d .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster-label text{fill:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster-label span{color:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster-label span p{background-color:transparent;}#mermaid-svg-6v3HYJS3AWeMgv1d .label text,#mermaid-svg-6v3HYJS3AWeMgv1d span{fill:#333;color:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d .node rect,#mermaid-svg-6v3HYJS3AWeMgv1d .node circle,#mermaid-svg-6v3HYJS3AWeMgv1d .node ellipse,#mermaid-svg-6v3HYJS3AWeMgv1d .node polygon,#mermaid-svg-6v3HYJS3AWeMgv1d .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6v3HYJS3AWeMgv1d .rough-node .label text,#mermaid-svg-6v3HYJS3AWeMgv1d .node .label text,#mermaid-svg-6v3HYJS3AWeMgv1d .image-shape .label,#mermaid-svg-6v3HYJS3AWeMgv1d .icon-shape .label{text-anchor:middle;}#mermaid-svg-6v3HYJS3AWeMgv1d .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6v3HYJS3AWeMgv1d .rough-node .label,#mermaid-svg-6v3HYJS3AWeMgv1d .node .label,#mermaid-svg-6v3HYJS3AWeMgv1d .image-shape .label,#mermaid-svg-6v3HYJS3AWeMgv1d .icon-shape .label{text-align:center;}#mermaid-svg-6v3HYJS3AWeMgv1d .node.clickable{cursor:pointer;}#mermaid-svg-6v3HYJS3AWeMgv1d .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6v3HYJS3AWeMgv1d .arrowheadPath{fill:#333333;}#mermaid-svg-6v3HYJS3AWeMgv1d .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6v3HYJS3AWeMgv1d .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6v3HYJS3AWeMgv1d .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6v3HYJS3AWeMgv1d .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6v3HYJS3AWeMgv1d .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6v3HYJS3AWeMgv1d .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster text{fill:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d .cluster span{color:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6v3HYJS3AWeMgv1d .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6v3HYJS3AWeMgv1d rect.text{fill:none;stroke-width:0;}#mermaid-svg-6v3HYJS3AWeMgv1d .icon-shape,#mermaid-svg-6v3HYJS3AWeMgv1d .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6v3HYJS3AWeMgv1d .icon-shape p,#mermaid-svg-6v3HYJS3AWeMgv1d .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6v3HYJS3AWeMgv1d .icon-shape .label rect,#mermaid-svg-6v3HYJS3AWeMgv1d .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6v3HYJS3AWeMgv1d .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6v3HYJS3AWeMgv1d .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6v3HYJS3AWeMgv1d :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"nodeLabel\"><\/p>\n<p>Raft \u7ec4&#xff1a;3 \u8282\u70b9&#xff0c;\u6302 1 \u4e2a\u8fd8\u80fd\u6d3b<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>AppendEntrieslog[x&#061;1]<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>AppendEntries<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u8fc7\u534a 2\/3 \u5373\u63d0\u4ea4\u518d\u5f02\u6b65\u901a\u77e5<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5ba2\u6237\u7aef\u5199 x&#061;1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Leader\u5199\u672c\u5730 log\u4efb\u671f term&#061;5<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Follower 1ack<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Follower 2ack<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u72b6\u6001\u673a\u5e94\u7528<\/p>\n<p><\/span><\/p>\n<p>Raft \u548c 2PC \u957f\u5f97\u5f88\u50cf&#xff08;\u90fd\u662f\u4e24\u9636\u6bb5&#xff09;&#xff0c;\u4f46\u7075\u9b42\u4e0d\u540c&#xff1a;Raft \u7684\u591a\u6570\u6d3e &#043; Leader \u9009\u4e3e\u89e3\u51b3\u4e86 2PC \u7684\u5355\u70b9\u963b\u585e&#xff0c;\u4ee3\u4ef7\u662f\u53ea\u4fdd\u8bc1\u5355\u7ec4\u65e5\u5fd7\u6709\u5e8f&#xff0c;\u4e0d\u7ba1\u8de8\u5206\u7247\u7684\u539f\u5b50\u6027\u3002\u8de8\u5206\u7247\u8fd8\u5f97 2PC \u6765\u51d1\u2014\u2014\u8fd9\u5c31\u662f Spanner \u5e72\u7684\u4e8b\u3002<\/p>\n<h4>5.2 Spanner&#xff1a;\u7528\u539f\u5b50\u949f\u628a\u5206\u5e03\u5f0f\u53d8\u6210\u5355\u673a<\/h4>\n<p>Google Spanner \u7684\u601d\u8def\u9738\u9053&#xff1a;\u65e2\u7136\u5206\u5e03\u5f0f\u7f3a\u5168\u5c40\u65f6\u949f&#xff0c;\u6211\u76f4\u63a5\u4e0a\u786c\u4ef6\u2014\u2014\u6bcf\u4e2a\u6570\u636e\u4e2d\u5fc3\u914d GPS &#043; \u539f\u5b50\u949f&#xff0c;\u9020\u51fa TrueTime&#xff08;\u4e00\u4e2a\u65f6\u95f4\u533a\u95f4 [earliest, latest]&#xff0c;\u4fdd\u8bc1\u771f\u5b9e\u65f6\u95f4\u4e00\u5b9a\u843d\u5728\u91cc\u9762&#xff09;\u3002\u4e8b\u52a1\u63d0\u4ea4\u65f6\u62ff\u4e2a\u65f6\u95f4\u6233&#xff0c;Committer \u7b49\u5230 latest \u8fc7\u53bb\u4e86\u518d\u5bf9\u5916\u53ef\u89c1&#xff0c;\u5c31\u4fdd\u8bc1\u4e86\u5168\u5c40\u6709\u5e8f\u3002\u8de8\u5206\u7247\u7528 2PC&#xff0c;\u6bcf\u5206\u7247\u5185\u90e8\u7528 Paxos \u590d\u5236\u3002<\/p>\n<p>\u6548\u679c\u662f&#xff1a;\u5bf9\u5916\u66b4\u9732\u7684\u5c31\u662f\u5355\u673a\u8bed\u4e49\u7684 SERIALIZABLE&#xff0c;\u7a0b\u5e8f\u5458\u4e0d\u7528\u5199\u8865\u507f\u3002\u4ee3\u4ef7\u662f&#xff1a;\u4f60\u5f97\u6709 Google \u7684\u673a\u623f\u548c\u539f\u5b50\u949f&#xff0c;\u800c\u4e14\u5199\u5ef6\u8fdf\u91cc\u6709\u4e2a commit wait&#xff08;\u4e00\u822c\u51e0\u6beb\u79d2\u5230\u5341\u51e0\u6beb\u79d2&#xff09;\u3002\u56fd\u5185 TiDB\u3001OceanBase \u5b66\u7684\u662f\u5b83\u7684\u8f6f\u4ef6\u7248&#xff1a;\u7528 TSO&#xff08;\u4e2d\u5fc3\u6388\u65f6&#xff09;\u4ee3\u66ff\u539f\u5b50\u949f&#xff0c;PD\/\u65f6\u949f\u670d\u52a1\u53d1\u5168\u5c40\u9012\u589e\u65f6\u95f4\u6233&#xff0c;\u539f\u7406\u76f8\u901a&#xff0c;\u7cbe\u5ea6\u548c\u6210\u672c\u505a\u4e86\u6298\u4e2d\u3002<\/p>\n<h4>5.3 Percolator \u4e0e Calvin&#xff1a;\u4e24\u79cd\u622a\u7136\u4e0d\u540c\u7684\u539f\u751f\u8def\u7ebf<\/h4>\n<ul>\n<li>Percolator&#xff08;TiDB \u7528\u7684\u5c31\u662f\u5b83&#xff0c;\u6e90\u81ea Google \u5904\u7406\u6d77\u91cf\u7f51\u9875\u7684\u4e8b\u52a1\u5c42&#xff09;&#xff1a;BigTable \u4e0a\u53e0\u52a0\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u3002\u6838\u5fc3\u662f\u4e24\u9636\u6bb5 &#043; \u5168\u5c40 TSO &#043; \u4e3b\u9501&#xff08;primary lock&#xff09;&#043; \u60ac\u6302\u6e05\u7406&#xff08;\u628a\u9501\u5e26\u4e0a\u8d85\u65f6&#xff0c;\u522b\u7684\u4e8b\u52a1\u80fd\u5e2e\u5fd9\u6eda\u6389\u8d85\u65f6\u9501&#xff09;\u3002\u8bfb\u7528\u5feb\u7167\u8bfb&#xff0c;\u5199\u7528\u4e24\u9636\u6bb5\u63d0\u4ea4\u3002\u597d\u5904\u662f\u5bf9\u4e1a\u52a1\u900f\u660e&#xff0c;\u574f\u5904\u662f\u8de8\u8282\u70b9 2PC \u5ef6\u8fdf\u9ad8&#xff0c;\u51b2\u7a81\u91cd\u8bd5\u591a\u3002<\/li>\n<li>Calvin&#xff08; deterministic \u786e\u5b9a\u6027\u8c03\u5ea6&#xff09;&#xff1a;\u6362\u4e2a\u8111\u56de\u8def\u2014\u2014\u6267\u884c\u524d\u5148\u628a\u4e00\u6279\u4e8b\u52a1\u6309\u5168\u5c40\u987a\u5e8f\u6392\u597d\u961f&#xff0c;\u6240\u6709\u526f\u672c\u6309\u540c\u4e00\u987a\u5e8f\u8dd1&#xff0c;\u5c31\u4e0d\u9700\u8981\u8fd0\u884c\u65f6\u52a0\u9501\u548c\u4e24\u9636\u6bb5\u4e86\u3002\u9002\u5408\u9ad8\u4e89\u7528\u3001\u903b\u8f91\u53ef\u9884\u5224\u7684\u573a\u666f&#xff08;\u5982\u62a2\u7968\u3001\u652f\u4ed8&#xff09;&#xff0c;\u4f46\u8981\u6c42\u4e8b\u52a1\u903b\u8f91\u4e8b\u5148\u53ef\u77e5&#xff0c;\u4e0d\u652f\u6301\u4ea4\u4e92\u5f0f\u4e8b\u52a1\u548c\u975e\u786e\u5b9a\u6027\u64cd\u4f5c\u3002<\/li>\n<\/ul>\n<p>#mermaid-svg-w5zewF0nDKD57RS0{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w5zewF0nDKD57RS0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w5zewF0nDKD57RS0 .error-icon{fill:#552222;}#mermaid-svg-w5zewF0nDKD57RS0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w5zewF0nDKD57RS0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w5zewF0nDKD57RS0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w5zewF0nDKD57RS0 .marker.cross{stroke:#333333;}#mermaid-svg-w5zewF0nDKD57RS0 svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w5zewF0nDKD57RS0 p{margin:0;}#mermaid-svg-w5zewF0nDKD57RS0 .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-w5zewF0nDKD57RS0 .cluster-label text{fill:#333;}#mermaid-svg-w5zewF0nDKD57RS0 .cluster-label span{color:#333;}#mermaid-svg-w5zewF0nDKD57RS0 .cluster-label span p{background-color:transparent;}#mermaid-svg-w5zewF0nDKD57RS0 .label text,#mermaid-svg-w5zewF0nDKD57RS0 span{fill:#333;color:#333;}#mermaid-svg-w5zewF0nDKD57RS0 .node rect,#mermaid-svg-w5zewF0nDKD57RS0 .node circle,#mermaid-svg-w5zewF0nDKD57RS0 .node ellipse,#mermaid-svg-w5zewF0nDKD57RS0 .node polygon,#mermaid-svg-w5zewF0nDKD57RS0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-w5zewF0nDKD57RS0 .rough-node .label text,#mermaid-svg-w5zewF0nDKD57RS0 .node .label text,#mermaid-svg-w5zewF0nDKD57RS0 .image-shape .label,#mermaid-svg-w5zewF0nDKD57RS0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-w5zewF0nDKD57RS0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-w5zewF0nDKD57RS0 .rough-node .label,#mermaid-svg-w5zewF0nDKD57RS0 .node .label,#mermaid-svg-w5zewF0nDKD57RS0 .image-shape .label,#mermaid-svg-w5zewF0nDKD57RS0 .icon-shape .label{text-align:center;}#mermaid-svg-w5zewF0nDKD57RS0 .node.clickable{cursor:pointer;}#mermaid-svg-w5zewF0nDKD57RS0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-w5zewF0nDKD57RS0 .arrowheadPath{fill:#333333;}#mermaid-svg-w5zewF0nDKD57RS0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-w5zewF0nDKD57RS0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-w5zewF0nDKD57RS0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w5zewF0nDKD57RS0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-w5zewF0nDKD57RS0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w5zewF0nDKD57RS0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-w5zewF0nDKD57RS0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-w5zewF0nDKD57RS0 .cluster text{fill:#333;}#mermaid-svg-w5zewF0nDKD57RS0 .cluster span{color:#333;}#mermaid-svg-w5zewF0nDKD57RS0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-w5zewF0nDKD57RS0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-w5zewF0nDKD57RS0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-w5zewF0nDKD57RS0 .icon-shape,#mermaid-svg-w5zewF0nDKD57RS0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w5zewF0nDKD57RS0 .icon-shape p,#mermaid-svg-w5zewF0nDKD57RS0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-w5zewF0nDKD57RS0 .icon-shape .label rect,#mermaid-svg-w5zewF0nDKD57RS0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w5zewF0nDKD57RS0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-w5zewF0nDKD57RS0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-w5zewF0nDKD57RS0 :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"nodeLabel\"><\/p>\n<p>Calvin&#xff1a;\u5148\u6392\u961f&#xff0c;\u518d\u6267\u884c<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>1.  sequencing \u5c42\u628a\u4e8b\u52a1\u6392\u6210\u5168\u5c40\u6709\u5e8f batch<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>2. \u5e7f\u64ad\u7ed9\u6240\u6709\u526f\u672c<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>3. \u5404\u526f\u672c\u6309\u540c\u4e00\u987a\u5e8f\u786e\u5b9a\u6027\u91cd\u653e&#xff0c;\u65e0\u9501<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Percolator&#xff1a;\u5148\u62ff\u53f7&#xff0c;\u518d\u4e24\u9636\u6bb5<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>1. \u62ff start_ts\u5feb\u7167\u8bfb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>2. \u9884\u5199&#xff1a;\u5199 data &#043; \u5199\u9501\u9009\u4e00\u884c\u5f53 primary<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>3. \u62ff commit_ts\u63d0\u4ea4 primary<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>4. \u5f02\u6b65\u63d0\u4ea4 secondary\u6302\u4e86\u522b\u4eba\u53ef\u5e2e\u5fd9\u6e05\u9501<\/p>\n<p><\/span><\/p>\n<p>\u5c0f\u7ed3&#xff1a;\u5982\u679c\u4f60\u80fd\u6362\u5e93&#xff08;TiDB\/OceanBase\/CockroachDB&#xff09;&#xff0c;\u4f18\u5148\u7528\u6570\u636e\u5e93\u539f\u751f\u5206\u5e03\u5f0f\u4e8b\u52a1&#xff0c;\u4e1a\u52a1\u4ee3\u7801\u51e0\u4e4e\u4e0d\u7528\u6539\u3002\u8fd9\u662f\u6027\u4ef7\u6bd4\u6700\u9ad8\u7684\u201c\u5f3a\u4e00\u81f4\u201d&#xff0c;\u524d\u63d0\u662f\u4e1a\u52a1\u80fd\u63a5\u53d7\u90a3\u51e0\u6beb\u79d2\u5230\u51e0\u5341\u6beb\u79d2\u7684\u63d0\u4ea4\u5ef6\u8fdf\u548c\u7279\u5b9a\u7684\u90e8\u7f72\u6210\u672c\u3002<\/p>\n<hr \/>\n<h3>6. \u67d4\u6027\u6d3e\u767b\u573a&#xff1a;TCC\u3001Saga \u4e0e\u6d88\u606f\u6700\u7ec8\u4e00\u81f4<\/h3>\n<p>\u4e92\u8054\u7f51\u4e3b\u6d41\u5176\u5b9e\u662f\u67d4\u6027\u6d3e&#xff1a;\u627f\u8ba4\u7f51\u7edc\u4f1a\u51fa\u95ee\u9898&#xff0c;\u4e0d\u8ffd\u6c42\u201c\u6b64\u523b\u4e00\u81f4\u201d&#xff0c;\u8ffd\u6c42\u201c\u6700\u7ec8\u8d26\u5e73 &#043; \u53ef\u67e5 &#043; \u53ef\u8865\u201d\u3002\u4e09\u5251\u5ba2\u662f TCC\u3001Saga\u3001\u6d88\u606f\u4e8b\u52a1&#xff0c;\u6328\u4e2a\u62c6\u3002<\/p>\n<h4>6.1 TCC&#xff1a;\u628a\u4e1a\u52a1\u62c6\u6210 Try-Confirm-Cancel<\/h4>\n<p>TCC \u662f 2PC \u7684\u4e1a\u52a1\u7248&#xff1a;\u628a\u6bcf\u4e2a\u672c\u5730\u4e8b\u52a1\u62c6\u6210\u4e09\u4e2a\u5e42\u7b49\u65b9\u6cd5\u3002Try \u505a\u8d44\u6e90\u9884\u7559&#xff08;\u51bb\u7ed3&#xff09;&#xff0c;Confirm \u505a\u771f\u6b63\u6263\u51cf&#xff0c;Cancel \u505a\u91ca\u653e\u3002\u534f\u8c03\u8005\u5148\u8c03\u6240\u6709 Try&#xff0c;\u5168\u6210\u8c03 Confirm&#xff0c;\u6709\u4e00\u4e2a\u5931\u8d25\u8c03 Cancel\u3002<\/p>\n<p>\u7ecf\u5178\u4f8b\u5b50&#xff1a;A \u7ed9 B \u8f6c 100\u3002Try \u9636\u6bb5\u51bb\u7ed3 A \u7684 100&#xff08;frozen &#043;&#061; 100&#xff0c;\u53ef\u7528\u4f59\u989d\u51cf\u5c11\u4f46\u8fd8\u6ca1\u6263&#xff09;&#xff0c;Confirm \u9636\u6bb5\u771f\u6b63\u6263\u6389\u51bb\u7ed3&#xff0c;Cancel \u9636\u6bb5\u89e3\u51bb\u3002<\/p>\n<p>B \u8d26\u6237\u670d\u52a1A \u8d26\u6237\u670d\u52a1\u4e8b\u52a1\u534f\u8c03\u8005B \u8d26\u6237\u670d\u52a1A \u8d26\u6237\u670d\u52a1\u4e8b\u52a1\u534f\u8c03\u8005#mermaid-svg-xuivBvwlTnG83Jpy{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xuivBvwlTnG83Jpy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xuivBvwlTnG83Jpy .error-icon{fill:#552222;}#mermaid-svg-xuivBvwlTnG83Jpy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xuivBvwlTnG83Jpy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xuivBvwlTnG83Jpy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xuivBvwlTnG83Jpy .marker.cross{stroke:#333333;}#mermaid-svg-xuivBvwlTnG83Jpy svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xuivBvwlTnG83Jpy p{margin:0;}#mermaid-svg-xuivBvwlTnG83Jpy .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xuivBvwlTnG83Jpy text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-xuivBvwlTnG83Jpy .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-xuivBvwlTnG83Jpy .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-xuivBvwlTnG83Jpy .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-xuivBvwlTnG83Jpy .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-xuivBvwlTnG83Jpy #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-xuivBvwlTnG83Jpy .sequenceNumber{fill:white;}#mermaid-svg-xuivBvwlTnG83Jpy #sequencenumber{fill:#333;}#mermaid-svg-xuivBvwlTnG83Jpy #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-xuivBvwlTnG83Jpy .messageText{fill:#333;stroke:none;}#mermaid-svg-xuivBvwlTnG83Jpy .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xuivBvwlTnG83Jpy .labelText,#mermaid-svg-xuivBvwlTnG83Jpy .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-xuivBvwlTnG83Jpy .loopText,#mermaid-svg-xuivBvwlTnG83Jpy .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-xuivBvwlTnG83Jpy .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-xuivBvwlTnG83Jpy .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-xuivBvwlTnG83Jpy .noteText,#mermaid-svg-xuivBvwlTnG83Jpy .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-xuivBvwlTnG83Jpy .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xuivBvwlTnG83Jpy .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xuivBvwlTnG83Jpy .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xuivBvwlTnG83Jpy .actorPopupMenu{position:absolute;}#mermaid-svg-xuivBvwlTnG83Jpy .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-xuivBvwlTnG83Jpy .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xuivBvwlTnG83Jpy .actor-man circle,#mermaid-svg-xuivBvwlTnG83Jpy line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-xuivBvwlTnG83Jpy :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}\u82e5\u4efb\u4e00 Try \u5931\u8d25&#xff0c;\u8d70 CancelTry&#xff1a;freeze(A,100)1Try&#xff1a;freeze_\u5165\u8d26\u989d\u5ea6(B,100)2Try \u6210\u529f3Try \u6210\u529f4Confirm&#xff1a;deduct(A,100)5Confirm&#xff1a;add(B,100)6OK7OK8<\/p>\n<p>TCC \u7684\u597d\u4e0e\u574f\u90fd\u5f88\u6781\u7aef\u3002\u597d\u5728&#xff1a;\u8d44\u6e90\u9884\u7559\u5728\u4e1a\u52a1\u5c42&#xff0c;\u9501\u7684\u662f\u4e1a\u52a1\u51bb\u7ed3\u5b57\u6bb5&#xff0c;\u4e0d\u662f\u6570\u636e\u5e93\u884c\u9501&#xff0c;\u5e76\u53d1\u9ad8&#xff1b;\u574f\u5728&#xff1a;\u4e1a\u52a1\u4fb5\u5165\u6781\u5f3a&#xff0c;\u6bcf\u4e2a\u64cd\u4f5c\u8981\u5199\u4e09\u4e2a\u65b9\u6cd5&#xff0c;\u8fd8\u8981\u5904\u7406\u4e09\u4e2a\u5927\u5751&#xff1a;<\/p>\n<li>\u5e42\u7b49&#xff1a;Confirm\/Cancel \u4f1a\u88ab\u91cd\u8bd5&#xff0c;\u5fc5\u987b if (already_done) return success\u3002<\/li>\n<li>\u7a7a\u56de\u6eda&#xff1a;Try \u8d85\u65f6\u4e86\u534f\u8c03\u8005\u4ee5\u4e3a\u5931\u8d25\u8d70\u4e86 Cancel&#xff0c;\u4f46 Try \u7684\u8bf7\u6c42\u5176\u5b9e\u8fd8\u5728\u8def\u4e0a&#xff0c;\u540e\u5230\u4e86\u3002Cancel \u5148\u6267\u884c\u4e86&#xff08;\u53d1\u73b0\u6ca1\u51bb\u7ed3\u8bb0\u5f55&#xff0c;\u76f4\u63a5\u8fd4\u56de\u6210\u529f&#xff09;&#xff0c;Try \u540e\u5230\u4e0d\u80fd\u771f\u51bb\u7ed3&#xff0c;\u5426\u5219\u94b1 frozen \u4f4f\u6ca1\u4eba\u89e3\u3002\u89e3\u6cd5&#xff1a;Cancel \u8981\u8bb0\u7a7a\u56de\u6eda\u65e5\u5fd7&#xff0c;Try \u5230\u65f6\u53d1\u73b0\u6709\u7a7a\u56de\u6eda\u6807\u8bb0&#xff0c;\u76f4\u63a5\u62d2\u7edd\u3002<\/li>\n<li>\u9632\u60ac\u6302&#xff1a;\u548c\u7a7a\u56de\u6eda\u662f\u4e00\u4f53\u4e24\u9762\u2014\u2014Try \u540e\u5230\u53d1\u73b0 Cancel \u5df2\u6267\u884c\u8fc7&#xff0c;\u5c31\u4e0d\u80fd\u518d\u6267\u884c\u4e1a\u52a1\u3002\u7528\u4e8b\u52a1\u72b6\u6001\u8868 &#043; \u4e1a\u52a1\u4e3b\u952e\u53bb\u91cd\u662f\u6807\u51c6\u89e3\u3002<\/li>\n<p><span class=\"token comment\">\/\/ TCC \u9632\u60ac\u6302 &#043; \u5e42\u7b49\u7684\u9aa8\u67b6&#xff0c;Seata\/HMily \u90fd\u662f\u8fd9\u4e2a\u5957\u8def<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Transactional<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">tryFreeze<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> xid<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">String<\/span> orderId<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">long<\/span> amount<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u67e5\u4e8b\u52a1\u72b6\u6001\u8868&#xff0c;\u6709 CANCEL \u6807\u8bb0\u8bf4\u660e\u7a7a\u56de\u6eda&#xff0c;\u76f4\u63a5\u62d2\u7edd<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>txLogDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">hasCancel<\/span><span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 2. \u5e42\u7b49&#xff1a;Try \u5df2\u6267\u884c\u8fc7\u76f4\u63a5\u8fd4\u56de<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>txLogDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">hasTry<\/span><span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 3. \u4e1a\u52a1&#xff1a;\u51bb\u7ed3<\/span><br \/>\n    accountDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">freeze<\/span><span class=\"token punctuation\">(<\/span>orderId<span class=\"token punctuation\">,<\/span> amount<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    txLogDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insertTry<\/span><span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> orderId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6240\u4ee5 TCC \u9002\u5408&#xff1a;\u5f3a\u4e00\u81f4\u8981\u6c42\u9ad8\u3001\u5e76\u53d1\u9ad8\u3001\u80fd\u63a5\u53d7\u4ee3\u7801\u6539\u9020\u7684\u6838\u5fc3\u8d44\u91d1\u94fe\u8def&#xff08;\u94f6\u884c\u3001\u652f\u4ed8&#xff09;\u3002\u4e00\u822c\u7684 CRUD \u4e1a\u52a1\u7528 TCC \u5c31\u662f\u5927\u70ae\u6253\u868a\u5b50\u3002<\/p>\n<h4>6.2 Saga&#xff1a;\u957f\u4e8b\u52a1\u62c6\u6b65&#xff0c;\u6bcf\u6b65\u914d\u8865\u507f<\/h4>\n<p>Saga \u662f 1987 \u5e74\u7684\u8001\u8bba\u6587&#xff0c;\u5fae\u670d\u52a1\u65f6\u4ee3\u7ffb\u7ea2\u3002\u601d\u60f3&#xff1a;\u628a\u957f\u4e8b\u52a1\u62c6\u6210 T1\u2192T2\u2192\u2026\u2192Tn&#xff0c;\u6bcf\u6b65\u90fd\u662f\u672c\u5730\u4e8b\u52a1&#xff0c;\u6bcf\u6b65\u914d\u4e00\u4e2a\u8865\u507f\u52a8\u4f5c C1\u2026Cn\u3002\u4efb\u4f55\u4e00\u6b65\u5931\u8d25&#xff0c;\u5c31\u5012\u7740\u6267\u884c\u5df2\u6210\u529f\u6b65\u9aa4\u7684\u8865\u507f\u3002<\/p>\n<p>\u5206\u4e24\u79cd\u5199\u6cd5&#xff1a;<\/p>\n<ul>\n<li>\u534f\u540c\u5f0f&#xff08;Choreography&#xff09;&#xff1a;\u6ca1\u4e2d\u592e\u534f\u8c03\u8005&#xff0c;\u6bcf\u6b65\u505a\u5b8c\u53d1\u4e8b\u4ef6&#xff0c;\u4e0b\u4e00\u6b65\u76d1\u542c\u4e8b\u4ef6\u89e6\u53d1\u3002\u53bb\u4e2d\u5fc3\u5316&#xff0c;\u4f46\u6d41\u7a0b\u6563\u5728\u5404\u5904&#xff0c;\u67e5\u95ee\u9898\u8981\u7ffb\u904d\u6240\u6709\u670d\u52a1\u7684\u65e5\u5fd7\u3002<\/li>\n<li>\u7f16\u6392\u5f0f&#xff08;Orchestration&#xff09;&#xff1a;\u6709\u4e2a Saga \u6267\u884c\u5668&#xff08; orchestrator&#xff09;\u62ff\u7740\u6d41\u7a0b\u5b9a\u4e49\u4e00\u6b65\u6b65\u8c03&#xff0c;\u5931\u8d25\u4e86\u6309\u8bb0\u5f55\u5012\u7740\u8865\u507f\u3002\u53ef\u89c2\u6d4b\u3001\u53ef\u91cd\u653e&#xff0c;\u751f\u4ea7\u63a8\u8350\u8fd9\u4e2a\u3002<\/li>\n<\/ul>\n<p>#mermaid-svg-YPjkPwUbWWAaMPuL{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YPjkPwUbWWAaMPuL .error-icon{fill:#552222;}#mermaid-svg-YPjkPwUbWWAaMPuL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YPjkPwUbWWAaMPuL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YPjkPwUbWWAaMPuL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YPjkPwUbWWAaMPuL .marker.cross{stroke:#333333;}#mermaid-svg-YPjkPwUbWWAaMPuL svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YPjkPwUbWWAaMPuL p{margin:0;}#mermaid-svg-YPjkPwUbWWAaMPuL .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster-label text{fill:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster-label span{color:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster-label span p{background-color:transparent;}#mermaid-svg-YPjkPwUbWWAaMPuL .label text,#mermaid-svg-YPjkPwUbWWAaMPuL span{fill:#333;color:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL .node rect,#mermaid-svg-YPjkPwUbWWAaMPuL .node circle,#mermaid-svg-YPjkPwUbWWAaMPuL .node ellipse,#mermaid-svg-YPjkPwUbWWAaMPuL .node polygon,#mermaid-svg-YPjkPwUbWWAaMPuL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YPjkPwUbWWAaMPuL .rough-node .label text,#mermaid-svg-YPjkPwUbWWAaMPuL .node .label text,#mermaid-svg-YPjkPwUbWWAaMPuL .image-shape .label,#mermaid-svg-YPjkPwUbWWAaMPuL .icon-shape .label{text-anchor:middle;}#mermaid-svg-YPjkPwUbWWAaMPuL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YPjkPwUbWWAaMPuL .rough-node .label,#mermaid-svg-YPjkPwUbWWAaMPuL .node .label,#mermaid-svg-YPjkPwUbWWAaMPuL .image-shape .label,#mermaid-svg-YPjkPwUbWWAaMPuL .icon-shape .label{text-align:center;}#mermaid-svg-YPjkPwUbWWAaMPuL .node.clickable{cursor:pointer;}#mermaid-svg-YPjkPwUbWWAaMPuL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YPjkPwUbWWAaMPuL .arrowheadPath{fill:#333333;}#mermaid-svg-YPjkPwUbWWAaMPuL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YPjkPwUbWWAaMPuL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YPjkPwUbWWAaMPuL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YPjkPwUbWWAaMPuL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YPjkPwUbWWAaMPuL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YPjkPwUbWWAaMPuL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster text{fill:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL .cluster span{color:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YPjkPwUbWWAaMPuL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YPjkPwUbWWAaMPuL rect.text{fill:none;stroke-width:0;}#mermaid-svg-YPjkPwUbWWAaMPuL .icon-shape,#mermaid-svg-YPjkPwUbWWAaMPuL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YPjkPwUbWWAaMPuL .icon-shape p,#mermaid-svg-YPjkPwUbWWAaMPuL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YPjkPwUbWWAaMPuL .icon-shape .label rect,#mermaid-svg-YPjkPwUbWWAaMPuL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YPjkPwUbWWAaMPuL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YPjkPwUbWWAaMPuL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YPjkPwUbWWAaMPuL :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"nodeLabel\"><\/p>\n<p>T3 \u5931\u8d25&#xff1a;\u5012\u7740\u8865\u507f C2 -&gt; C1<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>T3 \u5931\u8d25<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>C2&#xff1a;\u5e93\u5b58\u52a0\u56de\u53bb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>C1&#xff1a;\u8ba2\u5355\u7f6e\u53d6\u6d88<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Saga \u6b63\u5e38&#xff1a;T1 -&gt; T2 -&gt; T3<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>T1&#xff1a;\u521b\u8ba2\u5355C1&#xff1a;\u53d6\u6d88\u8ba2\u5355<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>T2&#xff1a;\u6263\u5e93\u5b58C2&#xff1a;\u56de\u8865\u5e93\u5b58<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>T3&#xff1a;\u6263\u6b3eC3&#xff1a;\u9000\u6b3e<\/p>\n<p><\/span><\/p>\n<p>Saga \u548c TCC \u7684\u533a\u522b\u4e00\u53e5\u8bdd&#xff1a;TCC \u662f\u201c\u5148\u51bb\u7ed3\u3001\u518d\u5b9e\u9524\u201d&#xff0c;Saga \u662f\u201c\u76f4\u63a5\u5e72\u3001\u9519\u4e86\u518d\u8d54\u201d\u3002Saga \u6ca1\u6709\u9884\u7559\u9636\u6bb5&#xff0c;\u4e2d\u95f4\u72b6\u6001\u662f\u5bf9\u5916\u53ef\u89c1\u7684&#xff08;\u8ba2\u5355\u5efa\u4e86\u3001\u5e93\u5b58\u6263\u4e86&#xff0c;\u94b1\u8fd8\u6ca1\u6263&#xff09;&#xff0c;\u6240\u4ee5 Saga \u4e0d\u9002\u5408\u5f3a\u9694\u79bb\u573a\u666f\u3002\u5b83\u7684\u8865\u507f\u4e5f\u4e0d\u662f\u56de\u6eda&#xff0c;\u800c\u662f\u201c\u4e1a\u52a1\u9006\u64cd\u4f5c\u201d&#xff0c;\u8bed\u4e49\u4e0a\u53ef\u80fd\u4e0d\u7b49\u4ef7&#xff08;\u9000\u6b3e\u662f\u518d\u8f6c\u4e00\u7b14&#xff0c;\u4e0d\u662f\u628a\u4e4b\u524d\u90a3\u7b14\u62b9\u6389&#xff09;\u3002<\/p>\n<p>Saga \u72b6\u6001\u673a\u957f\u8fd9\u6837&#xff0c;\u5199\u6846\u67b6\u7684\u4eba\u5fc5\u987b\u5403\u900f&#xff1a;<\/p>\n<p>#mermaid-svg-JbtUGAeGQqo0HUj6{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JbtUGAeGQqo0HUj6 .error-icon{fill:#552222;}#mermaid-svg-JbtUGAeGQqo0HUj6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JbtUGAeGQqo0HUj6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .marker.cross{stroke:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JbtUGAeGQqo0HUj6 p{margin:0;}#mermaid-svg-JbtUGAeGQqo0HUj6 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-JbtUGAeGQqo0HUj6 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-JbtUGAeGQqo0HUj6 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-JbtUGAeGQqo0HUj6 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-JbtUGAeGQqo0HUj6 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-JbtUGAeGQqo0HUj6 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-JbtUGAeGQqo0HUj6 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-JbtUGAeGQqo0HUj6 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JbtUGAeGQqo0HUj6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JbtUGAeGQqo0HUj6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JbtUGAeGQqo0HUj6 .edgeLabel .label text{fill:#333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .label div .edgeLabel{color:#333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-JbtUGAeGQqo0HUj6 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-JbtUGAeGQqo0HUj6 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-JbtUGAeGQqo0HUj6 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .cluster-label,#mermaid-svg-JbtUGAeGQqo0HUj6 .nodeLabel{color:#131300;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .note-edge{stroke-dasharray:5;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-note text{fill:black;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagram .edgeLabel{color:red;}#mermaid-svg-JbtUGAeGQqo0HUj6 #dependencyStart,#mermaid-svg-JbtUGAeGQqo0HUj6 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-JbtUGAeGQqo0HUj6 .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JbtUGAeGQqo0HUj6 :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>\u5f00\u59cb Saga<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u6267\u884c\u6b63\u5411 T_i<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>T_i \u6210\u529f&#xff0c;\u8bb0\u65e5\u5fd7<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>T_i \u5931\u8d25<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5012\u5e8f\u6267\u884c C_j\u6bcf\u4e2a\u8865\u507f\u53ef\u91cd\u8bd5<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u8865\u507f\u5b8c&#xff0c;\u8fdb\u7ec8\u6001<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u8865\u507f\u4e5f\u5931\u8d25\u8bb0\u6b7b\u4fe1&#xff0c;\u4eba\u5de5\u4ecb\u5165<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5168\u90e8 T \u6210\u529f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>Running<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Forward<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Compensating<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Compensated<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Failed_Need_Manual<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Succeed<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><\/p>\n<h4>6.3 \u53ef\u9760\u6d88\u606f\u6700\u7ec8\u4e00\u81f4&#xff1a;\u672c\u5730\u6d88\u606f\u8868\u3001Outbox \u4e0e MQ \u4e8b\u52a1\u6d88\u606f<\/h4>\n<p>\u8fd9\u662f\u56fd\u5185\u7528\u5f97\u6700\u591a\u7684\u8def\u7ebf&#xff0c;\u6838\u5fc3\u77db\u76fe\u53ea\u6709\u4e00\u4e2a&#xff1a;\u672c\u5730\u6570\u636e\u5e93\u63d0\u4ea4\u548c MQ \u53d1\u9001\u662f\u4e24\u4e2a\u7cfb\u7edf&#xff0c;\u505a\u4e0d\u5230\u539f\u5b50\u3002\u5148\u53d1\u6d88\u606f\u518d\u63d0\u4ea4&#xff0c;\u5e93\u6302\u4e86\u6d88\u606f\u53d1\u51fa\u53bb\u4e86&#xff1b;\u5148\u63d0\u4ea4\u518d\u53d1\u6d88\u606f&#xff0c;\u521a\u63d0\u4ea4\u5b8c\u673a\u5668\u6302\u4e86\u6d88\u606f\u6ca1\u53d1\u3002\u600e\u4e48\u529e&#xff1f;\u7b54\u6848\u662f\u628a\u201c\u53d1\u6d88\u606f\u201d\u4e5f\u53d8\u6210\u6570\u636e\u5e93\u7684\u4e00\u90e8\u5206\u3002<\/p>\n<p>\u8def\u7ebf A&#xff1a;\u672c\u5730\u6d88\u606f\u8868&#xff08;\u65e9\u671f\u505a\u6cd5&#xff09;<\/p>\n<p>\u4e1a\u52a1\u8868\u548c\u6d88\u606f\u8868\u5728\u540c\u4e00\u4e2a\u5e93\u3001\u540c\u4e00\u4e2a\u672c\u5730\u4e8b\u52a1\u91cc\u4e00\u8d77\u5199\u3002\u540e\u53f0\u7ebf\u7a0b\u626b\u6d88\u606f\u8868\u53d1 MQ&#xff0c;\u6536\u5230 ack \u5220\u6d88\u606f\u3002\u7b80\u5355\u7c97\u66b4&#xff0c;\u4f46\u8981\u4e1a\u52a1\u4fb5\u5165&#xff08;\u6bcf\u4e2a\u4e1a\u52a1\u90fd\u8981\u5199\u6d88\u606f\u8868&#xff09;&#xff0c;\u8fd8\u8981\u5904\u7406\u8f6e\u8be2\u538b\u529b\u3002<\/p>\n<p>\u8def\u7ebf B&#xff1a;Outbox &#043; CDC&#xff08;\u73b0\u5728\u7684\u4e3b\u6d41&#xff09;<\/p>\n<p>Outbox \u5c31\u662f\u628a\u672c\u5730\u6d88\u606f\u8868\u6807\u51c6\u5316&#xff1a;\u4e1a\u52a1\u53ea\u7ba1\u5199\u4e1a\u52a1\u8868 &#043; outbox \u8868&#xff08;\u540c\u4e00\u4e8b\u52a1&#xff09;&#xff0c;Debezium\/Canal \u76d1\u542c binlog \u628a outbox \u884c\u8f6c\u6210 MQ \u6d88\u606f&#xff0c;\u4e0b\u6e38\u6d88\u8d39\u3002\u4e1a\u52a1\u4ee3\u7801\u5e72\u51c0\u4e86&#xff0c;\u8f6e\u8be2\u538b\u529b\u4e5f\u6ca1\u4e86&#xff0c;\u9760 binlog \u7684\u6709\u5e8f\u6027\u4fdd\u8bc1\u6d88\u606f\u6709\u5e8f\u3002\u5f00\u9500\u662f\u591a\u8fd0\u4e00\u5957 CDC \u7ec4\u4ef6&#xff0c;\u8fd8\u8981\u5904\u7406 CDC \u5ef6\u8fdf\u548c\u91cd\u590d\u6295\u9012\u3002<\/p>\n<p>\u8def\u7ebf C&#xff1a;RocketMQ \u4e8b\u52a1\u6d88\u606f&#xff08;Half Message&#xff09;<\/p>\n<p>RocketMQ \u628a Outbox \u505a\u8fdb\u4e86 broker&#xff1a;\u5148\u53d1 half \u6d88\u606f&#xff08;\u5bf9\u6d88\u8d39\u8005\u4e0d\u53ef\u89c1&#xff09;&#xff0c;\u6267\u884c\u672c\u5730\u4e8b\u52a1&#xff0c;\u672c\u5730\u6210\u4e86\u53d1 commit \u8ba9\u6d88\u606f\u53ef\u89c1&#xff0c;\u6302\u4e86\u53d1 rollback \u5220\u6389\u3002broker \u8fd8\u4f1a\u53cd\u67e5\u957f\u65f6\u95f4\u6ca1\u51b3\u8bae\u7684 half \u6d88\u606f&#xff0c;\u95ee\u751f\u4ea7\u8005\u201c\u4f60\u5230\u5e95\u6210\u4e86\u6ca1\u201d\u3002\u65f6\u5e8f\u5982\u4e0b&#xff1a;<\/p>\n<p>\u672c\u5730\u5e93\u6d88\u8d39\u8005\u5e93\u5b58\/\u8bb0\u8d26\u670d\u52a1Broker\u751f\u4ea7\u8005\u8ba2\u5355\u670d\u52a1\u672c\u5730\u5e93\u6d88\u8d39\u8005\u5e93\u5b58\/\u8bb0\u8d26\u670d\u52a1Broker\u751f\u4ea7\u8005\u8ba2\u5355\u670d\u52a1#mermaid-svg-ejstt7U8bAeKGF9Y{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ejstt7U8bAeKGF9Y .error-icon{fill:#552222;}#mermaid-svg-ejstt7U8bAeKGF9Y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ejstt7U8bAeKGF9Y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ejstt7U8bAeKGF9Y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ejstt7U8bAeKGF9Y .marker.cross{stroke:#333333;}#mermaid-svg-ejstt7U8bAeKGF9Y svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ejstt7U8bAeKGF9Y p{margin:0;}#mermaid-svg-ejstt7U8bAeKGF9Y .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ejstt7U8bAeKGF9Y text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ejstt7U8bAeKGF9Y .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ejstt7U8bAeKGF9Y .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ejstt7U8bAeKGF9Y #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ejstt7U8bAeKGF9Y .sequenceNumber{fill:white;}#mermaid-svg-ejstt7U8bAeKGF9Y #sequencenumber{fill:#333;}#mermaid-svg-ejstt7U8bAeKGF9Y #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ejstt7U8bAeKGF9Y .messageText{fill:#333;stroke:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ejstt7U8bAeKGF9Y .labelText,#mermaid-svg-ejstt7U8bAeKGF9Y .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .loopText,#mermaid-svg-ejstt7U8bAeKGF9Y .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ejstt7U8bAeKGF9Y .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ejstt7U8bAeKGF9Y .noteText,#mermaid-svg-ejstt7U8bAeKGF9Y .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-ejstt7U8bAeKGF9Y .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ejstt7U8bAeKGF9Y .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ejstt7U8bAeKGF9Y .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ejstt7U8bAeKGF9Y .actorPopupMenu{position:absolute;}#mermaid-svg-ejstt7U8bAeKGF9Y .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-ejstt7U8bAeKGF9Y .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ejstt7U8bAeKGF9Y .actor-man circle,#mermaid-svg-ejstt7U8bAeKGF9Y line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ejstt7U8bAeKGF9Y :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}alt[\u672c\u5730\u6210\u529f][\u672c\u5730\u5931\u8d25][\u751f\u4ea7\u8005\u6302\u4e86\u6ca1\u51b3\u8bae]\u53d1 Half \u6d88\u606f&#xff08;\u4e0d\u53ef\u89c1&#xff09;1Half \u5b58\u597d2\u6267\u884c\u672c\u5730\u4e8b\u52a1\u521b\u8ba2\u5355 &#043; \u5199\u72b6\u60013commit&#xff08;\u8ba9\u6d88\u606f\u53ef\u89c1&#xff09;4\u6295\u9012\u6d88\u606f5\u6267\u884c\u672c\u5730\u4e8b\u52a16ACK7rollback&#xff08;\u5220 half&#xff09;8\u53cd\u67e5&#xff1a;\u5230\u5e95\u63d0\u4ea4\u5417&#xff1f;9\u67e5\u672c\u5730\u4e8b\u52a1\u72b6\u6001\u8868\u540e\u7b54\u590d10<\/p>\n<p>\u4e09\u8005\u600e\u4e48\u9009&#xff1f;\u65b0\u9879\u76ee\u76f4\u63a5 Outbox&#043;CDC&#xff0c;\u751f\u6001\u6210\u719f\u3001\u53ef\u89c2\u6d4b&#xff1b;\u5df2\u6df1\u5ea6\u7ed1\u5b9a RocketMQ \u4e14\u94fe\u8def\u7b80\u5355&#xff0c;\u7528\u4e8b\u52a1\u6d88\u606f\u6700\u7701\u4e8b&#xff1b;\u5b58\u91cf\u8001\u9879\u76ee\u6539\u4e0d\u52a8&#xff0c;\u672c\u5730\u6d88\u606f\u8868\u6253\u4e2a\u8865\u4e01\u6700\u5feb\u3002\u4f46\u90fd\u8981\u8bb0\u4f4f&#xff1a;\u6d88\u606f\u6700\u7ec8\u4e00\u81f4\u53ea\u4fdd\u8bc1\u201c\u6700\u7ec8\u9001\u5230\u201d&#xff0c;\u4e0d\u4fdd\u8bc1\u201c\u4e0d\u91cd\u590d\u201d\u3001\u4e0d\u4fdd\u8bc1\u201c\u6709\u5e8f\u201d\u3001\u4e0d\u4fdd\u8bc1\u201c\u4e0b\u6e38\u4e00\u5b9a\u6210\u529f\u201d&#xff0c;\u5e42\u7b49\u6d88\u8d39\u3001\u987a\u5e8f\u952e\u3001\u6b7b\u4fe1\u961f\u5217\u4e00\u4e2a\u90fd\u4e0d\u80fd\u5c11\u3002<\/p>\n<hr \/>\n<h3>7. \u6574\u4f53\u67b6\u6784&#xff1a;\u4e00\u4e2a\u5178\u578b\u7684\u67d4\u6027\u4e8b\u52a1\u5e73\u53f0\u957f\u4ec0\u4e48\u6837<\/h3>\n<p>\u628a\u4e0a\u9762\u7684\u96f6\u4ef6\u62fc\u6210\u751f\u4ea7\u53ef\u7528\u7684\u6837\u5b50&#xff0c;\u4e00\u822c\u662f\u56db\u5c42\u3002\u62ff Seata &#043; Outbox &#043; MQ \u7684\u6df7\u5408\u67b6\u6784\u4e3e\u4f8b&#xff0c;\u8fd9\u662f\u56fd\u5185\u4e2d\u5927\u5382\u6700\u5e38\u89c1\u7684\u62fc\u6cd5&#xff1a;\u6838\u5fc3\u8d44\u91d1\u8d70 Seata AT\/TCC&#xff0c;\u8de8\u57df\u901a\u77e5\u8d70\u6d88\u606f\u6700\u7ec8\u4e00\u81f4\u3002<\/p>\n<p>#mermaid-svg-Mc4WJxSsQeaiF9L8{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .error-icon{fill:#552222;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .marker.cross{stroke:#333333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 p{margin:0;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster-label text{fill:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster-label span{color:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster-label span p{background-color:transparent;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .label text,#mermaid-svg-Mc4WJxSsQeaiF9L8 span{fill:#333;color:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .node rect,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node circle,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node ellipse,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node polygon,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .rough-node .label text,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node .label text,#mermaid-svg-Mc4WJxSsQeaiF9L8 .image-shape .label,#mermaid-svg-Mc4WJxSsQeaiF9L8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .rough-node .label,#mermaid-svg-Mc4WJxSsQeaiF9L8 .node .label,#mermaid-svg-Mc4WJxSsQeaiF9L8 .image-shape .label,#mermaid-svg-Mc4WJxSsQeaiF9L8 .icon-shape .label{text-align:center;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .node.clickable{cursor:pointer;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .arrowheadPath{fill:#333333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Mc4WJxSsQeaiF9L8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mc4WJxSsQeaiF9L8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster text{fill:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .cluster span{color:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Mc4WJxSsQeaiF9L8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .icon-shape,#mermaid-svg-Mc4WJxSsQeaiF9L8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .icon-shape p,#mermaid-svg-Mc4WJxSsQeaiF9L8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .icon-shape .label rect,#mermaid-svg-Mc4WJxSsQeaiF9L8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mc4WJxSsQeaiF9L8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Mc4WJxSsQeaiF9L8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Mc4WJxSsQeaiF9L8 :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"nodeLabel\"><\/p>\n<p>\u5b58\u50a8\u4e0e\u4e2d\u95f4\u4ef6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e8b\u52a1\u534f\u8c03\u5c42<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e1a\u52a1\u5e94\u7528\u5c42<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>1. \u7533\u8bf7 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>2. RPC \u5e26 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>2. RPC \u5e26 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u67e5\u5e42\u7b49<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>commit\/rollback \u51b3\u8bae<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u51b3\u8bae<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7f51\u5173 \/ App<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>order-serviceTM \u4e8b\u52a1\u53d1\u8d77\u65b9<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>account-serviceRM<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>stock-serviceRM<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Seata ServerTC&#xff1a;\u7ba1\u5168\u5c40 XID\u5206\u652f\u6ce8\u518c \/ \u51b3\u8bae<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Saga \u6267\u884c\u5668\u72b6\u6001\u673a &#043; \u8865\u507f\u8c03\u5ea6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>RocketMQ BrokerHalf \u6d88\u606f &#043; \u53cd\u67e5<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>order-db\u4e1a\u52a1\u8868 &#043; undo_log&#043; tx_state<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>account-db\u4e1a\u52a1\u8868 &#043; undo_log<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>stock-db<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>outbox \u8868binlog<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Debezium \/ Canalbinlog -&gt; MQ<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Redis\u5e42\u7b49\u952e \/ \u53bb\u91cd<\/p>\n<p><\/span><\/p>\n<p>\u6570\u636e\u6d41\u8d70\u4e00\u904d\u201c\u4e0b\u5355\u6263\u5e93\u5b58\u6263\u4f59\u989d\u201d&#xff1a;<\/p>\n<p>#mermaid-svg-HlrK8rd0mnCmbInW{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HlrK8rd0mnCmbInW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HlrK8rd0mnCmbInW .error-icon{fill:#552222;}#mermaid-svg-HlrK8rd0mnCmbInW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HlrK8rd0mnCmbInW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HlrK8rd0mnCmbInW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HlrK8rd0mnCmbInW .marker.cross{stroke:#333333;}#mermaid-svg-HlrK8rd0mnCmbInW svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HlrK8rd0mnCmbInW p{margin:0;}#mermaid-svg-HlrK8rd0mnCmbInW .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-HlrK8rd0mnCmbInW .cluster-label text{fill:#333;}#mermaid-svg-HlrK8rd0mnCmbInW .cluster-label span{color:#333;}#mermaid-svg-HlrK8rd0mnCmbInW .cluster-label span p{background-color:transparent;}#mermaid-svg-HlrK8rd0mnCmbInW .label text,#mermaid-svg-HlrK8rd0mnCmbInW span{fill:#333;color:#333;}#mermaid-svg-HlrK8rd0mnCmbInW .node rect,#mermaid-svg-HlrK8rd0mnCmbInW .node circle,#mermaid-svg-HlrK8rd0mnCmbInW .node ellipse,#mermaid-svg-HlrK8rd0mnCmbInW .node polygon,#mermaid-svg-HlrK8rd0mnCmbInW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HlrK8rd0mnCmbInW .rough-node .label text,#mermaid-svg-HlrK8rd0mnCmbInW .node .label text,#mermaid-svg-HlrK8rd0mnCmbInW .image-shape .label,#mermaid-svg-HlrK8rd0mnCmbInW .icon-shape .label{text-anchor:middle;}#mermaid-svg-HlrK8rd0mnCmbInW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HlrK8rd0mnCmbInW .rough-node .label,#mermaid-svg-HlrK8rd0mnCmbInW .node .label,#mermaid-svg-HlrK8rd0mnCmbInW .image-shape .label,#mermaid-svg-HlrK8rd0mnCmbInW .icon-shape .label{text-align:center;}#mermaid-svg-HlrK8rd0mnCmbInW .node.clickable{cursor:pointer;}#mermaid-svg-HlrK8rd0mnCmbInW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HlrK8rd0mnCmbInW .arrowheadPath{fill:#333333;}#mermaid-svg-HlrK8rd0mnCmbInW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HlrK8rd0mnCmbInW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HlrK8rd0mnCmbInW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HlrK8rd0mnCmbInW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HlrK8rd0mnCmbInW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HlrK8rd0mnCmbInW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HlrK8rd0mnCmbInW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HlrK8rd0mnCmbInW .cluster text{fill:#333;}#mermaid-svg-HlrK8rd0mnCmbInW .cluster span{color:#333;}#mermaid-svg-HlrK8rd0mnCmbInW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HlrK8rd0mnCmbInW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HlrK8rd0mnCmbInW rect.text{fill:none;stroke-width:0;}#mermaid-svg-HlrK8rd0mnCmbInW .icon-shape,#mermaid-svg-HlrK8rd0mnCmbInW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HlrK8rd0mnCmbInW .icon-shape p,#mermaid-svg-HlrK8rd0mnCmbInW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HlrK8rd0mnCmbInW .icon-shape .label rect,#mermaid-svg-HlrK8rd0mnCmbInW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HlrK8rd0mnCmbInW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HlrK8rd0mnCmbInW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HlrK8rd0mnCmbInW :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7528\u6237\u70b9\u4e0b\u5355<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>order-service&#xff1a;\u521b\u5efa\u5168\u5c40 XID\u5199\u8ba2\u5355 TRYING<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8c03 account Try&#xff1a;\u51bb\u7ed3 100<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8c03 stock Try&#xff1a;\u51bb\u7ed3 1 \u4ef6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u90fd Try \u6210\u529f?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TC \u53d1 Confirm\u5b9e\u6263 &#043; \u8ba2\u5355\u7f6e PAID\u5199 outbox \u884c<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TC \u53d1 Cancel\u89e3\u51bb &#043; \u8ba2\u5355\u7f6e CANCELED<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>CDC \u6293 outbox binlog\u53d1 MQ&#xff1a;order_paid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e0b\u6e38\u79ef\u5206\/\u4ed3\u50a8\u5e42\u7b49\u6d88\u8d39\u5931\u8d25\u8fdb\u91cd\u8bd5\/\u6b7b\u4fe1<\/p>\n<p><\/span><\/p>\n<p>\u8fd9\u5f20\u6570\u636e\u6d41\u56fe\u91cc\u85cf\u4e86\u4e09\u4e2a\u751f\u4ea7\u8981\u70b9&#xff1a;<\/p>\n<li>XID \u900f\u4f20&#xff1a;Seata\/Dubbo\/Feign \u8981\u628a XID \u653e header \u91cc\u900f\u4f20&#xff0c;\u4e22\u4e86 XID \u5206\u652f\u5c31\u6ce8\u518c\u4e0d\u4e0a&#xff0c;\u4e8b\u52a1\u76f4\u63a5\u6563\u4e86\u3002\u7f51\u5173\u900f\u4f20\u3001\u5f02\u6b65\u7ebf\u7a0b\u900f\u4f20&#xff08;TransmittableThreadLocal&#xff09;\u662f\u6700\u5e38\u51fa bug \u7684\u5730\u65b9\u3002<\/li>\n<li>\u51b3\u8bae\u4e0e\u6267\u884c\u5206\u79bb&#xff1a;TC \u53ea\u505a\u51b3\u8bae&#xff08;commit\/rollback&#xff09;&#xff0c;\u771f\u6b63\u7684\u91cd\u6d3b&#xff08;\u91cd\u8bd5\u3001\u8865\u507f&#xff09;\u9760\u5404 RM &#043; MQ \u91cd\u8bd5 &#043; \u5b9a\u65f6\u5bf9\u8d26\u3002TC \u6302\u4e86&#xff0c;\u5df2 prepare \u7684\u5206\u652f\u9760\u6062\u590d\u65e5\u5fd7 &#043; \u53cd\u67e5\u515c\u5e95\u3002<\/li>\n<li>\u5bf9\u8d26\u662f\u6700\u540e\u4e00\u9053\u7f51&#xff1a;\u4e0d\u7ba1\u4ec0\u4e48\u65b9\u6848&#xff0c;\u90fd\u8981\u6709\u4e00\u5929\u4e00\u6b21\u7684\u5bf9\u8d26 job&#xff0c;\u6bd4\u5bf9\u201c\u8ba2\u5355 PAID \u4f46\u6ca1\u6263\u6b3e\u201d\u201c\u6263\u4e86\u6b3e\u4f46\u8ba2\u5355 CANCELED\u201d\u7684\u60ac\u8d26&#xff0c;\u8d70\u4eba\u5de5\u6216\u81ea\u52a8\u51b2\u6b63\u3002\u8fd9\u662f\u6240\u6709\u67d4\u6027\u65b9\u6848\u7684\u6807\u914d&#xff0c;\u522b\u7701\u3002<\/li>\n<hr \/>\n<h3>8. ER \u5173\u7cfb&#xff1a;\u4e8b\u52a1\u8868\u5230\u5e95\u600e\u4e48\u5efa<\/h3>\n<p>\u5149\u8bb2\u534f\u8bae\u4e0d\u843d\u5730\u8868\u7ed3\u6784&#xff0c;\u7b49\u4e8e\u6ca1\u8bb2\u3002\u8fd9\u91cc\u7ed9\u4e00\u5957\u53ef\u76f4\u63a5\u6284\u7684\u8868\u8bbe\u8ba1&#xff1a;\u8ba2\u5355 &#043; \u8d26\u6237 &#043; \u5168\u5c40\u4e8b\u52a1\u4e09\u5f20\u6838\u5fc3&#xff0c;\u5916\u52a0 Seata AT \u7684 undo_log \u548c Saga \u7684\u72b6\u6001\u8868\u3002MySQL 8 \u8bed\u6cd5\u3002<\/p>\n<p>#mermaid-svg-ztlpsdYmlIs0wdSx{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ztlpsdYmlIs0wdSx .error-icon{fill:#552222;}#mermaid-svg-ztlpsdYmlIs0wdSx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ztlpsdYmlIs0wdSx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ztlpsdYmlIs0wdSx .marker.cross{stroke:#333333;}#mermaid-svg-ztlpsdYmlIs0wdSx svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ztlpsdYmlIs0wdSx p{margin:0;}#mermaid-svg-ztlpsdYmlIs0wdSx .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-ztlpsdYmlIs0wdSx .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-ztlpsdYmlIs0wdSx .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-ztlpsdYmlIs0wdSx .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-ztlpsdYmlIs0wdSx .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-ztlpsdYmlIs0wdSx .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ztlpsdYmlIs0wdSx .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-ztlpsdYmlIs0wdSx .node rect,#mermaid-svg-ztlpsdYmlIs0wdSx .node circle,#mermaid-svg-ztlpsdYmlIs0wdSx .node ellipse,#mermaid-svg-ztlpsdYmlIs0wdSx .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ztlpsdYmlIs0wdSx .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-ztlpsdYmlIs0wdSx .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ztlpsdYmlIs0wdSx .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ztlpsdYmlIs0wdSx .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-ztlpsdYmlIs0wdSx .edgeLabel .label text{fill:#333;}#mermaid-svg-ztlpsdYmlIs0wdSx :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>1:N \u4e00\u4e2a\u5168\u5c40\u542b\u591a\u5206\u652f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>1:1 \u5e42\u7b49\/\u9632\u60ac\u6302<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u8ba2\u5355\u7ed1\u5b9a XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>1:N \u51bb\u7ed3\u660e\u7ec6<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>1:N \u4e1a\u52a1\u5b8c\u6210\u540e\u5199 outbox<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>GLOBAL_TX<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>xid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5168\u5c40\u4e8b\u52a1ID<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>BEGIN\/COMMITTING\/ROLLBACKING\/COMMITTED\/ROLLBACKED<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>datetime<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>gmt_create<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>datetime<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>gmt_modified<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>app_name<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53d1\u8d77\u65b9<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>BRANCH_TX<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>bigint<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>xid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>FK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5173\u8054\u5168\u5c40<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>branch_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5206\u652fID<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>resource_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5e93\/\u670d\u52a1\u6807\u8bc6<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>PHASE1_DONE\/PHASE2_DONE<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>undo_info<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u56de\u6eda\u4e0a\u4e0b\u6587<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TX_STATE<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>xid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>branch_key<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e1a\u52a1\u5e42\u7b49\u952e orderId<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>state<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>TRY_DONE\/CONFIRM_DONE\/CANCEL_DONE<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>datetime<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>gmt_create<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>ORDER_INFO<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>order_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>xid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5173\u8054\u5168\u5c40\u4e8b\u52a1<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>TRYING\/PAID\/CANCELED<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>decimal<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>amount<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>datetime<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>gmt_create<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>ACCOUNT<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>bigint<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>user_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>decimal<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>balance<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u53ef\u7528<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>decimal<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>frozen<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u51bb\u7ed3<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>int<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>version<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e50\u89c2\u9501<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>ACCOUNT_FREEZE<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>bigint<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>bigint<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>user_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>FK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>order_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u5e42\u7b49\u952e<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>decimal<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>amount<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>FROZEN\/DEDUCTED\/RELEASED<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>OUTBOX<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>bigint<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>PK<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>aggregate_type<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>order<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>aggregate_id<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>orderId<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>event_type<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>order_paid<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>json<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>payload<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>varchar<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>status<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>NEW\/SENT<\/p>\n<p><\/span><\/p>\n<p>\u5efa\u8868 SQL&#xff08;\u7cbe\u7b80\u53ef\u8dd1\u7248&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; \u5168\u5c40\u4e8b\u52a1\u8868&#xff08;Seata server \u5b58\u7684\u52a8\u4f5c&#xff0c;\u4e1a\u52a1\u4fa7\u53ef\u81ea\u5efa\u8f7b\u91cf\u7248\u7528\u4e8e\u5bf9\u8d26&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> global_tx <span class=\"token punctuation\">(<\/span><br \/>\n  xid <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">status<\/span> <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  app_name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  gmt_create <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  gmt_modified <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">UPDATE<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">KEY<\/span> idx_status_time <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">,<\/span> gmt_modified<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5206\u652f\u4e0e\u5e42\u7b49\u72b6\u6001&#xff08;\u9632\u60ac\u6302&#043;\u7a7a\u56de\u6eda\u7684\u6838\u5fc3&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> tx_state <span class=\"token punctuation\">(<\/span><br \/>\n  xid <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  branch_key <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u5982 order_id&#xff0c;\u9632\u91cd<\/span><br \/>\n  state <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>       <span class=\"token comment\">&#8212; TRY_DONE \/ CONFIRM_DONE \/ CANCEL_DONE<\/span><br \/>\n  gmt_create <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> branch_key<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8d26\u6237&#xff1a;\u4f59\u989d\u4e0e\u51bb\u7ed3\u5206\u79bb&#xff0c;TCC \u5fc5\u5907<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> account <span class=\"token punctuation\">(<\/span><br \/>\n  user_id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  balance <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">18<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  frozen <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">18<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  version <span class=\"token keyword\">INT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> account_freeze <span class=\"token punctuation\">(<\/span><br \/>\n  id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">AUTO_INCREMENT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  user_id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  order_id <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  amount <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">18<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">status<\/span> <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">16<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; FROZEN \/ DEDUCTED \/ RELEASED<\/span><br \/>\n  <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token keyword\">KEY<\/span> uk_order <span class=\"token punctuation\">(<\/span>order_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">KEY<\/span> idx_user <span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; Seata AT \u7684 undo_log&#xff08;\u6846\u67b6\u81ea\u52a8\u5199&#xff0c;\u8d34\u51fa\u6765\u8ba9\u4f60\u77e5\u9053\u5b83\u957f\u5565\u6837&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> undo_log <span class=\"token punctuation\">(<\/span><br \/>\n  id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">AUTO_INCREMENT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  branch_id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  xid <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  context <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  rollback_info <span class=\"token keyword\">LONGBLOB<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">&#8212; \u5b58\u524d\u540e\u955c\u50cf&#xff0c;JSON&#043;\u538b\u7f29<\/span><br \/>\n  log_status <span class=\"token keyword\">INT<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span>         <span class=\"token comment\">&#8212; 0 normal,1 globally finished<\/span><br \/>\n  log_created <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  log_modified <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token keyword\">KEY<\/span> ux_undo_log <span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> branch_id<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; Outbox \u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> outbox <span class=\"token punctuation\">(<\/span><br \/>\n  id <span class=\"token keyword\">BIGINT<\/span> <span class=\"token keyword\">AUTO_INCREMENT<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  aggregate_type <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  aggregate_id <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  event_type <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  payload JSON <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">status<\/span> <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">16<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token string\">&#039;NEW&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  gmt_create <span class=\"token keyword\">DATETIME<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token keyword\">KEY<\/span> idx_status_id <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">status<\/span><span class=\"token punctuation\">,<\/span> id<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ENGINE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">InnoDB<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u4e09\u53e5\u53ee\u5631&#xff0c;\u90fd\u662f\u7ebf\u4e0a\u8e29\u51fa\u6765\u7684&#xff1a;<\/p>\n<ul>\n<li>tx_state \u7684 (xid, branch_key) \u5fc5\u987b\u552f\u4e00\u7d22\u5f15&#xff0c;\u8fd9\u662f\u5e42\u7b49\u7684\u7269\u7406\u515c\u5e95&#xff0c;\u5e94\u7528\u5c42 if exists return \u6321\u4e0d\u4f4f\u5e76\u53d1&#xff0c;\u552f\u4e00\u952e\u624d\u80fd\u6321\u4f4f\u3002<\/li>\n<li>account \u4e00\u5b9a\u8981 balance \u4e0e frozen \u5206\u5217&#xff0c;\u522b\u7528\u4e00\u4e2a\u5b57\u6bb5\u52a0\u51cf\u3002\u6df7\u5728\u4e00\u8d77&#xff0c;\u5e76\u53d1\u4e00\u9ad8\u5bf9\u8d26\u80fd\u628a\u4eba\u770b\u54ed\u3002<\/li>\n<li>outbox \u6309 (status, id) \u5efa\u7d22\u5f15&#xff0c;CDC\/\u8f6e\u8be2\u626b WHERE status&#061;&#039;NEW&#039; ORDER BY id LIMIT 500 \u624d\u80fd\u8d70\u7d22\u5f15&#xff0c;\u4e0d\u7136\u5168\u8868\u626b\u628a\u4e1a\u52a1\u5e93\u62d6\u6b7b\u3002<\/li>\n<\/ul>\n<hr \/>\n<h3>9. Seata \u5168\u5bb6\u6876&#xff1a;AT\u3001TCC\u3001Saga\u3001XA \u600e\u4e48\u9009<\/h3>\n<p>Seata \u662f\u56fd\u5185\u5206\u5e03\u5f0f\u4e8b\u52a1\u7684\u4e8b\u5b9e\u6807\u51c6&#xff0c;\u7406\u89e3\u5b83\u5c31\u7406\u89e3\u4e86\u5927\u534a\u4e2a\u5de5\u4e1a\u754c\u3002\u5b83\u7684\u89d2\u8272\u5bf9\u6807 XA&#xff1a;TC&#xff08;Transaction Coordinator&#xff0c;\u72ec\u7acb\u7684 seata-server&#xff09;\u3001TM&#xff08;\u53d1\u8d77\u65b9&#xff09;\u3001RM&#xff08;\u53c2\u4e0e\u65b9&#xff09;\u3002\u4e00\u53e5\u8bdd&#xff1a;Seata \u628a 2PC \u7684\u9aa8\u67b6\u7559\u4e0b\u6765&#xff0c;\u628a\u9501\u548c\u56de\u6eda\u7684\u5b9e\u73b0\u6362\u6210\u4e86\u66f4\u9002\u5408\u5fae\u670d\u52a1\u7684\u6837\u5b50\u3002<\/p>\n<p>#mermaid-svg-TKiUUhxAgIW7Fokw{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TKiUUhxAgIW7Fokw .error-icon{fill:#552222;}#mermaid-svg-TKiUUhxAgIW7Fokw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TKiUUhxAgIW7Fokw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TKiUUhxAgIW7Fokw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TKiUUhxAgIW7Fokw .marker.cross{stroke:#333333;}#mermaid-svg-TKiUUhxAgIW7Fokw svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TKiUUhxAgIW7Fokw p{margin:0;}#mermaid-svg-TKiUUhxAgIW7Fokw .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster-label text{fill:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster-label span{color:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster-label span p{background-color:transparent;}#mermaid-svg-TKiUUhxAgIW7Fokw .label text,#mermaid-svg-TKiUUhxAgIW7Fokw span{fill:#333;color:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw .node rect,#mermaid-svg-TKiUUhxAgIW7Fokw .node circle,#mermaid-svg-TKiUUhxAgIW7Fokw .node ellipse,#mermaid-svg-TKiUUhxAgIW7Fokw .node polygon,#mermaid-svg-TKiUUhxAgIW7Fokw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TKiUUhxAgIW7Fokw .rough-node .label text,#mermaid-svg-TKiUUhxAgIW7Fokw .node .label text,#mermaid-svg-TKiUUhxAgIW7Fokw .image-shape .label,#mermaid-svg-TKiUUhxAgIW7Fokw .icon-shape .label{text-anchor:middle;}#mermaid-svg-TKiUUhxAgIW7Fokw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TKiUUhxAgIW7Fokw .rough-node .label,#mermaid-svg-TKiUUhxAgIW7Fokw .node .label,#mermaid-svg-TKiUUhxAgIW7Fokw .image-shape .label,#mermaid-svg-TKiUUhxAgIW7Fokw .icon-shape .label{text-align:center;}#mermaid-svg-TKiUUhxAgIW7Fokw .node.clickable{cursor:pointer;}#mermaid-svg-TKiUUhxAgIW7Fokw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TKiUUhxAgIW7Fokw .arrowheadPath{fill:#333333;}#mermaid-svg-TKiUUhxAgIW7Fokw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TKiUUhxAgIW7Fokw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TKiUUhxAgIW7Fokw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TKiUUhxAgIW7Fokw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TKiUUhxAgIW7Fokw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TKiUUhxAgIW7Fokw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster text{fill:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw .cluster span{color:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TKiUUhxAgIW7Fokw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TKiUUhxAgIW7Fokw rect.text{fill:none;stroke-width:0;}#mermaid-svg-TKiUUhxAgIW7Fokw .icon-shape,#mermaid-svg-TKiUUhxAgIW7Fokw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TKiUUhxAgIW7Fokw .icon-shape p,#mermaid-svg-TKiUUhxAgIW7Fokw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TKiUUhxAgIW7Fokw .icon-shape .label rect,#mermaid-svg-TKiUUhxAgIW7Fokw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TKiUUhxAgIW7Fokw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TKiUUhxAgIW7Fokw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TKiUUhxAgIW7Fokw :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/p>\n<p>1. \u7533\u8bf7 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>2. RPC \u5e26 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>3. RPC \u5e26 XID<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>4. \u6ce8\u518c\u5206\u652f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>4. \u6ce8\u518c\u5206\u652f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>5. \u4e00\u9636\u6bb5\u672c\u5730\u63d0\u4ea4&#xff08;AT \u76f4\u63a5\u63d0\u4ea4&#043;\u8bb0 undo&#xff09;<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>5. \u4e00\u9636\u6bb5<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>6. commit\/rollback \u51b3\u8bae<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>7. \u5f02\u6b65\u4e8c\u9636\u6bb5<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>7. \u5f02\u6b65\u4e8c\u9636\u6bb5<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TM&#xff1a;order-service&#064;GlobalTransactional<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TC&#xff1a;seata-server\u8bb0\u5168\u5c40 &#043; \u5206\u652f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>RM&#xff1a;account-service&#064;TwoPhaseBusinessAction<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>RM&#xff1a;stock-service<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>account-db<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>stock-db<\/p>\n<p><\/span><\/p>\n<p>\u56db\u79cd\u6a21\u5f0f\u7684\u672c\u8d28\u533a\u522b&#xff1a;<\/p>\n<table>\n<tr>\u6a21\u5f0f\u4e00\u9636\u6bb5\u5e72\u4ec0\u4e48\u4e8c\u9636\u6bb5\u5e72\u4ec0\u4e48\u9501\u8c01\u4fb5\u5165\u9002\u5408<\/tr>\n<tbody>\n<tr>\n<td>XA<\/td>\n<td>\u539f\u751f XA prepare&#xff0c;\u4e0d\u63d0\u4ea4<\/td>\n<td>commit\/rollback<\/td>\n<td>\u6570\u636e\u5e93\u884c\u9501&#xff08;\u6301\u6709\u6700\u4e45&#xff09;<\/td>\n<td>\u4f4e&#xff08;\u6570\u636e\u6e90\u4ee3\u7406&#xff09;<\/td>\n<td>\u540c\u673a\u623f\u3001\u591a\u5e93\u3001\u5b58\u91cf\u6539\u9020<\/td>\n<\/tr>\n<tr>\n<td>AT<\/td>\n<td>\u89e3\u6790 SQL \u8bb0\u524d\u540e\u955c\u50cf&#xff0c;\u76f4\u63a5\u63d0\u4ea4\u672c\u5730\u4e8b\u52a1<\/td>\n<td>commit \u65f6\u5220 undo&#xff0c;rollback \u65f6\u7528\u524d\u955c\u50cf\u53cd\u5411 SQL<\/td>\n<td>\u5168\u5c40\u5199\u9501&#xff08;Seata server \u4fa7\u903b\u8f91\u9501&#xff0c;\u6301\u6709\u77ed&#xff09;<\/td>\n<td>\u4f4e&#xff08;\u53ea\u52a0\u6570\u636e\u6e90\u4ee3\u7406&#043;undo_log\u8868&#xff09;<\/td>\n<td>90% \u7684 CRUD \u8de8\u5e93&#xff0c;\u9996\u9009<\/td>\n<\/tr>\n<tr>\n<td>TCC<\/td>\n<td>\u624b\u5199 Try \u51bb\u7ed3<\/td>\n<td>\u624b\u5199 Confirm\/Cancel<\/td>\n<td>\u4e1a\u52a1\u51bb\u7ed3\u5b57\u6bb5<\/td>\n<td>\u9ad8&#xff08;\u4e09\u500d\u4ee3\u7801&#xff09;<\/td>\n<td>\u8d44\u91d1\u3001\u5e93\u5b58\u7b49\u9ad8\u51b2\u7a81\u6838\u5fc3\u94fe\u8def<\/td>\n<\/tr>\n<tr>\n<td>Saga<\/td>\n<td>\u76f4\u63a5\u63d0\u4ea4\u672c\u5730\u4e8b\u52a1<\/td>\n<td>\u5931\u8d25\u65f6\u8c03\u8865\u507f<\/td>\n<td>\u4e0d\u9501&#xff08;\u88f8\u5954&#043;\u4e8b\u540e\u8d54&#xff09;<\/td>\n<td>\u4e2d&#xff08;\u5199\u6b63\u5411&#043;\u8865\u507f&#043;\u72b6\u6001\u673a&#xff09;<\/td>\n<td>\u957f\u6d41\u7a0b\u3001\u591a\u6b65\u9aa4\u3001\u4f4e\u9694\u79bb\u53ef\u63a5\u53d7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>AT \u503c\u5f97\u5355\u72ec\u5c55\u5f00&#xff0c;\u56e0\u4e3a\u5b83\u6700\u5e38\u7528\u4e5f\u6700\u88ab\u8bef\u89e3\u3002AT \u4e00\u9636\u6bb5\u76f4\u63a5\u63d0\u4ea4\u4e86\u672c\u5730\u4e8b\u52a1&#xff0c;\u4e8c\u9636\u6bb5\u56de\u6eda\u9760 undo_log \u91cc\u5b58\u7684\u524d\u955c\u50cf\u62fc\u53cd\u5411 SQL\u3002\u5b83\u89e3\u51b3\u810f\u5199\u9760\u5168\u5c40\u5199\u9694\u79bb&#xff1a;\u63d0\u4ea4\u524d\u53bb TC \u67e5\u4e00\u4e0b\u201c\u6211\u8981\u5199\u7684\u884c\u6709\u6ca1\u6709\u522b\u7684\u5168\u5c40\u4e8b\u52a1\u6ca1\u5b8c\u4e8b\u201d&#xff0c;\u6709\u5c31\u7b49\u3002\u8fd9\u662f\u4e2a\u903b\u8f91\u9501&#xff0c;\u4e0d\u662f\u6570\u636e\u5e93\u9501&#xff0c;\u6240\u4ee5\u6027\u80fd\u6bd4 XA \u597d\u5f97\u591a&#xff0c;\u4f46\u4f9d\u7136\u6709\u6b7b\u9501\u548c\u957f\u4e8b\u52a1\u6301\u6709\u5168\u5c40\u9501\u7684\u98ce\u9669\u3002AT \u9ed8\u8ba4\u662f READ UNCOMMITTED \u8bed\u4e49\u2014\u2014\u5168\u5c40\u4e8b\u52a1\u6ca1\u63d0\u4ea4&#xff0c;\u522b\u7684\u5168\u5c40\u4e8b\u52a1\u53ef\u80fd\u8bfb\u5230\u4e2d\u95f4\u503c\u3002\u63a5\u53d7\u4e0d\u4e86\u5c31\u4e0a TCC \u6216 XA\u3002<\/p>\n<p><span class=\"token comment\">\/\/ Seata AT&#xff1a;\u4e1a\u52a1\u4ee3\u7801\u51e0\u4e4e\u96f6\u6539&#xff0c;\u9760\u4ee3\u7406\u6570\u636e\u6e90 &#043; \u6ce8\u89e3<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;GlobalTransactional<\/span><span class=\"token punctuation\">(<\/span>name <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;create-order&#034;<\/span><span class=\"token punctuation\">,<\/span> rollbackFor <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">Exception<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">createOrder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Order<\/span> order<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    orderDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insert<\/span><span class=\"token punctuation\">(<\/span>order<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                 <span class=\"token comment\">\/\/ \u5e931&#xff1a;\u4ee3\u7406\u6570\u636e\u6e90\u81ea\u52a8\u8bb0\u524d\u540e\u955c\u50cf<\/span><br \/>\n    accountService<span class=\"token punctuation\">.<\/span><span class=\"token function\">deduct<\/span><span class=\"token punctuation\">(<\/span>order<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> order<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAmount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ RPC \u5e26 XID<\/span><br \/>\n    stockService<span class=\"token punctuation\">.<\/span><span class=\"token function\">deduct<\/span><span class=\"token punctuation\">(<\/span>order<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSku<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ RPC \u5e26 XID<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4efb\u4e00\u629b\u5f02\u5e38&#xff0c;\u6846\u67b6\u81ea\u52a8\u5168\u5c40\u56de\u6eda<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Seata TCC&#xff1a;\u4e09\u4e2a\u65b9\u6cd5 &#043; \u6ce8\u89e3&#xff0c;\u6846\u67b6\u53ea\u7ba1\u8c03\u7528\u987a\u5e8f<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;TwoPhaseBusinessAction<\/span><span class=\"token punctuation\">(<\/span>name <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;freezeAction&#034;<\/span><span class=\"token punctuation\">,<\/span> commitMethod <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;confirm&#034;<\/span><span class=\"token punctuation\">,<\/span> rollbackMethod <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;cancel&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">boolean<\/span> <span class=\"token function\">tryFreeze<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">BusinessActionContext<\/span> ctx<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">String<\/span> orderId<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">long<\/span> amount<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">boolean<\/span> <span class=\"token function\">confirm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">BusinessActionContext<\/span> ctx<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token comment\">\/\/ \u5e42\u7b49 &#043; \u5224\u7a7a<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">boolean<\/span> <span class=\"token function\">cancel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">BusinessActionContext<\/span> ctx<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span> <span class=\"token punctuation\">}<\/span>  <span class=\"token comment\">\/\/ \u7a7a\u56de\u6eda &#043; \u9632\u60ac\u6302 &#043; \u5e42\u7b49<\/span><\/p>\n<hr \/>\n<h3>10. \u5e42\u7b49\u3001\u60ac\u6302\u4e0e\u91cd\u8bd5&#xff1a;\u67d4\u6027\u4e8b\u52a1\u7684\u4e09\u6761\u547d<\/h3>\n<p>\u67d4\u6027\u65b9\u6848\u628a\u201c\u505a\u4e00\u6b21\u5c31\u5bf9\u201d\u53d8\u6210\u4e86\u201c\u505a\u591a\u6b21\u6700\u7ec8\u5bf9\u201d&#xff0c;\u6240\u4ee5\u91cd\u8bd5 &#043; \u5e42\u7b49 &#043; \u53bb\u91cd \u4e0d\u662f\u4f18\u5316\u9879&#xff0c;\u662f\u547d\u3002\u8fd9\u4e00\u7ae0\u662f checklist&#xff0c;\u4e0a\u7ebf\u524d\u9010\u6761\u8fc7\u3002<\/p>\n<h4>10.1 \u5e42\u7b49\u7684\u4e94\u4e2a\u5c42\u7ea7&#xff0c;\u4ece low \u5230\u9ad8<\/h4>\n<li>\u6570\u636e\u5e93\u552f\u4e00\u952e&#xff1a;order_id \u552f\u4e00\u3001tx_state \u8054\u5408\u552f\u4e00\u3002\u8fd9\u662f\u6700\u786c\u7684\u515c\u5e95&#xff0c;\u524d\u9762 ER \u7ae0\u5df2\u7ecf\u57cb\u4e86\u3002<\/li>\n<li>\u72b6\u6001\u673a\u5224\u65ad&#xff1a;if (status !&#061; TRYING) return;&#xff0c;\u53ea\u6709\u5904\u4e8e\u53ef\u8f6c\u72b6\u6001\u624d\u8f6c&#xff0c;\u91cd\u590d\u6d88\u606f\u76f4\u63a5\u4e22\u3002<\/li>\n<li>\u7248\u672c\u53f7\/\u4e50\u89c2\u9501&#xff1a;UPDATE account SET balance &#061; balance &#8211; 100, version &#061; version &#043; 1 WHERE user_id &#061; ? AND version &#061; ?&#xff0c;\u5e76\u53d1\u6539\u540c\u4e00\u884c\u53ea\u6709\u4e00\u4e2a\u80fd\u6210\u3002<\/li>\n<li>\u5e42\u7b49\u952e &#043; Redis&#xff1a;SETNX idem:order:12345 1 EX 24h&#xff0c;MQ \u6d88\u8d39\u3001HTTP \u56de\u8c03\u5165\u53e3\u5148\u5360\u5751\u3002\u6ce8\u610f Redis \u4e22\u4e86\u600e\u4e48\u529e\u2014\u2014\u6700\u7ec8\u8fd8\u662f\u8981\u56de\u67e5 DB&#xff0c;\u6240\u4ee5 Redis \u53ea\u662f\u52a0\u901f&#xff0c;DB \u552f\u4e00\u952e\u624d\u662f\u5e95\u3002<\/li>\n<li>\u4e1a\u52a1\u5929\u7136\u5e42\u7b49&#xff1a;SET status &#061; &#039;PAID&#039; \u91cd\u590d\u6267\u884c\u7ed3\u679c\u4e00\u6837&#xff0c;balance -&#061; 100 \u4e0d\u662f\u3002\u8bbe\u8ba1\u63a5\u53e3\u65f6\u4f18\u5148\u505a\u6210\u8986\u76d6\u5f0f\u800c\u975e\u589e\u91cf\u5f0f\u3002<\/li>\n<h4>10.2 TCC \u4e09\u5751\u7684\u6807\u51c6\u89e3&#xff08;\u518d\u5f3a\u8c03\u4e00\u904d&#xff0c;\u56e0\u4e3a\u5fc5\u8e29&#xff09;<\/h4>\n<p>#mermaid-svg-wsOoReiser1M3eyy{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wsOoReiser1M3eyy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wsOoReiser1M3eyy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wsOoReiser1M3eyy .error-icon{fill:#552222;}#mermaid-svg-wsOoReiser1M3eyy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wsOoReiser1M3eyy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wsOoReiser1M3eyy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wsOoReiser1M3eyy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wsOoReiser1M3eyy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wsOoReiser1M3eyy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wsOoReiser1M3eyy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wsOoReiser1M3eyy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wsOoReiser1M3eyy .marker.cross{stroke:#333333;}#mermaid-svg-wsOoReiser1M3eyy svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wsOoReiser1M3eyy p{margin:0;}#mermaid-svg-wsOoReiser1M3eyy .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wsOoReiser1M3eyy .cluster-label text{fill:#333;}#mermaid-svg-wsOoReiser1M3eyy .cluster-label span{color:#333;}#mermaid-svg-wsOoReiser1M3eyy .cluster-label span p{background-color:transparent;}#mermaid-svg-wsOoReiser1M3eyy .label text,#mermaid-svg-wsOoReiser1M3eyy span{fill:#333;color:#333;}#mermaid-svg-wsOoReiser1M3eyy .node rect,#mermaid-svg-wsOoReiser1M3eyy .node circle,#mermaid-svg-wsOoReiser1M3eyy .node ellipse,#mermaid-svg-wsOoReiser1M3eyy .node polygon,#mermaid-svg-wsOoReiser1M3eyy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wsOoReiser1M3eyy .rough-node .label text,#mermaid-svg-wsOoReiser1M3eyy .node .label text,#mermaid-svg-wsOoReiser1M3eyy .image-shape .label,#mermaid-svg-wsOoReiser1M3eyy .icon-shape .label{text-anchor:middle;}#mermaid-svg-wsOoReiser1M3eyy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wsOoReiser1M3eyy .rough-node .label,#mermaid-svg-wsOoReiser1M3eyy .node .label,#mermaid-svg-wsOoReiser1M3eyy .image-shape .label,#mermaid-svg-wsOoReiser1M3eyy .icon-shape .label{text-align:center;}#mermaid-svg-wsOoReiser1M3eyy .node.clickable{cursor:pointer;}#mermaid-svg-wsOoReiser1M3eyy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wsOoReiser1M3eyy .arrowheadPath{fill:#333333;}#mermaid-svg-wsOoReiser1M3eyy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wsOoReiser1M3eyy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wsOoReiser1M3eyy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wsOoReiser1M3eyy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wsOoReiser1M3eyy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wsOoReiser1M3eyy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wsOoReiser1M3eyy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wsOoReiser1M3eyy .cluster text{fill:#333;}#mermaid-svg-wsOoReiser1M3eyy .cluster span{color:#333;}#mermaid-svg-wsOoReiser1M3eyy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wsOoReiser1M3eyy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wsOoReiser1M3eyy rect.text{fill:none;stroke-width:0;}#mermaid-svg-wsOoReiser1M3eyy .icon-shape,#mermaid-svg-wsOoReiser1M3eyy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wsOoReiser1M3eyy .icon-shape p,#mermaid-svg-wsOoReiser1M3eyy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wsOoReiser1M3eyy .icon-shape .label rect,#mermaid-svg-wsOoReiser1M3eyy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wsOoReiser1M3eyy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wsOoReiser1M3eyy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wsOoReiser1M3eyy :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>Confirm \u5df2\u505a<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>Cancel \u5df2\u505a &#043; \u73b0\u5728\u662f Try<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>Try \u5df2\u505a &#043; \u73b0\u5728\u662f Cancel<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u65e0\u8bb0\u5f55 &#043; \u73b0\u5728\u662f Cancel<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u65e0\u8bb0\u5f55 &#043; \u73b0\u5728\u662f Try<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u65e0\u8bb0\u5f55 &#043; \u73b0\u5728\u662f Confirm<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6536\u5230 Try\/Confirm\/Cancelxid &#043; orderId<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u67e5 tx_state\u6709\u8bb0\u5f55?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u76f4\u63a5\u56de\u6210\u529f\u5e42\u7b49\u8fd4\u56de<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u62d2\u7edd\u6267\u884c\u9632\u60ac\u6302<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6b63\u5e38\u8d70 Cancel\u89e3\u51bb<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8bb0 CANCEL \u7a7a\u56de\u6eda\u76f4\u63a5\u56de\u6210\u529f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6267\u884c\u4e1a\u52a1 &#043; \u8bb0 TRY<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6b63\u5e38\u8d70 Confirm<\/p>\n<p><\/span><\/p>\n<p>\u53e3\u8bc0&#xff1a;Cancel \u8981\u8bb0\u7a7a&#xff0c;Try \u8981\u67e5\u7a7a&#xff0c;Confirm\/Cancel \u8981\u5224\u91cd\u3002Seata TCC \u548c Himalaya\/HMily \u7684 demo \u91cc\u90fd\u6709\u8fd9\u6bb5&#xff0c;\u522b\u81ea\u5df1\u9020\u8f6e\u5b50&#xff0c;\u6284\u6210\u719f\u6846\u67b6\u7684\u5c31\u884c\u3002<\/p>\n<h4>10.3 \u91cd\u8bd5\u4e0e\u6b7b\u4fe1&#xff1a;\u91cd\u8bd5\u8981\u6709\u8282\u5236&#xff0c;\u6b7b\u4fe1\u8981\u6709\u4eba\u770b<\/h4>\n<ul>\n<li>\u91cd\u8bd5\u7528\u6307\u6570\u9000\u907f &#043; \u6296\u52a8&#xff1a;1s\u30012s\u30014s\u30018s\u2026\u52a0\u968f\u673a\u6296\u52a8&#xff0c;\u907f\u514d\u6240\u6709\u5931\u8d25\u4e00\u8d77\u91cd\u8bd5\u6253\u7206\u4e0b\u6e38&#xff08;\u60ca\u7fa4&#xff09;\u3002<\/li>\n<li>\u533a\u5206\u53ef\u91cd\u8bd5\u4e0e\u4e0d\u53ef\u91cd\u8bd5&#xff1a;\u8d85\u65f6\u3001500\u3001DB \u6b7b\u9501\u53ef\u91cd\u8bd5&#xff1b;\u53c2\u6570\u975e\u6cd5\u3001\u4f59\u989d\u4e0d\u8db3\u3001\u5e42\u7b49\u51b2\u7a81\u4e0d\u53ef\u91cd\u8bd5&#xff0c;\u76f4\u63a5\u8fdb\u8865\u507f\/\u4eba\u5de5\u3002<\/li>\n<li>MQ \u6d88\u8d39\u5931\u8d25\u8d85\u8fc7 N \u6b21\u8fdb\u6b7b\u4fe1\u961f\u5217&#xff08;DLQ&#xff09;&#xff0c;\u914d\u544a\u8b66 &#043; \u91cd\u6295\u5de5\u5177\u3002\u6b7b\u4fe1\u6ca1\u4eba\u770b&#xff0c;\u7b49\u4e8e\u628a\u95ee\u9898\u626b\u8fdb\u5730\u6bef\u5e95\u4e0b\u3002<\/li>\n<li>\u6d88\u8d39\u7aef\u6c38\u8fdc\u5148\u5224\u5e42\u7b49\u518d\u5e72\u6d3b&#xff0c;\u5e72\u5b8c\u6d3b\u518d ack\u3002\u987a\u5e8f\u53cd\u4e86&#xff08;\u5148 ack \u540e\u5e72\u6d3b&#xff0c;\u6302\u4e86\u5c31\u4e22\u6d88\u606f&#xff09;&#xff0c;\u795e\u4ed9\u96be\u6551\u3002<\/li>\n<\/ul>\n<hr \/>\n<h3>11. \u9694\u79bb\u5728\u5206\u5e03\u5f0f\u4e0b&#xff1a;\u5168\u5c40\u9501\u3001\u5feb\u7167\u4e0e\u6b7b\u9501<\/h3>\n<p>\u5355\u673a\u9760\u9501 &#043; MVCC&#xff0c;\u5206\u5e03\u5f0f\u9760\u4ec0\u4e48&#xff1f;\u4e09\u6761\u8def&#xff1a;<\/p>\n<li>\u60b2\u89c2\u5168\u5c40\u9501&#xff08;Seata AT\/XA&#xff09;&#xff1a;\u5199\u524d\u95ee TC&#xff0c;\u884c\u88ab\u522b\u7684\u5168\u5c40\u4e8b\u52a1\u5360\u4e86\u5c31\u7b49\u3002\u7b80\u5355&#xff0c;\u4f46\u957f\u4e8b\u52a1\u5360\u7740\u5168\u5c40\u9501&#xff0c;TPS \u4e0a\u4e0d\u53bb&#xff0c;\u8fd8\u53ef\u80fd\u8de8\u670d\u52a1\u6b7b\u9501&#xff08;A \u7b49 B\u3001B \u7b49 A&#xff09;\u3002Seata \u9760\u8d85\u65f6 &#043; \u56de\u6eda\u6253\u7834&#xff0c;\u8d85\u65f6\u8bbe\u77ed\u4e86\u8bef\u6740&#xff0c;\u8bbe\u957f\u4e86\u5361\u6b7b&#xff0c;\u8981\u538b\u6d4b\u8c03\u3002<\/li>\n<li>\u4e50\u89c2 &#043; \u5feb\u7167&#xff08;Percolator\/TiDB&#xff09;&#xff1a;\u5404\u5199\u5404\u7684&#xff0c;\u63d0\u4ea4\u65f6\u68c0\u67e5\u201c\u6709\u6ca1\u6709\u4eba\u6bd4\u6211\u5148\u6539\u4e86\u540c\u4e00\u884c\u201d&#xff0c;\u6709\u5c31 whole \u4e8b\u52a1\u91cd\u8bd5\u3002\u51b2\u7a81\u5c11\u65f6\u541e\u5410\u6781\u9ad8&#xff0c;\u79d2\u6740\u3001\u70ed\u95e8\u5546\u54c1\u8fd9\u7c7b\u9ad8\u4e89\u7528\u573a\u666f\u91cd\u8bd5\u7387\u98d9\u5347&#xff0c;\u8981\u914d\u5408\u4e1a\u52a1\u5206\u6876&#xff08;\u5e93\u5b58\u5206\u591a\u884c\u3001\u6309\u6bb5\u6263\u51cf&#xff09;\u3002<\/li>\n<li>\u786e\u5b9a\u6027\u6392\u5e8f&#xff08;Calvin&#xff09;&#xff1a;\u63d0\u524d\u6392\u597d\u5e8f&#xff0c;\u6267\u884c\u65f6\u65e0\u9501\u3002\u6700\u5feb&#xff0c;\u4f46\u8981\u6c42\u4e8b\u52a1\u53ef\u9884\u77e5&#xff0c;\u4e0d\u9002\u5408\u5f00\u653e\u4e1a\u52a1\u3002<\/li>\n<p>\u5206\u5e03\u5f0f\u6b7b\u9501\u68c0\u6d4b\u662f\u4e2a\u810f\u6d3b&#xff1a;\u5355\u673a wait-for graph \u5168\u5c40\u4e0d\u53ef\u89c1&#xff0c;\u53ea\u80fd\u9760\u8d85\u65f6\u3002\u4f46\u8d85\u65f6\u8bef\u6740\u591a&#xff0c;\u5de5\u4e1a\u754c\u6298\u4e2d\u662f\u6309\u8d44\u6e90\u6392\u5e8f\u52a0\u9501 &#043; \u77ed\u8d85\u65f6 &#043; \u5feb\u901f\u91cd\u8bd5\u3002\u4e1a\u52a1\u5c42\u80fd\u505a\u7684&#xff1a;\u6240\u6709\u670d\u52a1\u6309\u540c\u4e00\u987a\u5e8f\u62ff\u8d44\u6e90&#xff08;\u5148 account \u540e stock&#xff0c;\u5168\u5c40\u7edf\u4e00&#xff09;&#xff0c;\u6b7b\u9501\u6982\u7387\u76f4\u63a5\u964d\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002<\/p>\n<p>\u5feb\u7167\u9694\u79bb&#xff08;SI&#xff09;\u5728\u5206\u5e03\u5f0f\u4e0b\u8fd8\u6709\u4e2a\u9690\u5f62\u5751&#xff1a;SI \u4e0d\u662f\u53ef\u4e32\u884c\u5316&#xff0c;\u5199\u504f\u659c\u7167\u6837\u53d1\u751f\u3002TiDB \u9ed8\u8ba4 SI&#xff0c;\u8981\u53ef\u4e32\u884c\u5316\u5f97\u5f00 tidb_txn_mode &#061; &#039;pessimistic&#039; \u6216\u663e\u5f0f SELECT &#8230; FOR UPDATE\u3002\u522b\u4ee5\u4e3a\u6362\u4e86\u5206\u5e03\u5f0f\u6570\u636e\u5e93\u5c31\u4e07\u4e8b\u5927\u5409&#xff0c;\u9694\u79bb\u7ea7\u522b\u8fd8\u662f\u8981\u663e\u5f0f\u9009\u3002<\/p>\n<hr \/>\n<h3>12. \u9009\u578b\u51b3\u7b56&#xff1a;\u6ca1\u6709\u94f6\u5f39&#xff0c;\u53ea\u6709\u6743\u8861<\/h3>\n<p>\u628a\u6240\u6709\u65b9\u6848\u653e\u5728\u4e00\u5f20\u8868\u91cc&#xff0c;\u9009\u578b\u65f6\u5bf9\u7740\u4e1a\u52a1\u7279\u5f81\u6253\u52fe\u3002<\/p>\n<table>\n<tr>\u7ef4\u5ea6XA\/2PCSeata ATTCCSaga \u7f16\u6392Outbox&#043;CDC\/\u4e8b\u52a1\u6d88\u606fDB \u539f\u751f&#xff08;TiDB\/Spanner&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>\u4e00\u81f4\u6027<\/td>\n<td>\u5f3a<\/td>\n<td>\u63a5\u8fd1\u5f3a&#xff08;\u8bfb\u672a\u63d0\u4ea4&#xff09;<\/td>\n<td>\u5f3a&#xff08;\u4e1a\u52a1\u5c42&#xff09;<\/td>\n<td>\u6700\u7ec8<\/td>\n<td>\u6700\u7ec8<\/td>\n<td>\u5f3a<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u7528\u6027&#xff08;\u5206\u533a\u65f6&#xff09;<\/td>\n<td>\u5dee&#xff08;\u963b\u585e&#xff09;<\/td>\n<td>\u4e2d<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8<\/td>\n<td>\u9ad8&#xff08;\u591a\u6570\u6d3e\u6d3b\u7740\u5c31\u884c&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u6027\u80fd\/\u541e\u5410<\/td>\n<td>\u4f4e&#xff08;\u9501\u4e45&#043;2\u6b21RTT&#xff09;<\/td>\n<td>\u4e2d\u9ad8<\/td>\n<td>\u9ad8&#xff08;\u65e0DB\u9501&#xff09;<\/td>\n<td>\u9ad8<\/td>\n<td>\u6700\u9ad8&#xff08;\u5f02\u6b65&#xff09;<\/td>\n<td>\u4e2d&#xff08;commit \u6709\u989d\u5916\u5f00\u9500&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u4e1a\u52a1\u4fb5\u5165<\/td>\n<td>\u4f4e<\/td>\n<td>\u4f4e<\/td>\n<td>\u9ad8<\/td>\n<td>\u4e2d<\/td>\n<td>\u4f4e-\u4e2d<\/td>\n<td>\u6781\u4f4e<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u6570\u636e<\/td>\n<td>\u5173\u7cfb\u5e93<\/td>\n<td>\u5173\u7cfb\u5e93<\/td>\n<td>\u4efb\u610f&#xff08;\u542bRPC&#xff09;<\/td>\n<td>\u4efb\u610f<\/td>\n<td>\u5f02\u6b65\u53ef\u63a5\u53d7<\/td>\n<td>\u5168\u6258\u7ba1\u65b0\u5e93<\/td>\n<\/tr>\n<tr>\n<td>\u5178\u578b\u573a\u666f<\/td>\n<td>\u540c\u673a\u623f\u591a\u5e93<\/td>\n<td>\u8de8\u5e93 CRUD<\/td>\n<td>\u94b1\u3001\u5238\u3001\u5e93\u5b58<\/td>\n<td>\u957f\u6d41\u7a0b\u5ba1\u6279\/\u65c5\u884c\u9884\u8ba2<\/td>\n<td>\u901a\u77e5\u3001\u8bb0\u8d26\u3001\u540c\u6b65<\/td>\n<td>\u65b0\u4e1a\u52a1\u3001\u5168\u7403\u90e8\u7f72<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u51b3\u7b56\u6811&#xff08;\u7167\u7740\u8d70&#xff0c;\u516b\u6210\u4e0d\u4f1a\u9519&#xff09;&#xff1a;<\/p>\n<p>#mermaid-svg-AaLwaVklfIvhXqUi{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AaLwaVklfIvhXqUi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AaLwaVklfIvhXqUi .error-icon{fill:#552222;}#mermaid-svg-AaLwaVklfIvhXqUi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AaLwaVklfIvhXqUi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AaLwaVklfIvhXqUi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AaLwaVklfIvhXqUi .marker.cross{stroke:#333333;}#mermaid-svg-AaLwaVklfIvhXqUi svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AaLwaVklfIvhXqUi p{margin:0;}#mermaid-svg-AaLwaVklfIvhXqUi .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-AaLwaVklfIvhXqUi .cluster-label text{fill:#333;}#mermaid-svg-AaLwaVklfIvhXqUi .cluster-label span{color:#333;}#mermaid-svg-AaLwaVklfIvhXqUi .cluster-label span p{background-color:transparent;}#mermaid-svg-AaLwaVklfIvhXqUi .label text,#mermaid-svg-AaLwaVklfIvhXqUi span{fill:#333;color:#333;}#mermaid-svg-AaLwaVklfIvhXqUi .node rect,#mermaid-svg-AaLwaVklfIvhXqUi .node circle,#mermaid-svg-AaLwaVklfIvhXqUi .node ellipse,#mermaid-svg-AaLwaVklfIvhXqUi .node polygon,#mermaid-svg-AaLwaVklfIvhXqUi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AaLwaVklfIvhXqUi .rough-node .label text,#mermaid-svg-AaLwaVklfIvhXqUi .node .label text,#mermaid-svg-AaLwaVklfIvhXqUi .image-shape .label,#mermaid-svg-AaLwaVklfIvhXqUi .icon-shape .label{text-anchor:middle;}#mermaid-svg-AaLwaVklfIvhXqUi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AaLwaVklfIvhXqUi .rough-node .label,#mermaid-svg-AaLwaVklfIvhXqUi .node .label,#mermaid-svg-AaLwaVklfIvhXqUi .image-shape .label,#mermaid-svg-AaLwaVklfIvhXqUi .icon-shape .label{text-align:center;}#mermaid-svg-AaLwaVklfIvhXqUi .node.clickable{cursor:pointer;}#mermaid-svg-AaLwaVklfIvhXqUi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AaLwaVklfIvhXqUi .arrowheadPath{fill:#333333;}#mermaid-svg-AaLwaVklfIvhXqUi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AaLwaVklfIvhXqUi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AaLwaVklfIvhXqUi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AaLwaVklfIvhXqUi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AaLwaVklfIvhXqUi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AaLwaVklfIvhXqUi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AaLwaVklfIvhXqUi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AaLwaVklfIvhXqUi .cluster text{fill:#333;}#mermaid-svg-AaLwaVklfIvhXqUi .cluster span{color:#333;}#mermaid-svg-AaLwaVklfIvhXqUi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AaLwaVklfIvhXqUi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AaLwaVklfIvhXqUi rect.text{fill:none;stroke-width:0;}#mermaid-svg-AaLwaVklfIvhXqUi .icon-shape,#mermaid-svg-AaLwaVklfIvhXqUi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AaLwaVklfIvhXqUi .icon-shape p,#mermaid-svg-AaLwaVklfIvhXqUi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AaLwaVklfIvhXqUi .icon-shape .label rect,#mermaid-svg-AaLwaVklfIvhXqUi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AaLwaVklfIvhXqUi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AaLwaVklfIvhXqUi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AaLwaVklfIvhXqUi :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u80fd&#xff0c;\u5ef6\u8fdf\u53ef\u63a5\u53d7<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u4e0d\u80fd&#xff0c;\u5b58\u91cf MySQL<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f&#xff0c;\u9ad8\u5e76\u53d1<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f&#xff0c;\u4f4e\u5e76\u53d1\u540c\u673a\u623f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f&#xff0c;\u957f\u6d41\u7a0b<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u5426&#xff0c;CRUD \u8de8\u5e93<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/p>\n<p>\u662f<\/p>\n<p><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u65b0\u9700\u6c42&#xff1a;\u8de8\u670d\u52a1\u5199\u591a\u5904<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u80fd\u6362\u6210\u5206\u5e03\u5f0f\u6570\u636e\u5e93?<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u7528 TiDB\/OceanBase \u539f\u751f\u4e8b\u52a1\u4e1a\u52a1\u96f6\u6539<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u8981\u5f3a\u9694\u79bb?\u94b1\/\u5e93\u5b58\u6263\u51cf<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>TCC\u51bb\u7ed3 &#043; \u5e42\u7b49\u4e09\u4ef6\u5957<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>XA \/ Seata XA<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u6d41\u7a0b\u957f?\u591a\u6b65\u53ef\u8865\u507f<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Saga \u7f16\u6392\u72b6\u6001\u673a &#043; \u8865\u507f &#043; \u5bf9\u8d26<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Seata AT\u9996\u9009&#xff0c;\u52a0 undo_log \u5373\u7528<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u4e0b\u6e38\u8fd8\u80fd\u5f02\u6b65?\u901a\u77e5\/\u8bb0\u8d26<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>\u518d\u53e0 Outbox&#043;CDC\u53d1 MQ \u89e3\u8026<\/p>\n<p><\/span><\/p>\n<p>\u4e09\u4e2a\u7aef\u5230\u7aef\u6848\u4f8b&#xff0c;\u6bcf\u4e2a\u90fd\u6309\u201c\u521d\u59cb\u6570\u636e\u2192\u6b63\u5e38\u8d70\u2192\u6302\u4e86\u600e\u4e48\u8865\u2192\u5bf9\u8d26\u600e\u4e48\u626b\u201d\u8bb2\u900f\u3002\u8868\u7ed3\u6784\u6cbf\u7528\u7b2c 8 \u7ae0\u90a3\u5957&#xff0c;\u8ba2\u5355\u53f7\u3001\u7528\u6237\u53f7\u5168\u5199\u6b7b&#xff0c;\u65b9\u4fbf\u5bf9\u7167\u3002<\/p>\n<h4>\u6848\u4f8b\u4e00&#xff1a;\u7535\u5546\u4e0b\u5355&#xff08;Seata AT &#043; Outbox&#xff0c;\u4e3b\u94fe\u8def\u540c\u6b65\u3001\u901a\u77e5\u5f02\u6b65&#xff09;<\/h4>\n<p>\u573a\u666f&#xff1a;\u7528\u6237 U100 \u4e0b\u5355 O2026001&#xff0c;\u4e70 SKU-A \u4e00\u4ef6 100 \u5143\u3002\u6d89\u53ca order-db&#xff08;\u8ba2\u5355&#xff09;\u3001account-db&#xff08;\u4f59\u989d&#xff09;\u3001stock-db&#xff08;\u5e93\u5b58&#xff09;\u3002\u8981\u6c42\u4e0b\u5355\u65f6\u4e09\u5904\u539f\u5b50&#xff0c;\u652f\u4ed8\u6210\u529f\u540e\u7684\u79ef\u5206\u3001\u4ed3\u50a8\u8d70 MQ \u5f02\u6b65\u3002<\/p>\n<p>\u521d\u59cb\u6570\u636e&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; account-db.account<\/span><br \/>\nuser_id <span class=\"token operator\">|<\/span> balance <span class=\"token operator\">|<\/span> frozen <span class=\"token operator\">|<\/span> version<br \/>\nU100    <span class=\"token operator\">|<\/span> <span class=\"token number\">500.00<\/span>  <span class=\"token operator\">|<\/span> <span class=\"token number\">0.00<\/span>   <span class=\"token operator\">|<\/span> <span class=\"token number\">10<\/span><\/p>\n<p><span class=\"token comment\">&#8212; stock-db.stock<\/span><br \/>\nsku     <span class=\"token operator\">|<\/span> available <span class=\"token operator\">|<\/span> frozen<br \/>\nSKU<span class=\"token operator\">&#8211;<\/span>A   <span class=\"token operator\">|<\/span> <span class=\"token number\">50<\/span>        <span class=\"token operator\">|<\/span> <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token comment\">&#8212; order-db.order_info&#xff1a;\u7a7a&#xff0c;\u8fd8\u6ca1\u8fd9\u5355<\/span><\/p>\n<p>\u6b63\u5e38\u6d41\u7a0b&#xff08;Seata AT&#xff09;&#xff1a;<\/p>\n<p><span class=\"token annotation punctuation\">&#064;GlobalTransactional<\/span><span class=\"token punctuation\">(<\/span>name <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;create-order&#034;<\/span><span class=\"token punctuation\">,<\/span> rollbackFor <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">Exception<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">createOrder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    orderDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;O2026001&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;TRYING&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5e931<\/span><br \/>\n    accountService<span class=\"token punctuation\">.<\/span><span class=\"token function\">deduct<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;U100&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/\/ RPC&#xff0c;XID \u900f\u4f20<\/span><br \/>\n    stockService<span class=\"token punctuation\">.<\/span><span class=\"token function\">freeze<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;SKU-A&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                 <span class=\"token comment\">\/\/ RPC&#xff0c;XID \u900f\u4f20<\/span><br \/>\n    orderDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">updateStatus<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;O2026001&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;PAID&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u6536\u5c3e<\/span><br \/>\n    outboxDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;order&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;O2026001&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;order_paid&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;{&#8230;}&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u540c\u5e93\u4e8b\u52a1<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>AT \u6846\u67b6\u5728\u80cc\u540e\u5e72\u7684\u4e8b&#xff08;\u4ee5 account \u5206\u652f\u4e3a\u4f8b&#xff09;&#xff1a;<\/p>\n<li>\u4ee3\u7406\u6570\u636e\u6e90\u62e6\u622a UPDATE account SET balance &#061; 400 WHERE user_id&#061;&#039;U100&#039;&#xff0c;\u5148 SELECT \u8bb0\u524d\u955c\u50cf&#xff08;500&#xff09;&#xff0c;\u6267\u884c\u540e\u8bb0\u540e\u955c\u50cf&#xff08;400&#xff09;&#xff0c;\u6253\u5305\u8fdb undo_log&#xff0c;key \u662f (xid, branch_id)\u3002<\/li>\n<li>\u53bb TC \u67e5\u5168\u5c40\u5199\u9501&#xff1a;SKU-A\u3001U100 \u8fd9\u4e24\u884c\u6709\u6ca1\u6709\u522b\u7684\u5168\u5c40\u4e8b\u52a1\u6ca1\u63d0\u4ea4&#xff1f;\u6ca1\u6709&#xff0c;\u653e\u884c&#xff0c;\u672c\u5730\u76f4\u63a5\u63d0\u4ea4&#xff08;\u6ce8\u610f&#xff0c;\u672c\u5730\u63d0\u4ea4\u4e86&#xff0c;\u4f46\u5168\u5c40\u8fd8\u6ca1\u63d0\u4ea4&#xff09;\u3002<\/li>\n<li>\u4e09\u4e2a\u5206\u652f\u90fd\u672c\u5730\u63d0\u4ea4\u5b8c&#xff0c;TM \u544a\u8bc9 TC \u201c\u63d0\u4ea4\u201d&#xff0c;TC \u8bb0\u5168\u5c40 COMMITTED&#xff0c;\u5f02\u6b65\u8ba9\u5404 RM \u5220 undo_log\u3002\u5220\u65e5\u5fd7\u662f\u540e\u53f0\u7ebf\u7a0b\u505a\u7684&#xff0c;\u6162\u51e0\u79d2\u6ca1\u5173\u7cfb\u3002<\/li>\n<p>\u8fd9\u65f6\u4e09\u5f20\u8868\u53d8\u6210&#xff1a;<\/p>\n<p>account&#xff1a;U100 <span class=\"token operator\">|<\/span> <span class=\"token number\">400.00<\/span> <span class=\"token operator\">|<\/span> <span class=\"token number\">0.00<\/span> <span class=\"token operator\">|<\/span> <span class=\"token number\">11<\/span><br \/>\nstock&#xff1a;  SKU<span class=\"token operator\">&#8211;<\/span>A <span class=\"token operator\">|<\/span> <span class=\"token number\">49<\/span>     <span class=\"token operator\">|<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token keyword\">order<\/span>&#xff1a;  O2026001 <span class=\"token operator\">|<\/span> PAID <span class=\"token operator\">|<\/span> xid<span class=\"token operator\">&#061;<\/span><span class=\"token number\">192.168<\/span><span class=\"token number\">.1<\/span><span class=\"token number\">.10<\/span>:<span class=\"token number\">8091<\/span>:<span class=\"token number\">123456<\/span><br \/>\noutbox&#xff1a; id<span class=\"token operator\">&#061;<\/span><span class=\"token number\">987<\/span> <span class=\"token operator\">|<\/span> order_paid <span class=\"token operator\">|<\/span> NEW<\/p>\n<p>CDC&#xff08;Canal\/Debezium&#xff09;\u6293\u5230 outbox \u7684 binlog&#xff0c;\u8f6c\u6210 MQ \u6d88\u606f order_paid(O2026001)&#xff0c;\u79ef\u5206\u670d\u52a1\u6d88\u8d39&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ \u79ef\u5206\u6d88\u8d39\u7aef&#xff1a;\u5148\u5224\u5e42\u7b49&#xff0c;\u518d\u5e72\u6d3b<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>consumedDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">exists<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;order_paid:O2026001&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u91cd\u590d\u6295\u9012\u76f4\u63a5\u4e22<\/span><br \/>\npointsDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;U100&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nconsumedDao<span class=\"token punctuation\">.<\/span><span class=\"token function\">insert<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;order_paid:O2026001&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u6545\u969c\u63a8\u6f14 A\u2014\u2014RM \u5728\u4e00\u9636\u6bb5\u540e\u6302\u4e86&#xff1a;account \u672c\u5730\u63d0\u4ea4\u4e86&#xff0c;stock \u8fd8\u6ca1\u6536\u5230\u4e8c\u9636\u6bb5&#xff0c;TC \u6302\u4e86\u3002\u91cd\u542f\u540e TC \u8bfb\u81ea\u5df1\u7684 global_table&#xff0c;\u53d1\u73b0 xid&#061;123456 \u72b6\u6001\u662f COMMITTING&#xff08;\u53ea\u8bb0\u4e86\u63d0\u4ea4\u51b3\u8bae&#xff0c;\u8fd8\u6ca1\u901a\u77e5\u5b8c&#xff09;&#xff0c;\u5c31\u91cd\u65b0\u7ed9 stock \u53d1 commit\u3002stock \u7684 RM \u542f\u52a8\u65f6\u626b\u672c\u5730 undo_log&#xff0c;\u53d1\u73b0 branch \u8fd8\u5728&#xff0c;\u76f4\u63a5\u95ee TC \u201c\u6211\u8fd9\u4e2a xid \u5230\u5e95\u63d0\u4ea4\u6ca1\u201d&#xff0c;TC \u7b54\u63d0\u4ea4&#xff0c;stock \u8865\u63d0\u4ea4\u3002\u6536\u655b\u9760\u7684\u662f\u201cTC \u7684\u51b3\u8bae\u8868 &#043; RM \u7684 undo \u8868\u201d\u4e24\u8fb9\u4e92\u76f8\u95ee&#xff0c;\u4e0d\u662f\u9760\u8fd0\u6c14\u3002<\/p>\n<p>\u6545\u969c\u63a8\u6f14 B\u2014\u2014\u4e0b\u6e38\u79ef\u5206\u6302\u4e86&#xff1a;MQ \u6309\u6307\u6570\u9000\u907f\u91cd\u8bd5 1s\u30015s\u300130s\u202616 \u6b21\u540e\u8fdb\u6b7b\u4fe1 DLQ%order_paid\u3002\u770b\u677f\u4e0a\u6b7b\u4fe1\u6570 &#043;1 \u5e76\u7535\u8bdd\u544a\u8b66&#xff0c;\u4eba\u5de5\u5728\u540e\u53f0\u70b9\u201c\u91cd\u6295\u201d&#xff0c;\u79ef\u5206\u670d\u52a1\u6062\u590d\u540e\u91cd\u65b0\u6d88\u8d39\u3002\u56e0\u4e3a\u6d88\u8d39\u7aef\u6709 consumed \u53bb\u91cd\u8868&#xff0c;\u91cd\u6295 10 \u904d\u4e5f\u53ea\u52a0 10 \u5206\u3002<\/p>\n<p>\u5bf9\u8d26 SQL&#xff08;\u6bcf\u5929 02:00 \u8dd1&#xff0c;\u626b\u60ac\u8d26&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; 1. \u8ba2\u5355 PAID \u4f46 outbox \u6ca1\u53d1\u51fa\u53bb&#xff08;CDC \u6389\u4e86&#xff09;<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> order_id <span class=\"token keyword\">FROM<\/span> order_info o<br \/>\n<span class=\"token keyword\">WHERE<\/span> o<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">status<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;PAID&#039;<\/span> <span class=\"token operator\">AND<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token keyword\">EXISTS<\/span><br \/>\n  <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">SELECT<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">FROM<\/span> outbox b <span class=\"token keyword\">WHERE<\/span> b<span class=\"token punctuation\">.<\/span>aggregate_id<span class=\"token operator\">&#061;<\/span>o<span class=\"token punctuation\">.<\/span>order_id <span class=\"token operator\">AND<\/span> b<span class=\"token punctuation\">.<\/span>event_type<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;order_paid&#039;<\/span> <span class=\"token operator\">AND<\/span> b<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">status<\/span> <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;NEW&#039;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#039;SENT&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n  <span class=\"token operator\">AND<\/span> o<span class=\"token punctuation\">.<\/span>gmt_create <span class=\"token operator\">&lt;<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token number\">10<\/span> <span class=\"token keyword\">MINUTE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 2. \u8ba2\u5355 TRYING \u8d85 30 \u5206\u949f&#xff08;\u5206\u652f Actions \u60ac\u6302&#xff0c;\u5927\u6982\u7387\u662f\u67d0 RPC \u4e22\u4e86 XID&#xff09;<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> order_id<span class=\"token punctuation\">,<\/span> xid <span class=\"token keyword\">FROM<\/span> order_info<br \/>\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token keyword\">status<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;TRYING&#039;<\/span> <span class=\"token operator\">AND<\/span> gmt_create <span class=\"token operator\">&lt;<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token number\">30<\/span> <span class=\"token keyword\">MINUTE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 3. \u94b1\u8d27\u5bf9\u4e0d\u4e0a&#xff1a;\u8ba2\u5355\u6536\u4e86 100&#xff0c;\u4f46\u8d26\u6237\u6ca1\u6263&#xff08;AT \u56de\u6eda\u5931\u8d25\u7684\u6781\u7aef\u60c5\u51b5&#xff09;<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> o<span class=\"token punctuation\">.<\/span>order_id <span class=\"token keyword\">FROM<\/span> order_info o <span class=\"token keyword\">JOIN<\/span> account_freeze f <span class=\"token keyword\">ON<\/span> f<span class=\"token punctuation\">.<\/span>order_id<span class=\"token operator\">&#061;<\/span>o<span class=\"token punctuation\">.<\/span>order_id<br \/>\n<span class=\"token keyword\">WHERE<\/span> o<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">status<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;PAID&#039;<\/span> <span class=\"token operator\">AND<\/span> f<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">status<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token string\">&#039;DEDUCTED&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u7b2c 2 \u6761\u626b\u51fa\u6765\u7684\u5355&#xff0c;\u4eba\u5de5\u770b Seata \u63a7\u5236\u53f0&#xff1a;\u5206\u652f\u7f3a\u4e86 stock&#xff0c;\u5c31\u624b\u5de5\u8c03 stockService.freeze \u8865\u4e0a\u6216\u5168\u5355 Cancel\u3002\u8fd9\u5c31\u662f\u7b2c 7 \u7ae0\u8bf4\u7684\u201c\u5bf9\u8d26\u662f\u6700\u540e\u4e00\u9053\u7f51\u201d\u2014\u2014AT \u518d\u987a\u6ed1&#xff0c;\u4e5f\u4e0d\u80fd\u7701\u3002<\/p>\n<h4>\u6848\u4f8b\u4e8c&#xff1a;\u94f6\u884c\u8f6c\u8d26 A\u2192B 100 \u5143&#xff08;TCC&#xff0c;\u5f3a\u9694\u79bb\u3001\u9ad8\u5e76\u53d1&#xff09;<\/h4>\n<p>\u573a\u666f&#xff1a;A&#xff08;uid&#061;1&#xff09;\u7ed9 B&#xff08;uid&#061;2&#xff09;\u8f6c 100\u3002\u4f59\u989d\u8868\u5c31\u662f\u7b2c 8 \u7ae0\u7684 account(balance, frozen) &#043; account_freeze \u660e\u7ec6\u3002\u8981\u6c42\u5e76\u53d1\u4e0b\u4e0d\u80fd\u8d85\u6263&#xff0c;\u8d85\u65f6\u91cd\u8bd5\u4e0d\u80fd\u591a\u6263\u3002<\/p>\n<p>\u521d\u59cb&#xff1a;A: balance&#061;1000 frozen&#061;0&#xff0c;B: balance&#061;200 frozen&#061;0\u3002<\/p>\n<p>Try \u9636\u6bb5&#xff08;\u51bb\u7ed3&#xff0c;\u4e0d\u771f\u6263&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; Try(A)&#xff1a;\u540c\u4e00\u4e8b\u52a1\u5199\u4e24\u884c<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> account <span class=\"token keyword\">SET<\/span> frozen <span class=\"token operator\">&#061;<\/span> frozen <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">AND<\/span> balance <span class=\"token operator\">&#8211;<\/span> frozen <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> account_freeze<span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">,<\/span> order_id<span class=\"token punctuation\">,<\/span> amount<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">status<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TX2026001-A&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;FROZEN&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> tx_state<span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> branch_key<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;xid-tcc-001&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TX2026001-A&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TRY_DONE&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; Try(B)&#xff1a;\u5165\u8d26\u989d\u5ea6\u4e5f\u5148\u51bb\u7ed3&#xff08;\u9632\u6b62 B \u8d26\u6237\u88ab\u51bb\u7ed3\/\u9500\u6237\u8fd8\u6562\u6536&#xff09;<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> account_freeze<span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">,<\/span> order_id<span class=\"token punctuation\">,<\/span> amount<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">status<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TX2026001-B&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;FROZEN&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> tx_state<span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> branch_key<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;xid-tcc-001&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TX2026001-B&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TRY_DONE&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd9\u65f6\u67e5\u8d26&#xff1a;A \u53ef\u7528&#061;900&#xff08;1000-100&#xff09;&#xff0c;B \u53ef\u7528\u8fd8\u662f 200&#xff08;\u5165\u8d26\u51bb\u7ed3\u4e0d\u589e\u52a0\u53ef\u7528&#xff09;\u3002\u522b\u7684\u8f6c\u8d26\u60f3\u52a8 A&#xff0c;\u53ea\u80fd\u770b\u5230 900 \u53ef\u7528&#xff0c;\u8d85\u6263\u88ab balance &#8211; frozen &gt;&#061; 100 \u6321\u6389\u2014\u2014\u8fd9\u5c31\u662f TCC \u7528\u4e1a\u52a1\u51bb\u7ed3\u4ee3\u66ff DB \u884c\u9501\u7684\u7cbe\u9ad3\u3002<\/p>\n<p>Confirm \u9636\u6bb5&#xff08;\u5168 Try \u6210\u529f\u624d\u8fdb&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; Confirm(A)&#xff1a;\u5b9e\u6263<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> account <span class=\"token keyword\">SET<\/span> balance <span class=\"token operator\">&#061;<\/span> balance <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> frozen <span class=\"token operator\">&#061;<\/span> frozen <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> account_freeze <span class=\"token keyword\">SET<\/span> <span class=\"token keyword\">status<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;DEDUCTED&#039;<\/span> <span class=\"token keyword\">WHERE<\/span> order_id<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;TX2026001-A&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> tx_state <span class=\"token keyword\">SET<\/span> state<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;CONFIRM_DONE&#039;<\/span> <span class=\"token keyword\">WHERE<\/span> xid<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;xid-tcc-001&#039;<\/span> <span class=\"token operator\">AND<\/span> branch_key<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;TX2026001-A&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">&#8212; Confirm(B)&#xff1a;\u5b9e\u52a0<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> account <span class=\"token keyword\">SET<\/span> balance <span class=\"token operator\">&#061;<\/span> balance <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> account_freeze <span class=\"token keyword\">SET<\/span> <span class=\"token keyword\">status<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;DEDUCTED&#039;<\/span> <span class=\"token keyword\">WHERE<\/span> order_id<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;TX2026001-B&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u7ec8\u6001&#xff1a;A: 900\/0&#xff0c;B: 300\/0\u3002<\/p>\n<p>\u6545\u969c\u63a8\u6f14\u2014\u2014\u7a7a\u56de\u6eda&#xff08;\u751f\u4ea7\u6700\u5e38\u89c1\u7684 TCC \u4e8b\u6545&#xff09;&#xff1a;Try(A) \u7684 RPC \u5305\u5728\u7f51\u7edc\u91cc\u5835\u4e86 6 \u79d2&#xff0c;\u534f\u8c03\u8005 3 \u79d2\u8d85\u65f6&#xff0c;\u5224\u5b9a\u5168\u5c40\u5931\u8d25&#xff0c;\u7ed9 A \u53d1 Cancel\u3002A \u67e5 tx_state \u65e0\u8bb0\u5f55&#xff0c;\u6309\u89c4\u77e9\u8bb0\u7a7a\u56de\u6eda\u5e76\u56de\u6210\u529f&#xff1a;<\/p>\n<p><span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> tx_state<span class=\"token punctuation\">(<\/span>xid<span class=\"token punctuation\">,<\/span> branch_key<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;xid-tcc-001&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;TX2026001-A&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;CANCEL_DONE&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">&#8212; account_freeze \u65e0\u884c&#xff0c;\u4e0d\u89e3\u51bb&#xff0c;\u76f4\u63a5\u8fd4\u56de\u6210\u529f<\/span><\/p>\n<p>\u7b2c 7 \u79d2&#xff0c;\u8fdf\u5230\u7684 Try(A) \u7ec8\u4e8e\u5230\u4e86\u3002A \u5148\u67e5 tx_state&#xff0c;\u53d1\u73b0\u5df2\u6709 CANCEL_DONE&#xff0c;\u76f4\u63a5\u62d2\u7edd&#xff0c;\u4e0d\u5199\u51bb\u7ed3\u3002\u8fd9\u5355\u7684\u94b1\u6ca1\u88ab frozen \u4f4f&#xff0c;\u4e5f\u5c31\u6ca1\u6709\u60ac\u6302\u3002\u5982\u679c\u6ca1\u8fd9\u4e00\u6b65&#xff0c;Try \u540e\u5230\u771f\u51bb\u7ed3\u4e86 100&#xff0c;\u4f46\u5168\u5c40\u65e9\u5df2\u7ed3\u675f&#xff0c;\u8fd9 100 \u5c31\u6c38\u8fdc frozen\u2014\u2014\u7ebf\u4e0a\u7ba1\u8fd9\u4e2a\u53eb\u201c\u94b1\u4e22\u4e86\u201d&#xff0c;DBA \u8981\u624b\u5de5 RELEASED\u3002<\/p>\n<p>A \u8d26\u6237\u670d\u52a1\u534f\u8c03\u8005A \u8d26\u6237\u670d\u52a1\u534f\u8c03\u8005#mermaid-svg-IRvYiHpDNsJxCMlj{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IRvYiHpDNsJxCMlj .error-icon{fill:#552222;}#mermaid-svg-IRvYiHpDNsJxCMlj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IRvYiHpDNsJxCMlj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IRvYiHpDNsJxCMlj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IRvYiHpDNsJxCMlj .marker.cross{stroke:#333333;}#mermaid-svg-IRvYiHpDNsJxCMlj svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IRvYiHpDNsJxCMlj p{margin:0;}#mermaid-svg-IRvYiHpDNsJxCMlj .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IRvYiHpDNsJxCMlj text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IRvYiHpDNsJxCMlj .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-IRvYiHpDNsJxCMlj .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-IRvYiHpDNsJxCMlj #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-IRvYiHpDNsJxCMlj .sequenceNumber{fill:white;}#mermaid-svg-IRvYiHpDNsJxCMlj #sequencenumber{fill:#333;}#mermaid-svg-IRvYiHpDNsJxCMlj #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-IRvYiHpDNsJxCMlj .messageText{fill:#333;stroke:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IRvYiHpDNsJxCMlj .labelText,#mermaid-svg-IRvYiHpDNsJxCMlj .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .loopText,#mermaid-svg-IRvYiHpDNsJxCMlj .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IRvYiHpDNsJxCMlj .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IRvYiHpDNsJxCMlj .noteText,#mermaid-svg-IRvYiHpDNsJxCMlj .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-IRvYiHpDNsJxCMlj .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IRvYiHpDNsJxCMlj .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IRvYiHpDNsJxCMlj .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IRvYiHpDNsJxCMlj .actorPopupMenu{position:absolute;}#mermaid-svg-IRvYiHpDNsJxCMlj .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 \/ 0.4));}#mermaid-svg-IRvYiHpDNsJxCMlj .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IRvYiHpDNsJxCMlj .actor-man circle,#mermaid-svg-IRvYiHpDNsJxCMlj line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-IRvYiHpDNsJxCMlj :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}3s \u8d85\u65f6&#xff0c;\u5224\u5168\u5c40\u5931\u8d25Try freeze(A,100)&#xff08;\u5305\u5835\u5728\u8def\u4e0a&#xff09;1Cancel xid-tcc-0012\u65e0 TRY \u8bb0\u5f55&#xff0c;\u8bb0 CANCEL \u7a7a\u56de\u6eda\u56de\u6210\u529f3Try freeze(A,100)&#xff08;\u8fdf\u5230 7s \u5230\u8fbe&#xff09;4\u67e5\u5230 CANCEL_DONE\u62d2\u7edd\u51bb\u7ed3&#xff0c;\u56de\u5931\u8d25\u4f46\u4e0d\u6539\u8d265<\/p>\n<p>Cancel \u7684 SQL \u540c\u6837\u8981\u5e42\u7b49&#xff1a;UPDATE account_freeze SET status&#061;&#039;RELEASED&#039; WHERE order_id&#061;? AND status&#061;&#039;FROZEN&#039;&#xff0c;\u91cd\u590d\u8c03\u7b2c\u4e8c\u6b21 status \u5df2\u662f RELEASED&#xff0c;\u5f71\u54cd 0 \u884c&#xff0c;\u76f4\u63a5\u56de\u6210\u529f\u5373\u53ef\u3002\u91d1\u989d\u4e00\u5f8b DECIMAL(18,2)&#xff0c;\u522b\u7528 float\/double&#xff0c;\u5bf9\u8d26\u5dee\u4e00\u5206&#xff0c;\u94f6\u884c\u80fd\u628a\u7535\u8bdd\u6253\u7206\u3002<\/p>\n<h4>\u6848\u4f8b\u4e09&#xff1a;\u65c5\u884c\u9884\u8ba2\u673a\u7968&#043;\u9152\u5e97&#043;\u79df\u8f66&#xff08;Saga \u7f16\u6392&#xff0c;\u8865\u507f\u4e0d\u7b49\u4ef7&#xff09;<\/h4>\n<p>\u573a\u666f&#xff1a;\u8ba2\u5355 T2026001&#xff0c;\u4e09\u6b65&#xff1a;T1 \u8ba2\u673a\u7968 800 \u5143\u3001T2 \u8ba2\u9152\u5e97 400 \u5143\u3001T3 \u79df\u8f66 200 \u5143\u3002\u6bcf\u6b65\u672c\u5730\u63d0\u4ea4&#xff0c;\u5931\u8d25\u5012\u7740\u8865\u507f\u3002\u6ce8\u610f\u8865\u507f\u4e0d\u662f\u56de\u6eda&#xff0c;\u662f\u201c\u518d\u505a\u4e00\u7b14\u9006\u5411\u4e1a\u52a1\u201d\u3002<\/p>\n<p>\u6b63\u5e38\u6d41&#xff1a;<\/p>\n<p>#mermaid-svg-z7cmAYn60634ApwE{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z7cmAYn60634ApwE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z7cmAYn60634ApwE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z7cmAYn60634ApwE .error-icon{fill:#552222;}#mermaid-svg-z7cmAYn60634ApwE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z7cmAYn60634ApwE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z7cmAYn60634ApwE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z7cmAYn60634ApwE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z7cmAYn60634ApwE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z7cmAYn60634ApwE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z7cmAYn60634ApwE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z7cmAYn60634ApwE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z7cmAYn60634ApwE .marker.cross{stroke:#333333;}#mermaid-svg-z7cmAYn60634ApwE svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z7cmAYn60634ApwE p{margin:0;}#mermaid-svg-z7cmAYn60634ApwE .label{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;color:#333;}#mermaid-svg-z7cmAYn60634ApwE .cluster-label text{fill:#333;}#mermaid-svg-z7cmAYn60634ApwE .cluster-label span{color:#333;}#mermaid-svg-z7cmAYn60634ApwE .cluster-label span p{background-color:transparent;}#mermaid-svg-z7cmAYn60634ApwE .label text,#mermaid-svg-z7cmAYn60634ApwE span{fill:#333;color:#333;}#mermaid-svg-z7cmAYn60634ApwE .node rect,#mermaid-svg-z7cmAYn60634ApwE .node circle,#mermaid-svg-z7cmAYn60634ApwE .node ellipse,#mermaid-svg-z7cmAYn60634ApwE .node polygon,#mermaid-svg-z7cmAYn60634ApwE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z7cmAYn60634ApwE .rough-node .label text,#mermaid-svg-z7cmAYn60634ApwE .node .label text,#mermaid-svg-z7cmAYn60634ApwE .image-shape .label,#mermaid-svg-z7cmAYn60634ApwE .icon-shape .label{text-anchor:middle;}#mermaid-svg-z7cmAYn60634ApwE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z7cmAYn60634ApwE .rough-node .label,#mermaid-svg-z7cmAYn60634ApwE .node .label,#mermaid-svg-z7cmAYn60634ApwE .image-shape .label,#mermaid-svg-z7cmAYn60634ApwE .icon-shape .label{text-align:center;}#mermaid-svg-z7cmAYn60634ApwE .node.clickable{cursor:pointer;}#mermaid-svg-z7cmAYn60634ApwE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z7cmAYn60634ApwE .arrowheadPath{fill:#333333;}#mermaid-svg-z7cmAYn60634ApwE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z7cmAYn60634ApwE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z7cmAYn60634ApwE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z7cmAYn60634ApwE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z7cmAYn60634ApwE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z7cmAYn60634ApwE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z7cmAYn60634ApwE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z7cmAYn60634ApwE .cluster text{fill:#333;}#mermaid-svg-z7cmAYn60634ApwE .cluster span{color:#333;}#mermaid-svg-z7cmAYn60634ApwE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z7cmAYn60634ApwE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z7cmAYn60634ApwE rect.text{fill:none;stroke-width:0;}#mermaid-svg-z7cmAYn60634ApwE .icon-shape,#mermaid-svg-z7cmAYn60634ApwE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z7cmAYn60634ApwE .icon-shape p,#mermaid-svg-z7cmAYn60634ApwE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z7cmAYn60634ApwE .icon-shape .label rect,#mermaid-svg-z7cmAYn60634ApwE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z7cmAYn60634ApwE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z7cmAYn60634ApwE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z7cmAYn60634ApwE :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"edgeLabel\"><\/span><span class=\"nodeLabel\"><\/p>\n<p>T1&#xff1a;\u673a\u7968\u51fa\u7968CA1234 \u5ea7 12A<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>T2&#xff1a;\u9152\u5e97\u9884\u8ba2\u5e0c\u5c14\u987f 1 \u665a<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>T3&#xff1a;\u79df\u8f66\u9884\u8ba2\u795e\u5dde 1 \u5929<\/p>\n<p><\/span><span class=\"nodeLabel\"><\/p>\n<p>Saga Succeed\u4e09\u5355\u5168 CONFIRMED<\/p>\n<p><\/span><\/p>\n<p>\u72b6\u6001\u8868&#xff08;Saga \u6267\u884c\u5668\u81ea\u5df1\u7ef4\u62a4&#xff0c;\u548c\u4e1a\u52a1\u8868\u5206\u5f00&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">&#8212; saga_log<\/span><br \/>\nsaga_id  <span class=\"token operator\">|<\/span> step <span class=\"token operator\">|<\/span> <span class=\"token keyword\">action<\/span>     <span class=\"token operator\">|<\/span> <span class=\"token keyword\">status<\/span>    <span class=\"token operator\">|<\/span> payload<br \/>\nT2026001 <span class=\"token operator\">|<\/span> <span class=\"token number\">1<\/span>    <span class=\"token operator\">|<\/span> book_flight <span class=\"token operator\">|<\/span> DONE    <span class=\"token operator\">|<\/span> \u7968\u53f7 CA1234<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">12<\/span>A<br \/>\nT2026001 <span class=\"token operator\">|<\/span> <span class=\"token number\">2<\/span>    <span class=\"token operator\">|<\/span> book_hotel  <span class=\"token operator\">|<\/span> DONE    <span class=\"token operator\">|<\/span> \u8ba2\u5355 H<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">8899<\/span><br \/>\nT2026001 <span class=\"token operator\">|<\/span> <span class=\"token number\">3<\/span>    <span class=\"token operator\">|<\/span> book_car    <span class=\"token operator\">|<\/span> DOING   <span class=\"token operator\">|<\/span> <span class=\"token operator\">&#8211;<\/span><\/p>\n<p>\u6545\u969c&#xff1a;T3 \u79df\u8f66\u6ca1\u8f66\u4e86&#xff0c;\u8fd4\u56de\u201c\u5e93\u5b58\u4e0d\u8db3\u201d&#xff08;\u4e0d\u53ef\u91cd\u8bd5\u9519\u8bef&#xff09;\u3002\u6267\u884c\u5668\u67e5 saga_log&#xff0c;\u5012\u5e8f\u8865\u507f&#xff1a;<\/p>\n<li>C2 \u9000\u9152\u5e97&#xff1a;\u8c03\u9152\u5e97\u201c\u53d6\u6d88 H-8899\u201d&#xff0c;\u514d\u8d39\u53d6\u6d88&#xff08;\u9152\u5e97\u653f\u7b56 18 \u70b9\u524d\u514d\u8d39&#xff09;&#xff0c;saga_log step2 \u2192 COMPENSATED\u3002<\/li>\n<li>C1 \u9000\u673a\u7968&#xff1a;\u8c03\u822a\u53f8\u201c\u9000 CA1234-12A\u201d&#xff0c;\u6536 10% \u624b\u7eed\u8d39 80 \u5143\u3002\u6ce8\u610f\u8fd9\u91cc\u8865\u507f\u4e0d\u7b49\u4ef7&#xff1a;\u6b63\u5411\u6263 800&#xff0c;\u8865\u507f\u53ea\u56de 720\u3002\u6267\u884c\u5668\u8981\u518d\u5199\u4e00\u7b14 refund_fee \u8bb0\u5f55&#xff0c;\u5e76\u7ed9\u7528\u6237\u53d1\u77ed\u4fe1\u201c\u673a\u7968\u9000\u7968\u8d39 80 \u5143\u5df2\u6263\u9664\u201d\u3002<\/li>\n<p><span class=\"token comment\">&#8212; \u8865\u507f\u540e\u4e1a\u52a1\u8868<\/span><br \/>\nflight_order&#xff1a;CA1234<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">12<\/span>A <span class=\"token operator\">|<\/span> REFUNDED <span class=\"token operator\">|<\/span> refund<span class=\"token operator\">&#061;<\/span><span class=\"token number\">720<\/span> fee<span class=\"token operator\">&#061;<\/span><span class=\"token number\">80<\/span><br \/>\nhotel_order&#xff1a; H<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">8899<\/span>      <span class=\"token operator\">|<\/span> CANCELED <span class=\"token operator\">|<\/span> refund<span class=\"token operator\">&#061;<\/span><span class=\"token number\">400<\/span><br \/>\ncar_order&#xff1a;   <span class=\"token operator\">&#8211;<\/span>           <span class=\"token operator\">|<\/span> FAILED   <span class=\"token operator\">|<\/span> <span class=\"token operator\">&#8211;<\/span><br \/>\nsaga_log&#xff1a;   T2026001    <span class=\"token operator\">|<\/span> COMPENSATED <span class=\"token operator\">|<\/span><\/p>\n<p>\u5982\u679c C1 \u9000\u7968\u63a5\u53e3\u4e5f 500 \u4e86&#xff08;\u8865\u507f\u5931\u8d25&#xff09;&#xff0c;Saga \u8fdb Failed_Need_Manual&#xff0c;\u8bb0\u6b7b\u4fe1 &#043; \u7535\u8bdd\u544a\u8b66&#xff0c;\u6267\u884c\u5668\u6309 5min\u300130min\u30012h \u91cd\u8bd5\u8865\u507f&#xff0c;\u6700\u591a 24 \u5c0f\u65f6\u3002\u8d85\u8fc7\u8fd8\u4e0d\u884c&#xff0c;\u8f6c\u4eba\u5de5&#xff1a;\u5728\u540e\u53f0\u9732\u51fa\u201c\u7968\u53f7&#043;\u9000\u7968\u94fe\u63a5\u201d&#xff0c;\u5ba2\u670d\u624b\u5de5\u9000\u3002Saga \u4e0a\u7ebf\u5fc5\u987b\u914d\u8fd9\u4e2a\u4eba\u5de5\u53f0&#xff0c;\u4e0d\u7136\u7b2c\u4e00\u4e2a\u8865\u507f\u5931\u8d25\u5c31\u80fd\u628a\u7cfb\u7edf\u62d6\u6b7b\u3002<\/p>\n<p>\u534f\u540c\u5f0f vs \u7f16\u6392\u5f0f\u7684\u8840\u6cea&#xff1a;\u65e9\u671f\u6709\u7528\u534f\u540c\u5f0f&#xff08;\u673a\u7968\u8ba2\u5b8c\u53d1 flight_booked \u4e8b\u4ef6&#xff0c;\u9152\u5e97\u76d1\u542c&#xff09;&#xff0c;\u51fa\u95ee\u9898\u67e5\u4e00\u5355\u8981\u7ffb\u4e09\u4e2a\u670d\u52a1\u7684\u65e5\u5fd7&#xff0c;XID \u8fd8\u4e32\u4e0d\u8d77\u6765\u3002\u6539\u7f16\u6392\u5f0f\u540e&#xff0c;\u6267\u884c\u5668\u4e00\u5f20 saga_log \u8868\u5c31\u662f\u5168\u94fe\u8def&#xff0c;\u5ba2\u670d\u8f93\u5165 saga_id&#xff0c;\u4e00\u5c4f\u770b\u5230\u54ea\u6b65\u6302\u3001\u8865\u5230\u54ea\u3002\u8fd9\u5c31\u662f\u7b2c 6 \u7ae0\u63a8\u8350\u751f\u4ea7\u7528\u7f16\u6392\u5f0f\u7684\u539f\u56e0\u2014\u2014\u4e0d\u662f\u6027\u80fd&#xff0c;\u662f\u53ef\u89c2\u6d4b\u3002<\/p>\n<h4>\u6848\u4f8b\u56db&#xff1a;XA \u60ac\u6302\u6551\u706b&#xff08;\u534a\u591c DBA \u88ab\u53eb\u8d77\u6765\u7684\u90a3\u6b21&#xff09;<\/h4>\n<p>\u573a\u666f&#xff1a;\u5355\u4f53 &#043; \u53cc\u5e93&#xff08;order \u5e93\u3001points \u5e93&#xff09;&#xff0c;JTA\/XA \u8de8\u5e93\u3002\u67d0\u5929\u53d1\u5e03\u540e&#xff0c;SHOW ENGINE INNODB STATUS \u91cc\u4e00\u5806 PREPARED \u4e8b\u52a1&#xff0c;\u8ba2\u5355\u8868\u51e0\u884c\u88ab\u9501\u6b7b&#xff0c;\u65b0\u5355\u5168\u8d85\u65f6\u3002<\/p>\n<p>\u590d\u76d8\u65f6\u95f4\u7ebf&#xff1a;<\/p>\n<li>22:10 TM \u53d1 prepare&#xff0c;\u53cc\u5e93\u56de YES&#xff0c;\u5404\u5360\u884c\u9501\u3002<\/li>\n<li>22:10:03 TM \u5199 commit \u65e5\u5fd7\u524d&#xff0c;\u4e1a\u52a1 pod \u88ab\u6eda\u52a8\u53d1\u5e03 kill -9&#xff0c;commit \u6ca1\u53d1\u51fa\u53bb\u3002<\/li>\n<li>22:10 \u8d77&#xff0c;\u4e24\u5e93\u7684\u5206\u652f\u4e00\u76f4 PREPARED&#xff0c;holding \u884c\u9501\u3002\u522b\u7684\u4e8b\u52a1\u60f3\u6539\u540c\u4e00\u6279\u8ba2\u5355\u884c&#xff0c;SELECT &#8230; FOR UPDATE \u5168\u90e8\u7b49\u5f85\u3002<\/li>\n<li>22:35 \u76d1\u63a7\u62a5\u201c\u9501\u7b49\u5f85\u8d85\u65f6\u6fc0\u589e\u201d&#xff0c;DBA \u4e0a\u7ebf&#xff1a;XA RECOVER \u5217\u51fa 37 \u4e2a\u60ac\u6302 xid&#xff0c;\u5bf9\u7740 TM \u7684\u65e5\u5fd7&#xff08;\u4ece\u65e7 pod \u7684\u78c1\u76d8\u91cc\u6252\u51fa\u6765&#xff09;\u9010\u4e2a\u786e\u8ba4&#xff1a;\u51e1 TM \u65e5\u5fd7\u91cc\u6709 commit \u610f\u56fe\u7684&#xff0c;\u624b\u5de5 XA COMMIT &#039;xid&#039;&#xff1b;\u6ca1\u51b3\u8bae\u7684&#xff0c;XA ROLLBACK &#039;xid&#039;\u3002<\/li>\n<li>23:05 \u9501\u91ca\u653e&#xff0c;\u4e1a\u52a1\u6062\u590d\u3002\u4e8b\u540e\u8865\u4e86\u4e24\u6761\u89c4\u77e9&#xff1a;TM \u5207 DB \u5b58\u50a8&#xff08;\u539f\u6765 file&#xff0c;pod \u91cd\u5efa\u65e5\u5fd7\u5c31\u6ca1\u4e86&#xff09;\u3001\u53d1\u5e03\u524d\u5148 kubectl drain \u7b49\u4e8b\u52a1\u6392\u7a7a\u3002<\/li>\n<p>\u8fd9\u4e2a\u6848\u4f8b\u5c31\u662f 2PC \u963b\u585e\u7684\u6d3b\u6807\u672c&#xff1a;\u53c2\u4e0e\u8005\u56de\u4e86 YES \u5c31\u4e0d\u80fd\u5355\u65b9\u9762\u53cd\u6094&#xff0c;\u53ea\u80fd\u7b49\u8001\u5927\u53d1\u8bdd&#xff0c;\u8001\u5927\u6ca1\u4e86\u5c31\u5168\u50f5\u4f4f\u3002 \u6240\u4ee5\u8de8\u670d\u52a1\u3001\u8de8\u673a\u623f\u3001\u53d1\u7248\u9891\u7e41\u7684\u4e1a\u52a1&#xff0c;\u522b\u7528 XA&#xff1b;\u771f\u8981\u7528&#xff0c;\u628a TM \u7684\u5b58\u50a8\u3001\u6062\u590d\u3001\u624b\u5de5\u5bf9\u8d26 SOP \u5148\u51c6\u5907\u597d\u3002<\/p>\n<hr \/>\n<h3>13. \u53ef\u89c2\u6d4b\u3001\u6d4b\u8bd5\u4e0e\u8fd0\u7ef4&#xff1a;\u4e8b\u52a1\u505a\u5bf9\u4e86&#xff0c;\u8fd8\u8981\u770b\u5f97\u89c1<\/h3>\n<p>\u5206\u5e03\u5f0f\u4e8b\u52a1\u6700\u6015\u201c\u4ee5\u4e3a\u6210\u4e86&#xff0c;\u5176\u5b9e\u6ca1\u6210\u201d\u3002\u53ef\u89c2\u6d4b\u662f\u548c\u534f\u8bae\u540c\u7b49\u91cd\u8981\u7684\u53e6\u4e00\u534a\u3002<\/p>\n<p>\u5fc5\u5907\u4e09\u4ef6\u5957&#xff1a;<\/p>\n<li>\u5168\u5c40 XID \u5168\u94fe\u8def\u900f\u4f20 &#043; \u65e5\u5fd7&#xff1a;\u6240\u6709\u65e5\u5fd7\u7b2c\u4e00\u4f4d\u6253 XID&#xff0c;ELK \u91cc grep xid \u5c31\u80fd\u4e32\u8d77\u8de8 5 \u4e2a\u670d\u52a1\u7684\u5b8c\u6574\u8c03\u7528\u94fe\u3002\u5f02\u6b65\u7ebf\u7a0b\u3001MQ \u6d88\u606f\u5934\u90fd\u8981\u5e26&#xff0c;\u4e22\u4e00\u6bb5\u94fe\u5c31\u65ad\u4e86\u3002<\/li>\n<li>\u4e8b\u52a1\u770b\u677f&#xff1a;\u5168\u5c40\u4e8b\u52a1\u6570\u3001\u5206\u652f\u6570\u3001\u4e8c\u9636\u6bb5\u8017\u65f6\u3001\u56de\u6eda\u7387\u3001\u60ac\u6302\u4e8b\u52a1\u6570&#xff08;TRYING \u8d85\u9608\u503c&#xff09;\u3001\u6b7b\u4fe1\u6570\u3002\u56de\u6eda\u7387\u7a81\u589e\u5f80\u5f80\u662f\u4e0b\u6e38\u6302\u4e86\u7684\u6700\u65e9\u4fe1\u53f7&#xff0c;\u6bd4\u4e1a\u52a1\u62a5\u8b66\u8fd8\u5feb\u3002<\/li>\n<li>\u5bf9\u8d26 &#043; \u7ec8\u6001\u5de1\u68c0&#xff1a;\u6bcf\u5929 SELECT * FROM order_info WHERE status&#061;&#039;TRYING&#039; AND gmt_create &lt; NOW() &#8211; INTERVAL 30 MINUTE&#xff0c;\u9010\u6761\u4eba\u5de5\u6216\u81ea\u52a8\u51b2\u6b63\u3002\u94b1\u76f8\u5173\u7684\u8868&#xff0c;\u5bf9\u8d26 SQL \u8981\u548c\u6b63\u5411\u903b\u8f91\u7531\u4e24\u4e2a\u4eba\u5199&#xff0c;\u9632\u6b62\u540c\u9519\u3002<\/li>\n<p>\u6d4b\u8bd5\u6e05\u5355&#xff08; chaos \u5fc5\u505a&#xff09;&#xff1a;<\/p>\n<ul>\n<li>kill -9 \u968f\u673a\u6740&#xff1a;\u4e00\u9636\u6bb5\u4e2d\u95f4\u6740 TM\u3001\u4e00\u9636\u6bb5\u4e2d\u95f4\u6740 RM\u3001\u4e8c\u9636\u6bb5\u4e2d\u95f4\u6740 TC&#xff0c;\u770b\u6062\u590d\u540e\u80fd\u5426\u6536\u655b\u3002Seata \u7684 file\/store\/db \u4e09\u79cd\u5b58\u50a8\u6062\u590d\u8def\u5f84\u90fd\u8981\u6d4b\u3002<\/li>\n<li>\u7f51\u7edc\u5206\u533a &#043; \u65f6\u949f\u8df3\u53d8&#xff1a;\u7528 tc \u5236\u9020 5s \u5ef6\u8fdf &#043; \u4e22\u5305&#xff0c;\u770b\u91cd\u8bd5\u662f\u5426\u5e42\u7b49\u3001\u5168\u5c40\u9501\u8d85\u65f6\u662f\u5426\u8bef\u6740\u3002<\/li>\n<li>\u5e42\u7b49\u8f70\u70b8&#xff1a;\u540c\u4e00 Confirm \u53d1 100 \u904d&#xff0c;\u4f59\u989d\u53ea\u80fd\u53d8\u4e00\u6b21\u3002\u7528\u552f\u4e00\u952e &#043; \u5e76\u53d1\u811a\u672c\u538b\u3002<\/li>\n<li>\u8865\u507f\u4e5f\u5931\u8d25&#xff1a;mock \u8865\u507f\u63a5\u53e3\u6c38\u8fdc 500&#xff0c;\u770b Saga \u662f\u5426\u8fdb Failed_Need_Manual \u5e76\u544a\u8b66&#xff0c;\u800c\u4e0d\u662f\u65e0\u9650\u91cd\u8bd5\u62d6\u6b7b\u3002<\/li>\n<\/ul>\n<p>\u8fd0\u7ef4\u8840\u6cea\u4e09\u6761&#xff1a;<\/p>\n<ul>\n<li>Seata server \u5fc5\u987b\u96c6\u7fa4 &#043; DB \u5b58\u50a8&#xff08;file \u4e22\u4e86\u5c31\u771f\u4e22\u4e86&#xff09;&#xff0c;TC \u7684\u5e93\u8981\u548c\u4e1a\u52a1\u5e93\u5206\u5f00&#xff0c;\u522b\u5171\u7528\u4e00\u4e2a MySQL\u3002<\/li>\n<li>MQ \u4e8b\u52a1\u53cd\u67e5\u63a5\u53e3\u8981\u8f7b&#xff08;\u53ea\u67e5 tx_state \u8868&#xff09;&#xff0c;\u522b\u5728\u91cc\u9762\u8c03\u4e0b\u6e38 RPC&#xff0c;\u53cd\u67e5\u88ab\u6253\u6162\u4f1a\u62d6\u6b7b\u6574\u4e2a broker\u3002<\/li>\n<li>\u5927\u4fc3\u524d\u628a\u5168\u5c40\u9501\u8d85\u65f6\u8c03\u77ed\u3001\u91cd\u8bd5\u6b21\u6570\u8c03\u5c11&#xff0c;\u5b81\u53ef\u5feb\u901f\u5931\u8d25\u8d70\u8865\u507f&#xff0c;\u4e5f\u522b\u8ba9\u4e00\u4e2a\u6162 SQL \u62d6\u4f4f\u6574\u6761\u94fe\u8def\u3002<\/li>\n<\/ul>\n<hr \/>\n<h3>14. \u672a\u6765&#xff1a;\u4e8b\u52a1\u5728\u6d88\u5931&#xff0c;\u8fd8\u662f\u5728\u6362\u76ae<\/h3>\n<p>\u6709\u610f\u601d\u7684\u8d8b\u52bf\u662f&#xff1a;\u4e8b\u52a1\u6ca1\u6709\u6d88\u5931&#xff0c;\u53ea\u662f\u5728\u5f80\u4e0b\u6c89\u3001\u5f80\u5916\u6269\u3002<\/p>\n<ul>\n<li>\u5f80\u4e0b\u6c89&#xff1a;TiDB\u3001OceanBase\u3001CockroachDB \u628a\u5206\u5e03\u5f0f\u4e8b\u52a1\u505a\u8fdb\u5185\u6838&#xff0c;\u4e1a\u52a1\u5c42\u56de\u5230\u5355\u673a\u5199\u6cd5\u3002Serverless \u6570\u636e\u5e93&#xff08;Neon\u3001Aurora DSQL&#xff09;\u66f4\u8fdb\u4e00\u6b65&#xff0c;\u5b58\u50a8\u8ba1\u7b97\u5206\u79bb &#043; \u65e5\u5fd7\u5373\u6570\u636e\u5e93&#xff0c;\u4e8b\u52a1\u662f\u5e95\u5ea7\u80fd\u529b\u3002\u8fd9\u6761\u8def\u9002\u5408\u65b0\u4e1a\u52a1&#xff0c;\u8001\u4e1a\u52a1\u8fc1\u5e93\u6210\u672c\u662f\u6700\u5927\u7684\u574e\u3002<\/li>\n<li>\u5f80\u5916\u6269&#xff1a;Dapr Workflow\u3001Temporal\u3001Camunda \u628a Saga \u7f16\u6392\u505a\u6210\u57fa\u7840\u8bbe\u65bd&#xff0c;\u4e1a\u52a1\u53ea\u5199 activity &#043; \u8865\u507f&#xff0c;\u72b6\u6001\u3001\u91cd\u8bd5\u3001\u5b9a\u65f6\u7531\u5e73\u53f0\u6258\u7ba1\u3002\u957f\u6d41\u7a0b\u4e1a\u52a1&#xff08;\u5ba1\u6279\u3001\u4f9b\u5e94\u94fe\u3001IoT \u7f16\u6392&#xff09;\u7528\u8fd9\u4e2a\u6bd4\u624b\u5199 Saga \u72b6\u6001\u673a\u7701\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002<\/li>\n<li>AI \u4e0e\u5f02\u6784\u6570\u636e\u6e90&#xff1a;\u5411\u91cf\u5e93\u3001\u6e56\u4ed3\u3001SaaS API \u4e5f\u8981\u8fdb\u4e8b\u52a1\u3002\u505a\u6cd5\u662f\u201c\u4e8b\u52a1 outbox \u5316\u201d&#xff1a;\u4e00\u5207\u526f\u4f5c\u7528\u5148\u8bb0 log \u518d\u5f02\u6b65\u505a&#xff0c;\u9760\u5e42\u7b49 &#043; \u8865\u507f\u6536\u655b\u3002\u4e25\u683c ACID \u8de8\u5f02\u6784\u6e90\u5934\u57fa\u672c\u6ca1\u620f&#xff0c;\u522b\u786c\u521a\u3002<\/li>\n<\/ul>\n<p>\u4e00\u53e5\u8bdd\u6536\u675f&#xff1a;\u80fd\u7528\u6570\u636e\u5e93\u539f\u751f\u89e3\u51b3\u7684&#xff0c;\u522b\u4e0a\u6846\u67b6&#xff1b;\u80fd\u7528 AT \u89e3\u51b3\u7684&#xff0c;\u522b\u4e0a TCC&#xff1b;\u80fd\u5f02\u6b65\u7684&#xff0c;\u522b\u540c\u6b65\u5f3a\u4e00\u81f4\u3002 \u4e8b\u52a1\u65b9\u6848\u7684\u590d\u6742\u5ea6&#xff0c;\u6c38\u8fdc\u548c\u4f60\u9501\u4f4f\u8d44\u6e90\u7684\u65f6\u95f4\u6210\u6b63\u6bd4\u3002\u9501\u5f97\u8d8a\u4e45&#xff0c;\u6b7b\u5f97\u8d8a\u60e8\u3002<\/p>\n<hr \/>\n<h3>15. \u4e00\u9875\u7eb8\u603b\u7ed3<\/h3>\n<ul>\n<li>\u5355\u673a\u4e8b\u52a1\u9760 WAL &#043; \u9501 &#043; MVCC&#xff0c;\u5206\u5e03\u5f0f\u628a\u5171\u4eab\u5185\u5b58\u3001\u5171\u4eab\u65f6\u949f\u3001\u53ef\u9760\u7f51\u7edc\u5168\u62ff\u8d70\u4e86&#xff0c;\u6240\u4ee5\u96be\u3002<\/li>\n<li>CAP \u4e0d\u662f\u4e09\u9009\u4e8c&#xff0c;\u662f\u4e3a\u5206\u533a\u505a\u51c6\u5907&#xff1b;BASE \u662f\u201c\u5148\u8bb0\u5c0f\u672c\u672c&#xff0c;\u4e8b\u540e\u7b97\u6e05\u201d\u7684\u52a1\u5b9e\u6d3e\u3002<\/li>\n<li>2PC\/XA \u5f3a\u4e00\u81f4\u4f46\u963b\u585e&#xff0c;3PC \u4fee\u4e0d\u597d&#xff0c;\u751f\u4ea7\u8de8\u670d\u52a1\u614e\u7528 XA\u3002<\/li>\n<li>\u5171\u8bc6&#xff08;Raft&#xff09;\u7ba1\u590d\u5236&#xff0c;2PC \u7ba1\u539f\u5b50\u63d0\u4ea4&#xff0c;Spanner \u662f\u4e24\u8005\u7684\u5408\u4f53 &#043; \u786c\u4ef6\u65f6\u949f\u3002<\/li>\n<li>TCC \u9002\u5408\u94b1\u548c\u5e93\u5b58&#xff08;\u51bb\u7ed3\u4e09\u4ef6\u5957 &#043; \u9632\u60ac\u6302&#xff09;&#xff0c;Saga \u9002\u5408\u957f\u6d41\u7a0b&#xff08;\u76f4\u63a5\u5e72 &#043; \u5012\u7740\u8d54&#xff09;&#xff0c;\u6d88\u606f\u6700\u7ec8\u4e00\u81f4\u9002\u5408\u5f02\u6b65&#xff08;Outbox&#043;CDC \u73b0\u5728\u6700\u9999&#xff09;\u3002<\/li>\n<li>Seata AT \u662f\u8de8\u5e93 CRUD \u7684\u9996\u9009&#xff0c;XA \u540c\u673a\u623f\u53ef\u7528&#xff0c;TCC \u7559\u7ed9\u6838\u5fc3\u94fe\u8def&#xff0c;Saga \u7559\u7ed9\u957f\u6d41\u7a0b&#xff0c;\u518d\u53e0 Outbox \u89e3\u8026\u901a\u77e5\u3002<\/li>\n<li>\u5e42\u7b49\u952e &#043; \u552f\u4e00\u7d22\u5f15 &#043; \u72b6\u6001\u673a &#043; \u5bf9\u8d26 job&#xff0c;\u4e00\u4e2a\u90fd\u4e0d\u80fd\u5c11\u3002\u6ca1\u6709\u5bf9\u8d26\u7684\u67d4\u6027\u4e8b\u52a1&#xff0c;\u90fd\u662f\u88f8\u5954\u3002<\/li>\n<li>\u9009\u578b\u6309\u201c\u6362\u5e93 &gt; AT &gt; TCC\/Saga &gt; \u786c\u521a 2PC\u201d\u7684\u987a\u5e8f\u95ee&#xff0c;\u9501\u8d8a\u77ed\u547d\u8d8a\u957f\u3002<\/li>\n<\/ul>\n<p>\u5199\u5230\u6700\u540e\u518d\u5520\u4e00\u53e5&#xff1a;\u5206\u5e03\u5f0f\u4e8b\u52a1\u6ca1\u6709\u6807\u51c6\u7b54\u6848&#xff0c;\u53ea\u6709\u8d26\u672c\u3002 strong \u7684\u65b9\u6848\u8d26\u7b97\u5f97\u5feb\u4f46\u5bb9\u6613\u5361\u6b7b&#xff0c;\u67d4\u7684\u65b9\u6848\u8d26\u7b97\u5f97\u6162\u4f46\u6d3b\u5f97\u4e45\u3002\u4f60\u8981\u505a\u7684\u4e0d\u662f\u9009\u201c\u6700\u6b63\u786e\u7684\u201d&#xff0c;\u800c\u662f\u9009\u201c\u51fa\u95ee\u9898\u65f6\u4f60\u80fd\u8bb2\u6e05\u3001\u80fd\u67e5\u5230\u3001\u80fd\u8865\u4e0a\u201d\u7684\u3002XID \u80fd\u4e32\u8d77\u6765\u3001\u5bf9\u8d26\u80fd\u626b\u51fa\u6765\u3001\u8865\u507f\u80fd\u8dd1\u901a&#xff0c;\u6bd4\u591a\u80cc\u4e24\u4e2a\u534f\u8bae\u91cd\u8981\u5f97\u591a\u3002<\/p>\n<h3>\u53c2\u8003\u4e0e\u5ef6\u4f38<\/h3>\n<ul>\n<li>Jim Gray\u300aTransaction Processing\u300b\u3001Phil Bernstein\u300aConcurrency Control and Recovery\u300b&#xff1a;\u4e8b\u52a1\u7406\u8bba\u7684\u5723\u7ecf&#xff0c;2PC\u3001\u6062\u590d\u3001\u9694\u79bb\u5168\u5728\u91cc\u9762\u3002<\/li>\n<li>Hector Garcia-Molina\u300aSaga \u8bba\u6587&#xff08;1987&#xff09;\u300b&#xff1a;Saga \u539f\u6587&#xff0c;\u5341\u9875\u7eb8&#xff0c;\u503c\u5f97\u4e00\u8bfb\u3002<\/li>\n<li>Google Spanner&#xff08;OSDI\u201912&#xff09;\u3001Percolator&#xff08;OSDI\u201910&#xff09;\u3001Calvin&#xff08;SIGMOD\u201912&#xff09;&#xff1a;\u6570\u636e\u5e93\u539f\u751f\u4e09\u5ea7\u5927\u5c71\u3002<\/li>\n<li>Seata \u5b98\u65b9\u6587\u6863\u4e0e sample&#xff08;at\/tcc\/saga\/xa&#xff09;&#xff1a;\u76f4\u63a5\u8dd1\u4e00\u904d&#xff0c;\u6bd4\u770b\u5341\u7bc7\u6587\u7ae0\u7ba1\u7528\u3002<\/li>\n<li>Debezium &#043; Outbox Pattern&#xff08;Chris Richardson\u300aMicroservices Patterns\u300b\u7b2c 4 \u7ae0&#xff09;&#xff1a;\u6d88\u606f\u6700\u7ec8\u4e00\u81f4\u7684\u5de5\u7a0b\u624b\u518c\u3002<\/li>\n<li>Martin Kleppmann\u300aDesigning Data-Intensive Applications\u300b\u7b2c 7\/9 \u7ae0&#xff1a;\u4e00\u81f4\u6027\u4e0e\u5171\u8bc6\u8bb2\u5f97\u6700\u900f\u7684\u5165\u95e8\u4e66\u3002<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a&#xff0c;\u628a\u8d26\u7b97\u5e73\u8fd9\u662f\u4e00\u4efd\u7ed9\u4e00\u7ebf\u5de5\u7a0b\u5e08\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u7b14\u8bb0&#xff1a;\u4e0d\u80cc\u5b9a\u4e49&#xff0c;\u4ece\u201c\u4e3a\u4ec0\u4e48\u5355\u673a\u597d\u597d\u7684&#xff0c;\u4e00\u62c6\u6210\u5fae\u670d\u52a1\u5c31\u5168\u662f\u5751\u201d\u8bb2\u8d77\u3002\u5148\u628a\u5355\u673a\u4e8b\u52a1\u7684\u8001\u5e95&#xff08;WAL\u3001\u4e24\u9636\u6bb5\u9501\u3001MVCC&#xff09;\u7ffb\u51fa\u6765&#xff0c;\u518d\u770b\u5206\u5e03\u5f0f\u628a\u4ec0\u4e48\u6253\u788e\u4e86&#xff1a;\u65f6\u949f\u4e0d\u53ef\u4fe1\u3001\u7f51\u7edc\u4f1a\u4e22\u5305\u3001\u673a\u5668\u4f1a\u5b95\u673a\u3002\u7136\u540e\u4e00\u4e2a\u4e2a\u62c6\u4e3b\u6d41\u89e3\u6cd5\u2014\u20142PC\/XA\u3001TCC\u3001Saga\u3001\u672c\u5730\u6d88\u606f\u8868\u3001OutboxCDC\u3001MQ\u4e8b\u52a1\u6d88\u606f\u3001Seata&amp;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[664,3536,4650,1348],"topic":[],"class_list":["post-108108","post","type-post","status-publish","format-standard","hentry","category-server","tag-664","tag-3536","tag-4650","tag-1348"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/108108.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a&#xff0c;\u628a\u8d26\u7b97\u5e73\u8fd9\u662f\u4e00\u4efd\u7ed9\u4e00\u7ebf\u5de5\u7a0b\u5e08\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u7b14\u8bb0&#xff1a;\u4e0d\u80cc\u5b9a\u4e49&#xff0c;\u4ece\u201c\u4e3a\u4ec0\u4e48\u5355\u673a\u597d\u597d\u7684&#xff0c;\u4e00\u62c6\u6210\u5fae\u670d\u52a1\u5c31\u5168\u662f\u5751\u201d\u8bb2\u8d77\u3002\u5148\u628a\u5355\u673a\u4e8b\u52a1\u7684\u8001\u5e95&#xff08;WAL\u3001\u4e24\u9636\u6bb5\u9501\u3001MVCC&#xff09;\u7ffb\u51fa\u6765&#xff0c;\u518d\u770b\u5206\u5e03\u5f0f\u628a\u4ec0\u4e48\u6253\u788e\u4e86&#xff1a;\u65f6\u949f\u4e0d\u53ef\u4fe1\u3001\u7f51\u7edc\u4f1a\u4e22\u5305\u3001\u673a\u5668\u4f1a\u5b95\u673a\u3002\u7136\u540e\u4e00\u4e2a\u4e2a\u62c6\u4e3b\u6d41\u89e3\u6cd5\u2014\u20142PC\/XA\u3001TCC\u3001Saga\u3001\u672c\u5730\u6d88\u606f\u8868\u3001OutboxCDC\u3001MQ\u4e8b\u52a1\u6d88\u606f\u3001Seata&amp;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/108108.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-20T17:11:57+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"65 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/108108.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/108108.html\",\"name\":\"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-20T17:11:57+00:00\",\"dateModified\":\"2026-09-20T17:11:57+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/108108.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/108108.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/108108.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/108108.html","og_locale":"zh_CN","og_type":"article","og_title":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a&#xff0c;\u628a\u8d26\u7b97\u5e73\u8fd9\u662f\u4e00\u4efd\u7ed9\u4e00\u7ebf\u5de5\u7a0b\u5e08\u7684\u5206\u5e03\u5f0f\u4e8b\u52a1\u7b14\u8bb0&#xff1a;\u4e0d\u80cc\u5b9a\u4e49&#xff0c;\u4ece\u201c\u4e3a\u4ec0\u4e48\u5355\u673a\u597d\u597d\u7684&#xff0c;\u4e00\u62c6\u6210\u5fae\u670d\u52a1\u5c31\u5168\u662f\u5751\u201d\u8bb2\u8d77\u3002\u5148\u628a\u5355\u673a\u4e8b\u52a1\u7684\u8001\u5e95&#xff08;WAL\u3001\u4e24\u9636\u6bb5\u9501\u3001MVCC&#xff09;\u7ffb\u51fa\u6765&#xff0c;\u518d\u770b\u5206\u5e03\u5f0f\u628a\u4ec0\u4e48\u6253\u788e\u4e86&#xff1a;\u65f6\u949f\u4e0d\u53ef\u4fe1\u3001\u7f51\u7edc\u4f1a\u4e22\u5305\u3001\u673a\u5668\u4f1a\u5b95\u673a\u3002\u7136\u540e\u4e00\u4e2a\u4e2a\u62c6\u4e3b\u6d41\u89e3\u6cd5\u2014\u20142PC\/XA\u3001TCC\u3001Saga\u3001\u672c\u5730\u6d88\u606f\u8868\u3001OutboxCDC\u3001MQ\u4e8b\u52a1\u6d88\u606f\u3001Seata&amp;","og_url":"https:\/\/www.wsisp.com\/helps\/108108.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-20T17:11:57+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"65 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/108108.html","url":"https:\/\/www.wsisp.com\/helps\/108108.html","name":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-20T17:11:57+00:00","dateModified":"2026-09-20T17:11:57+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/108108.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/108108.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/108108.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u5206\u5e03\u5f0f\u4e8b\u52a1\u2014\u2014\u5728\u4e0d\u53ef\u9760\u7684\u7f51\u7edc\u4e0a\uff0c\u628a\u8d26\u7b97\u5e73"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/108108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=108108"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/108108\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=108108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=108108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=108108"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=108108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}