精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊TiDB的分布式事務模型

運維 數據庫運維 分布式
務場景的復雜化,必然導致樂觀事務沖突變多,這也是TiDB后續(xù)版本轉向悲觀事務的重要原因。TiDB中樂觀事務和悲觀事務可以共存。

[[379689]]

本文轉載自微信公眾號「程序員jinjunzhu」,作者 jinjunzhu 。轉載本文請聯系程序員jinjunzhu公眾號。

在傳統關系型數據庫領域,我們常常通過配置事務的隔離級別來解決臟讀、幻讀、不可重復讀的問題。不同的事務隔離級別對應解決問題的力度是不一樣的,下表是不同事務隔離級別對臟讀、幻讀、不可重復讀的容忍度,我們一起看一下:

注意:

Repeatable read的讀鎖會一直到事務結束才釋放;

Read committed的讀鎖不等到事務結束,而是讀取完成后立即釋放。

當然,傳統數據庫解決并發(fā)控制的手段還有mvcc,這里就不展開了。

上面我提到了讀鎖,寫鎖、GAP鎖,實際上鎖的種類遠遠不止這些。對于我們開發(fā)者來講,經常會談到樂觀鎖和悲觀鎖。樂觀鎖實際上是不加鎖的,悲觀鎖需要真正的加鎖。而在分布式數據庫領域,同樣需要并發(fā)控制,同樣也有樂觀事務和悲觀事務。

就TiDB來說,v3.0版本開始支持悲觀事務,從v3.0.8開始,新搭建的TiDB集群已經默認使用悲觀事務了。

傳統數據庫加鎖

傳統數據庫的樂觀鎖,主要是在表中加入一個版本號字段,在更新的時候根據更新結果來進行判斷是否成功。比如我們有一張表table_a, 我們在其中加一個version字段,下面是table_a表的1條記錄

表格

id name version
1 jinjunzhu 4

我們更新這條id=1的記錄,SQL如下:

  1. update table_a set name='xiaoming',version = version + 1 where id=1 and version=4 

這時如果SQL執(zhí)行結果返回更新行數是0,說明別的事務已經更新了version字段,寫沖突產生,業(yè)務代碼必須處理這個沖突。高并發(fā)下如果對同一條記錄的修改操作非常多,勢必造成大量寫失敗。所以樂觀鎖更適合讀多寫少的場景。

傳統數據庫的悲觀鎖,是用物理加鎖的方式,還是上面的表,不需要version字段了,假如有2條記錄:

id name
1 jinjunzhu
2 xiaoming

這時加入我們要同時更新id=1的記錄和id=2的記錄,如果在一個事務內完成,加鎖sql如下:

  1. select * from table_a where id in(1, 2) for update
  2. update table_a set name = 'zhangsan' where id=1; 
  3. update table_a set name = 'lisi' where id=2; 

悲觀鎖的問題是遇到長事務,其他事務需要較長時間的鎖等待,所以oracle提供了下面的優(yōu)化,即發(fā)現待修改數據被鎖定后立刻返回失敗:

  1. select * from table_a for update nowait 

Percolator模型

Percolator模型是Google提出的構建在BigTable之上的分布式事務解決方案。Google的論文如下,文章鏈接見延伸閱讀[1]:

  1. 《Large-scale Incremental Processing Using Distributed Transactions and Notifications》 

我們以經典的電商系統為例,假如系統中有訂單、賬戶和庫存3張表,用戶一次購物需要增加1條訂單記錄,賬戶表需要扣減金額,庫存表需要扣減庫存,而這3張表要操作的記錄分別在分布式數據庫的3個切片上,這時就需要應對分布式事務了。

我們看一下Percolator算法模型:

初始階段

初始階段,我們假設訂單表記錄訂單數量是0,賬戶表記錄賬戶金額1000,庫存表記錄商品數量是100,客戶下了1個訂單后,訂單表增加1個訂單,賬戶表扣除金額100,庫存表扣減商品數量1。各個表的初始數據如下表:

