@@ -18,7 +18,56 @@ aliases: ['/docs-cn/dev/optimistic-transaction/','/docs-cn/dev/reference/transac
1818
1919为支持分布式事务,TiDB 中乐观事务使用两阶段提交协议,流程如下:
2020
21- ![ TiDB 中的两阶段提交] ( /media/2pc-in-tidb.png )
21+ ``` mermaid
22+ ---
23+ title: 2PC in TiDB
24+ ---
25+ sequenceDiagram
26+ participant client
27+ participant TiDB
28+ participant PD
29+ participant TiKV
30+
31+ client->>TiDB: begin
32+ TiDB->>PD: get ts as start_ts
33+
34+ loop excute SQL
35+ alt do read
36+ TiDB->>PD: get region from PD or cache
37+ TiDB->>TiKV: get data from TiKV or cache with start_ts
38+ TiDB-->>client: return read result
39+ end
40+ alt do write
41+ TiDB-->>TiDB: write in cache
42+ TiDB-->>client: return write result
43+ end
44+ end
45+
46+ client->>TiDB: commit
47+
48+ opt start 2PC
49+ TiDB-->>TiDB: for all keys need to write,choose first one as primary
50+ TiDB->>PD: locate each key
51+ TiDB-->>TiDB: group keys by region to [](region,keys)
52+
53+ opt prewrite with start_ts
54+ TiDB->>TiKV: prewrite(primary_key,start_ts)
55+ loop prewrite to each region in [](region,keys) parallelly
56+ TiDB->>TiKV: prewrite(keys,primary_key,start_ts)
57+ end
58+ end
59+
60+ opt commit
61+ TiDB-->>PD: get ts as commit_ts
62+ TiDB-->>TiKV: commit primary with commit_ts
63+ loop send commit to each region in [](region,keys) parallelly
64+ TiDB->>TiKV: commit(keys,commit_ts)
65+ end
66+ end
67+ end
68+
69+ TiDB-->>client: success
70+ ```
2271
23721 . 客户端开始一个事务。
2473
0 commit comments