分佈式數據庫數據表分成多個parition,分佈在不同server上,拓撲是每個server維護不同的版本時間戳,相比單機數據庫,提供MVCC要複雜很多,當然,你如果有spanner的原子鐘,那會簡單很多。
現描述一種可行的實現方案,拋磚引玉。
此方案可以做如下保證:
1.單Partition讀(分分佈式事務讀)可以保重repeated read。
2同一個server上的分佈式事務可以保證repeated read,並且對外保證因果序列;
3.跨partition不能保證因果序,但可保證repeated read
數據模型
- 1.每個server上多個parition,每個是一個MVCC數據結構,即有多個版本的數據
- 2 每個server上一個publish_id,表示版本小於此值的數據都可以讀取到
- 3 每個server上一個trans_id,表示後續寫入的數據的版本都是大於此值
分佈式事務寫
- 1在兩階段提交的prepare階段,參與者發送prepare ack中攜帶一個版本號,即本地++trans_id的值
- 2 協調者在收集到的parepare ack中選出時間戳最大的max_ver,發送commit
- 3 參與者收到此請求後寫commit日誌,同時使用max_ver更新trans_id
- 4 commit日誌落盤後,修改publish_id,並釋放行鎖
分佈式事務讀
由於跨server的分佈式讀不作任何保證,只討論同一個server的分佈式讀,簡單來說,就是去publish_id作爲版本號,如果目標行上有行鎖,且行鎖相關的版本號是小於publish_id的,則阻塞等待行鎖釋放,否則直接讀取即可。nweet/stackedit