上面表格中,":"前面是用時間戳表示的數據版本,后面是數據值。第一列是表名,第二列的低版本保存了數據,第三列列保存了事務操作給數據加的鎖。第四列的高版本保存了指向保存數據版本的指針,比如6這個版本保存了指向了5這個版本數據的指針 6:data@5。

Prewrite階段

在Prewrite階段,協調節(jié)點向每個切片發(fā)送Prewrite命令。Percolator定義了 primary lock 即主鎖的概念,Prewrite階段,每個分布式事務只能有一個要修改的數據行可以獲得主鎖,本案例假如訂單表獲得了主鎖,其他表的鎖是指向這個主鎖的指針,叫做 secondary lock,如下表:

Prewrite階段,每個要修改的數據行會寫日志,并且根據時間戳記錄事務的私有版本,這里的私有版本就是7,這樣其他事務就不能操作這三條數據了。

注意,獲取主鎖時,如果出現了下面的情況,就會加鎖失敗:

1.其他事務已經加鎖;

2.本次事務開始之后,要更新的數據被其他數據更新了。

commit階段

在commit階段,協調節(jié)點只需要跟擁有primary lock的切片進行通信,所以本案例只需要跟訂單表所在切片通信。這時數據如下表:

我們注意到order表的鎖沒有了,而且增加了版本8指向版本7。說明訂單表已經提交成功,沒有私有版本了,但是賬戶表和庫存表的私有版本還在。這是因為Percolator模型并不會同步commit賬戶表和庫存表,而是啟動異步線程來commit這兩張表并清理鎖。如果訂單表提交失敗,賬戶表和庫存表也都需要回滾。

提交成功后,最終數據如下表:

commit階段,因為協調節(jié)點只需要跟擁有主鎖的切片(這里是訂單表所在切片)進行通信,保證了原子性,這樣就避免了commit時節(jié)點不能全部成功導致的數據不一致問題。

而Prewrite階段記錄了日志和私有版本,如果賬戶表和庫存表所在切片commit失敗,可以根據日志進行再次commit,這樣就保證了數據最終一致。

這里要注意2點:

1.主鎖的選擇是隨機的,比如本例中并不一定會選擇訂單表;

2.協調節(jié)點發(fā)送commit后訂單表先提交成功,這時如果其他事務要讀取賬戶服務和庫存服務的2條數據,雖然2條數據上面還有l(wèi)ock,但是查找primary@order.bal發(fā)現已提交,所以是可以讀取的。不過讀取時需要做一下secondary lock清理工作。

TiDB樂觀事務模型

上面我們分析了Percolator模型,TiDB的樂觀事務正是使用了Percolator模型。

TiDB支持MVCC,事務啟動的時候,會使用一個時間戳start_ts作為當前事務ID,同時作為MVCC的快照版本,之后的讀請求會讀取當前快照版本下的數據,數據校驗成功后客戶端進行兩階段commit,我們看一下下面的時序圖:

第一階段,TiDB收到客戶端請求后,首先會從緩存的待修改key中找出第一個發(fā)送prewrite請求,這個key加primary lock后返回成功。然后TiDB會對這個事務其他的所有的key發(fā)送prewrite請求,這些key加secondary lock后返回成功。

第二階段,prewrite成功后,TiDB首先會從PD獲取一個時間戳作為當前事務的commit_ts,然后向primary lock key發(fā)送commit請求,primary lock key提交數據成功后清理掉primary lock返回成功。TiDB收到primary lock key的成功消息后給客戶端返回成功。

樂觀事務的沖突檢測主要是在prewrite階段,如果檢測到當前的key已經加鎖,會有一個等待時間,這個時間過后如果還沒有獲取到鎖,就返回失敗。因此當多個事務修改同一個key時,必然導致大量的鎖沖突。

注意:TiDB也有重試機制,默認是關閉的。TiDB的重試會重新獲取start_ts,但是不會重新讀取數據,因此不能保證可重復讀的隔離級別。詳細參考TiDB官方文檔。

TiDB悲觀事務模型

TiDB從v3.0 版本開始,引入了悲觀事務。

