Percolator 和 TiDB 事務演算法
本文先概括的講一下 Google Percolator 的大致流程。Percolator 是 Google 的上一代分散式事務解決方案,構建在 BigTable 之上,在 Google 內部 用於網頁索引更新的業務,原始的論文在此。原理比較簡單,總體來說就是一個經過優化的二階段提交的實現,進行了一個二級鎖的優化。TiDB 的事務模型沿用了 Percolator 的事務模型。 總體的流程如下:
### 讀寫事務
1) 事務提交前,在客戶端 buffer 所有的 update/delete 操作。 2) Prewrite 階段:
首先在所有行的寫操作中選出一個作為 primary,其他的為 secondaries。
PrewritePrimary: 對 primaryRow 寫入 L 列 (上鎖),L 列中記錄本次事務的開始時間戳。寫入 L 列前會檢查:
- 是否已經有別的客戶端已經上鎖 (Locking)。
- 是否在本次事務開始時間之後,檢查 W 列,是否有更新 [startTs, +Inf) 的寫操作已經提交 (Conflict)。
在這兩種種情況下會返回事務衝突。否則,就成功上鎖。將行的內容寫入 row 中,時間戳設定為 startTs。
將 primaryRow 的鎖上好了以後,進行 secondaries 的 prewrite 流程:
- 類似 primaryRow 的上鎖流程,只不過鎖的內容為事務開始時間及 primaryRow 的 Lock 的資訊。
- 檢查的事項同 primaryRow 的一致。
當鎖成功寫入後,寫入 row,時間戳設定為 startTs。
3) 以上 Prewrite 流程任何一步發生錯誤,都會進行回滾:刪除 Lock,刪除版本為 startTs 的資料。
4) 當 Prewrite 完成以後,進入 Commit 階段,當前時間戳為 commitTs,且 commitTs> startTs :
- commit primary:寫入 W 列新資料,時間戳為 commitTs,內容為 startTs,表明資料的最新版本是 startTs 對應的資料。
- 刪除 L 列。
如果 primary row 提交失敗的話,全事務回滾,回滾邏輯同 prewrite。如果 commit primary 成功,則可以非同步的 commit secondaries, 流程和 commit primary 一致, 失敗了也無所謂。
### 事務中的讀操作
- 檢查該行是否有 L 列,時間戳為 [0, startTs],如果有,表示目前有其他事務正佔用此行,如果這個鎖已經超時則嘗試清除,否則等待超時或者其他事務主動解鎖。注意此時不能直接返回老版本的資料,否則會發生幻讀的問題。
- 讀取至 startTs 時該行最新的資料,方法是:讀取 W 列,時間戳為 [0, startTs], 獲取這一列的值,轉化成時間戳 t, 然後讀取此列於 t 版本的資料內容。
由於鎖是分兩級的,primary 和 seconary,只要 primary 的行鎖去掉,就表示該事務已經成功 提交,這樣的好處是 secondary 的 commit 是可以非同步進行的,只是在非同步提交進行的過程中 ,如果此時有讀請求,可能會需要做一下鎖的清理工作。
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- tidb之dm叢集跳過某個事務實踐TiDB
- 編輯 Java 中的事務 — JDBC 事務和 JTA 事務JavaJDBC
- 本地事務和分散式事務的區別分散式
- MySQL 事務和鎖MySql
- MySQL事務和鎖MySql
- 事務物件和命令物件物件
- mysql事務和鎖InnoDBMySql
- sqlite的事務和鎖SQLite
- Oracle的事務和鎖Oracle
- MySQL 的索引和事務MySql索引
- Percolator模型及其在TiKV中的實現模型
- MySQL中的事務和MVCCMySqlMVC
- HIBERNATE的SESSION和事務Session
- Innodbreadonly事務、MySQL5.7和Percona的事務改進MySql
- 宣告式事務能否和程式設計式事務巢狀使用?程式設計巢狀
- Spring事務配置的五種方式和spring裡面事務的傳播屬性和事務隔離級別Spring
- java spring巢狀事務詳情和事務傳播型別JavaSpring巢狀型別
- 【Redis 系列】redis 學習六,redis 事務處理和監控事務Redis
- 十、Redis事務、事務鎖Redis
- MySQL基礎架構和事務MySql架構
- 11.日誌和事務@Transactional
- 分散式事務和分散式hash分散式
- redis(10)事務和鎖機制Redis
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer
- 分散式事務之Spring事務與JMS事務(二)分散式Spring
- MySQL事務(一)認識事務MySql
- 什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?Spring
- @Transactional註解管理事務和手動提交事務
- 事務
- 探究MySQL的DML提交事務的意義和DQL是否有必要提交事務MySql
- MySQL事務隔離級別和MVCCMySqlMVC
- mysql事務隔離級別和鎖MySql
- 分散式鎖和spring事務管理分散式Spring
- SQL Server 事務及回滾事務SQLServer
- MySQL 8.0 —— CATS事務排程演算法的效能提升MySql演算法
- TIDB和MySQL效能對比TiDBMySql
- spring事務管理原始碼分析(一)配置和事務增強代理的生成流程Spring原始碼
- MyCAT、DRDS、TIDB、TDSQL、TBase 在實現分散式事務時的區別及其各自的優勢?TiDBSQL分散式