注意:v3.0.7及之前版本創(chuàng)建的集群升級到更高版本后,默認還是采用樂觀事務,只有新創(chuàng)建集群才會默認使用悲觀事務。我們也可以采用下面命令來開啟悲觀事務。下面第1個語句會修改TiDB系統參數,后面2個語句會忽略系統參數,優(yōu)先級更高:

SET GLOBAL tidb_txn_mode = 'pessimistic';

BEGIN PESSIMISTIC;

BEGIN OPTIMISTIC;

為了兼容mysql,TiDB的悲觀事務和mysql很類似。悲觀事務支持可重復讀和讀已提交兩種隔離級別,默認使用可重復讀。TiDB中樂觀事務和悲觀事務可以共存,會優(yōu)先會采用樂觀事務,只有鎖沖突時,才會使用悲觀事務。

使用悲觀事務的語句如下:

  1. UPDATEDELETEINSERTSELECT FOR UPDATE 

TiDB的悲觀事務有幾點需要注意:

  • SELECT FOR UPDATE語句會對已提交的最新的數據而非所修改的行加上悲觀鎖
  • TiDB不支持GAP鎖,所以在FOR UPDATE語句的WHERE條件使用范圍條件時,還是可以插入的,比如下面的sql如果id不沖突,還是可以插入成功的:
  1. SELECT * FROM t1 WHERE id BETWEEN 1 AND 10 FOR UPDATE
  • 可以通過innodb_lock_wait_timeout變量設置等待鎖超時時間,默認是50s
  • 不支持支持FOR UPDATE NOWAIT語法
  • 如果Point Get和Batch Point Get算子沒有讀到數據,依然會對給定的主鍵或者唯一鍵加鎖,阻塞其他事務對相同主鍵加鎖或者進行寫入操作
  • 在悲觀事務執(zhí)行期間,如果執(zhí)行DDL操作,是可以成功的,但之后事務會提交失敗
  • 悲觀事務的執(zhí)行時間有上限,默認為10分鐘,可以通過參數配置

總結

業(yè)務場景的復雜化,必然導致樂觀事務沖突變多,這也是TiDB后續(xù)版本轉向悲觀事務的重要原因。TiDB中樂觀事務和悲觀事務可以共存。

延伸閱讀:

[1].https://www.cs.princeton.edu/courses/archive/fall10/cos597B/papers/percolator-osdi10.pdf

[2].https://docs.pingcap.com/zh/tidb/stable/pessimistic-transaction

[3].https://docs.pingcap.com/zh/tidb/stable/optimistic-transaction

[4].https://pingcap.com/blog-cn/percolator-and-txn/

 

責任編輯:武曉燕 來源: 程序員jinjunzhu
相關推薦

2023-06-27 13:47:00

分布式事務本地事務

2022-06-27 08:21:05

Seata分布式事務微服務

2022-06-21 08:27:22

Seata分布式事務

2017-07-26 15:08:05

大數據分布式事務

2019-10-10 09:16:34

Zookeeper架構分布式

2017-12-20 16:15:30

分布式系統架構

2018-04-03 09:27:42

分布式架構系統

2022-04-08 08:27:08

分布式鎖系統

2023-11-29 10:26:52

分布式數據

2023-02-10 00:04:53

2022-06-13 10:01:36

Apollo攜程框架

2025-03-06 11:30:15

2009-06-19 15:28:31

JDBC分布式事務

2009-09-18 15:10:13

分布式事務LINQ TO SQL

2021-09-29 09:07:37

分布式架構系統

2018-01-23 15:55:23

分布式系統架構

2023-10-26 18:10:43

分布式并行技術系統

2024-07-05 08:26:54

2023-09-11 15:40:43

鍵值存儲云服務

2023-12-26 08:59:52

分布式場景事務機制
點贊
收藏

51CTO技術棧公眾號

三年中国中文观看免费播放| 男人操女人逼免费视频| 国产视频手机在线| 亚洲视频大全| 中文字幕日韩高清| 911亚洲精选| 97成人超碰| 亚洲午夜视频在线| 一区二区国产日产| 色综合久久久久久| 久久福利资源站| 91国产美女视频| 5566中文字幕| 亚洲毛片免费看| 欧美一区二区三区白人| 亚洲中文字幕久久精品无码喷水| 欧洲中文在线| 亚洲欧洲日韩一区二区三区| 久久伊人资源站| www.com欧美| 日本va欧美va瓶| 97久久国产精品| 免费中文字幕在线观看| 成人网18免费网站| 亚洲女人初尝黑人巨大| 少妇伦子伦精品无吗| 亚洲人成777| 欧美亚洲一区二区在线| 大j8黑人w巨大888a片| av在线播放国产| 中文字幕av一区二区三区| 精品国产一区二区三区四区精华| 国产免费福利视频| 老司机免费视频一区二区三区| 欧美亚洲视频在线观看| 国产亚洲小视频| 国产精品v一区二区三区| 久久精品电影一区二区| 亚洲av熟女国产一区二区性色| 窝窝社区一区二区| 亚洲国产精品成人va在线观看| 国产又黄又嫩又滑又白| 国产激情精品一区二区三区| 欧美日韩成人高清| av污在线观看| 成人精品一区二区三区电影| 在线看国产一区二区| 国产精品一区二区免费在线观看| 蜜臀av国内免费精品久久久夜夜| 亚洲女厕所小便bbb| 亚洲午夜高清视频| 中文字幕日本在线| 中文字幕佐山爱一区二区免费| 亚洲图片都市激情| 老司机午夜在线视频| 日韩理论片在线| 欧美精品一区二区性色a+v| 久草资源在线| 尤物视频一区二区| www.日本三级| 美女搞黄视频在线观看| 黄色一区二区在线| 人妻少妇被粗大爽9797pw| 夜鲁夜鲁夜鲁视频在线播放| 日本韩国欧美一区| 视频在线观看免费高清| 亚洲狼人在线| 精品日韩99亚洲| 星空大象在线观看免费播放| 伊人久久大香线蕉无限次| 亚洲欧洲免费视频| 午夜激情福利电影| 国产精品草草| 欧美在线观看一区二区三区| 中文字幕视频网| 日本不卡123| 91日韩久久| 色综合久久网女同蕾丝边| 国产网站一区二区三区| 宅男在线精品国产免费观看| 色呦呦在线播放| 欧美性猛交xxxx| 五月天中文字幕在线| 91欧美日韩在线| 亚洲欧美日本精品| 日韩欧美123区| 999亚洲国产精| 国产精品日韩电影| 精品国产无码一区二区| 久久无码av三级| www亚洲国产| 97超碰在线免费| 欧美日韩在线三级| 日韩精品xxx| 成人午夜国产| 国模吧一区二区三区| 这里只有精品国产| 粉嫩aⅴ一区二区三区四区| 欧美日韩综合网| 生活片a∨在线观看| 午夜日韩在线电影| 天天看片天天操| 亚洲人成伊人成综合图片| 免费91在线视频| 狠狠狠狠狠狠狠| 国产成人啪免费观看软件| 日本一区二区三区免费观看| 啪啪免费视频一区| 7777精品伊人久久久大香线蕉的| 欲求不满的岳中文字幕| 中文字幕av亚洲精品一部二部| 欧美自拍大量在线观看| 99热这里只有精品在线观看| 国产亚洲一区二区三区| 91九色丨porny丨国产jk| 日韩欧乱色一区二区三区在线| 日韩大片在线观看视频| 国产激情无码一区二区三区| 丝袜美腿一区二区三区| 国内精品久久久久久久果冻传媒| 欧美jizzhd欧美| 在线亚洲欧美专区二区| 亚洲av人人澡人人爽人人夜夜| 亚洲免费二区| 国产欧美日韩中文字幕在线| 免费观看成年在线视频网站| 午夜私人影院久久久久| 香蕉视频污视频| 中文字幕一区二区av | 日韩欧美亚洲一区二区| 欧美午夜激情影院| 久久精选视频| 开心色怡人综合网站| 国产精品原创| 亚洲精品国产精品国产自| 国语对白一区二区| 大白屁股一区二区视频| 欧美一级中文字幕| 国产一区二区三区国产精品| 日韩小视频在线观看| 艳妇乳肉豪妇荡乳av无码福利| 久久亚洲二区三区| 农村妇女精品一二区| 日韩极品在线| 国产69精品久久久久久| 视频一区二区三区在线看免费看| 午夜婷婷国产麻豆精品| 亚洲av无码一区二区三区网址| 亚洲高清免费| 久草热久草热线频97精品| av3级在线| 亚洲国产成人精品电影| 国产成人亚洲精品自产在线| 26uuu久久综合| 欧美两根一起进3p做受视频| 网友自拍一区| 国产精品久久久久一区二区| 一区二区三区视频在线观看视频| 欧美日韩在线一区二区| 澳门黄色一级片| 成人午夜av在线| 国产美女网站在线观看| 国产99久久| 成人免费自拍视频| 在线看女人毛片| 欧美精品一区二区在线观看| 亚洲日本视频在线观看| 中文字幕不卡三区| 少妇精品无码一区二区| 亚洲影院一区| 亚洲v欧美v另类v综合v日韩v| 日韩三级一区| 欧美精品电影免费在线观看| 天堂а√在线8种子蜜桃视频| 在线免费不卡视频| 欧美黑人精品一区二区不卡| 91美女在线视频| 亚洲这里只有精品| 狠久久av成人天堂| 欧洲成人一区二区| 九九99久久精品在免费线bt| 69av视频在线播放| 中文日本在线观看| 亚洲国产成人精品久久| 伊人久久国产精品| 午夜精品久久久久影视| 国产jizz18女人高潮| 成人看片黄a免费看在线| 免费激情视频在线观看| 黄色亚洲大片免费在线观看| 日韩和欧美的一区二区| 一区二区三区四区精品视频 | av首页在线观看| 一级日本不卡的影视| 日本黄色小视频在线观看| 国产69精品久久99不卡| 午夜视频在线瓜伦| 一区在线视频| 日本黄色播放器| 亚洲人成网亚洲欧洲无码| 亚洲最大成人网色| 日本免费一区二区三区四区| 九九精品视频在线观看| 国产在线黄色| 亚洲黄色在线看| 99久久免费国产精精品| 在线免费观看日本一区| 国产精品一区二区6| 亚洲美女偷拍久久| 九九九视频在线观看| 99久久免费精品高清特色大片| 成年人三级黄色片| 丝袜美腿亚洲综合| 日本网站免费在线观看| 欧美日韩第一区| 一区二区三区四区五区视频 | 在线视频一区观看| 精品免费在线| 久久精品女人的天堂av| 亚洲网址在线观看| 亚洲自拍偷拍色片视频| 国产人妖一区| 日韩免费不卡av| 午夜影视一区二区三区| 欧美激情第6页| 国产激情小视频在线| 最近更新的2019中文字幕| 国际av在线| 亚洲视频在线视频| 日产精品久久久久久久性色| 亚洲国产精品久久久久秋霞蜜臀| 国产成人精品无码高潮| 7777精品伊人久久久大香线蕉完整版 | 国产一区二区三区在线观看免费视频 | 四虎影视1304t| 欧美激情一区二区三区不卡 | 国产剧情一区| 日本一区二区三区视频在线观看| 一道本一区二区三区| 欧美高清一区二区| 久久最新网址| 色综合666| 青青草成人影院| 亚洲高清不卡一区| 91精品综合久久久久久久久久久| 亚洲国产日韩综合一区| 青青草国产免费一区二区下载| 日韩在线导航| 偷拍欧美精品| 久久视频免费在线| 亚洲高清电影| 免费毛片小视频| 视频在线在亚洲| 蜜桃免费在线视频| 久久国产乱子精品免费女| 亚洲一级片网站| 国产九九视频一区二区三区| 日韩av一卡二卡三卡| 国产精品白丝av| 黑人性生活视频| 不卡一区在线观看| 色无极影院亚洲| 国产精品国产a级| 欧美做爰爽爽爽爽爽爽| 亚洲成人在线免费| 日日夜夜操视频| 欧美日韩精品欧美日韩精品一综合| 91国内精品久久久| 日韩女同互慰一区二区| 亚洲av成人精品日韩在线播放| 亚洲视频在线观看视频| 欧洲日本在线| 久久露脸国产精品| 韩国三级一区| 97久久天天综合色天天综合色hd| 极品一区美女高清| 日韩av电影免费在线观看| 小说区亚洲自拍另类图片专区| 男人添女荫道口喷水视频| 免费在线观看成人av| 亚洲欧美日本一区二区三区| 国产高清久久久| 99久久久久久久久久| 国产精品久久久久aaaa樱花| 国产亚洲成人av| 欧洲一区二区av| 性生交生活影碟片| 一区二区三区视频在线| 中文字幕有码在线视频| 欧美在线免费看| 日韩精品视频在线看| 欧美aaaaa喷水| 午夜久久福利| 蜜臀av免费观看| 99久久国产免费看| 69av.com| 欧美日免费三级在线| 亚洲欧美日韩精品永久在线| 久久精品国产亚洲一区二区 | 日本高清成人免费播放| 国产成人精品免费看视频| 亚洲人成人99网站| 黄色的视频在线观看| 国产色视频一区| 亚洲人挤奶视频| 黄色激情在线视频| 激情偷乱视频一区二区三区| 女~淫辱の触手3d动漫| 亚洲精品日韩专区silk| 国语对白做受69按摩| 亚洲精品国产suv| 欧美黄色视屏| 91九色蝌蚪国产| 成人羞羞动漫| 日本老熟妇毛茸茸| 97超碰欧美中文字幕| 欧美激情一区二区视频| 欧美二区乱c少妇| 黄色小视频在线观看| 午夜精品理论片| 91欧美日韩在线| 日本精品福利视频| 黄色小说综合网站| 91视频免费看片| 色婷婷国产精品久久包臀| 日本韩国免费观看| 欧美激情精品在线| 精品久久亚洲| 国产精品h视频| 久久激情五月激情| 国产黄a三级三级| 欧美日韩免费高清一区色橹橹 | 九色91av视频| 国产精品一区二区三区四区在线观看| 日韩精品一区二区三区丰满| 久久久夜夜夜| 男女做爰猛烈刺激| 91精品福利在线| 二区在线视频| 国产精品入口夜色视频大尺度 | 怡红院成永久免费人全部视频| 亚洲欧美日韩一区二区在线 | 亚洲一区二区少妇| 亚洲a一区二区三区| 久久久久久久久久久久久久久国产| 国产欧美视频一区二区| 亚洲熟女乱色一区二区三区久久久| 一区二区欧美久久| 亚洲成人精品综合在线| 中文字幕一区二区三区精彩视频| 久久精品二区亚洲w码| 日韩高清dvd碟片| 精品久久一二三区| 大菠萝精品导航| 久久精品日韩| 视频精品一区二区| 少妇视频在线播放| 日韩一区二区三| 国产在线精彩视频| 欧美日韩国产精品一区二区| 秋霞午夜鲁丝一区二区老狼| 国内毛片毛片毛片毛片毛片| 日韩一区二区三区视频在线| 美足av综合网| 欧美高清性xxxxhd| 激情国产一区二区| 久久久久97国产| 亚洲人在线视频| 欧美视频精品| 嫩草影院中文字幕| 久久免费美女视频| 国产精品久久久久久久久毛片| 欧美国产第一页| 九九热线有精品视频99| 一级黄色特级片| 亚洲一区二区三区四区的| 日本五码在线| 成人在线观看视频网站| 夜夜夜久久久| 日韩av网站在线播放| 欧美精品一区二| 精品视频在线一区二区在线| 国产在线拍揄自揄拍无码| 99久久免费国产| 国产熟女一区二区丰满| 2019av中文字幕| 天天做天天爱天天综合网| 天堂www中文在线资源| 欧美在线free| a级大胆欧美人体大胆666| 午夜精品区一区二区三| 国产乱码精品一区二区三区五月婷| 久久久久亚洲av成人毛片韩| 久久久av一区| 国产麻豆精品久久| 亚洲色图欧美日韩| 欧美一区二区三区在线观看视频| 偷拍精品精品一区二区三区| 三级在线免费观看| 国产精品欧美极品|