亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

InnoDB 事務加鎖解析

2024-09-07 22:12:56
字體:
來源:轉載
供稿:網友
  一般大家對數據庫事務的了解可能停留在事務的ACID特性以及事務4種不同的隔離級別層面上,而對于事務 4 種不同隔離級別如何實現了解相對較少。
 
  本文以 MySQL 數據庫 InnoDB 引擎為例,為大家分析 InnoDB數據庫引擎對默認的隔離級別可重復讀(RR)的具體實現。
 
  整文知識點介紹:事務4種隔離級別、不同隔離級別解決的問題、MVCC、鎖的類型、加鎖案例分析;閱讀完整文相信大家對事務隔離級別的具體實現有了一定的認識。
 
  一、事務的隔離級別
  1、4 種隔離級別
 ?。?)未提交讀(Read uncommitted):一個事務讀取到其他事務未提交的數據,是級別最低的隔離機制;
 
 ?。?)提交讀(Read committed):一個事務讀取到其他事務提交后的數據;
 
 ?。?)可重復讀(Repeatable read):一個事務對同一份數據讀取到的相同,不在乎其他事務對數據的修改;
 
 ?。?)序列化(Serializable) :事務串行化執行,隔離級別最高,犧牲了系統的并發性。
 
  2、不同隔離級別解決的問題
  若不考慮事務的隔離級別,則事務的并發會造成以下問題:
 
 ?。?)臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據。
 
 ?。?)不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果 不一致。
 
 ?。?)幻讀:同一事務中對同一范圍的數據進行讀取,結果卻多出了數據或者少了數據,這就叫幻讀。(如同一事務對id<10的范圍進行2次查詢,第一次出現id=8、9的兩條數據,第二次出現id=7、8、9的3條數據)。
 
  不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

  二、MVCC
  上文提到 InnoDB 默認的隔離級別是可重復讀(RR),InnoDB是通過MVCC(多版本并發控制)來實現可重復讀的,下面為大家介紹MVCC。
 
  1、概念
  在InnoDB中,給每行增加兩個隱藏字段來實現MVCC,一個用來記錄數據行的創建時間,另一個用來記錄行的過期時間(刪除時間)。在實際操作中,存儲的并不是時間,而是事務的版本號,每開啟一個新事務,事務的版本號就會遞增。
 
  于是乎,默認的隔離級別(REPEATABLE READ)下,增刪查改變成了這樣:
 
  (1)SELECT
 
  讀取創建版本小于或等于當前事務版本號,并且刪除版本為空或大于當前事務版本號的記錄。這樣可以保證在讀取之前記錄是存在的。
 ?。?)INSERT

 ?。?)UPDATE
 
  新插入一行,并以當前事務的版本號作為新行的創建版本號,同時將原記錄行的刪除版本號設置為當前事務版本號。
 ?。?)DELETE
 
  2、快照讀和當前讀
 ?。?)快照讀:讀取的是快照版本,也就是歷史版本;
 
 ?。?)當前讀:讀取的是最新版本。
 
  普通的SELECT就是快照讀,而UPDATE、DELETE、INSERT、SELECT ...  LOCK IN SHARE MODE、SELECT ... FOR UPDATE是當前讀。
 
  (3)結論:如果隔離級別是REPEATABLE READ,那么在同一個事務中的所有普通select讀讀到的都是事務第一個讀到的快照,如此實現了可重復讀;而對于當前讀(UPDATE、DELETE、INSERT、SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE),InnoDB 通過加鎖來實現可重復讀,且InnoDB 加鎖同時解決了幻讀問題。
 
  三、鎖的類型
  InnoDB 引入以下三種鎖類型:
 
  Record Locks(記錄鎖):在索引記錄上加鎖,即行鎖,鎖住當前行。
  Gap Locks(間隙鎖):在索引記錄之間加鎖,或者在第一個索引記錄之前加鎖,或者在最后一個索引記錄之后加鎖。
  Next-Key Locks:在索引記錄上加鎖,并且在索引記錄之前的間隙加鎖。它相當于是Record Locks與Gap Locks的一個結合。
  假設一個索引包含以下幾個值:10,11,13,20。那么這個索引的next-key鎖將會覆蓋以下區間:(-oo, 10]、(10, 11]、(11, 13]、(13, 20]、(20, +oo)。
 
  MySQL InnoDB 通過間隙鎖解決了幻讀問題。以下通過實際的案例分析來介紹InnoDB 是如果解決幻讀問題的。
 
  四、案例分析
  在對SQL進行加鎖分析前,需要明確表的結構和索引類型。在不知道索引的情況下直接給出一條SQL來分析如果加鎖是沒有任何意義的。
 
  以下以用戶表(t_user)為例(id為主鍵,name為唯一索引,age為一般索引,address無索引)分析不同索引條件的加鎖表現。
 
  1、主鍵索引
  例:delete from t_user where id=120;
 
  此種情況下,其他事務除了不能刪除、更新此條記錄外,其他插入其他行、更新其他行都行。
 
  2、唯一索引
  例:delete from t_user where name='n20';
  條件為唯一索引,鎖住索引記錄,同時鎖住聚簇索引中的對應行記錄:
 
  3、一般索引
  例:delete from t_user where age=20;
  與主鍵和唯一索引不同的是,一般索引的記錄是允許重復的;換句話說,如果我們單純地給索引加記錄鎖時,其他事務依然可以插入,也就有可能出現幻讀問題了。
 
  所以除了給對應索引記錄加上記錄鎖之外,還要給Gap加上鎖。
 
  從上面知識點我們可以預估這個操作一共需要的鎖:
 
  age索引記錄鎖(Record Lock) : 20_120, 20_130(以下均用age_id這種形式表示索引值)
  age索引間隙鎖(Gap X-Lock): (10, 20)、(20, 20)、(20, 40)
  聚簇索引上的記錄鎖(Record X-Lock): id=120/130對應的行記錄
  SQL驗證:
 
  根據實際情況,3-6均符合我們預期,然而7和8則超出了我們預期的鎖范圍。為什么會超出我們預期呢?此次我們進行分析一下:
 
  從7、8插入語句來看,由于id為自增主鍵,會自動遞增,語句7插入值預計為:10_141;
 
  語句8插入值預計為:40_141,為什么只有后者能插入呢?
  其實我們可以將B+樹中的間隙理解得更加精準一點:
 
  age=20的三個間隙應該為:(10_110, 20_120)、(20_120, 20_130)、(20_130, 40_140);
 
  可以看出語句7插入值10_141 無法插入,因為間隙被鎖住了;而語句8插入 40_141值因為在間隙之外了,無鎖沖突,允許插入。
 
  所以最終的加鎖情況應該這樣表示:
 
  age索引記錄鎖(Record Lock) :20_120, 20_130
  age索引間隙鎖(Gap X-Lock):(10_110, 20_120)、(20_120, 20_130)、(20_130, 40_140)
  聚簇索引上的記錄鎖(Record X-Lock):id=120/130對應的行記錄
  4、無索引
  delete from t_user where address='a20',因為無法精準定位,InnoDB選擇將聚簇索引中的所有行以及間隙都鎖起來,功能上已經等于鎖表了:
 
  5、結論
  InnoDB 在RC(READ COMMITTED)隔離級別中,只會在對應的索引/行記錄上加Record Lock,而不會加Gap鎖,原因也很簡單,因為該隔離級別是允許存在幻讀問題的。
 
  在RR級別下的加鎖方式稱之為Next-Key Locks,其實就是上述Record Locks和Gap Locks的結合。比如Gap Lock為(10,20) ,record lock為20,結合的Next-Key lock 為:(10, 20]。
 
  分析Next-Key Locks其實就是要分析Record Locks和Gap Locks。MySQL InnoDB的可重復讀并不保證避免幻讀,需要應用使用加鎖讀來保證。而這個加鎖讀使用到的機制就是next-key locks。
 
  如果使用普通的讀,會得到一致性的結果,如果使用了加鎖的讀,就會讀到“最新的”“提交”讀的結果。本身,可重復讀和提交讀是矛盾的。在同一個事務里,如果保證了可重復讀,
 
  就會看不到其他事務的提交,違背了提交讀;如果保證了提交讀,就會導致前后兩次讀到的結果不一致,違背了可重復讀??梢赃@么講,InnoDB提供了這樣的機制,在默認的可重復讀的隔離級別里,可以使用加鎖讀去查詢最新的數據。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人欧美一区二区三区在线湿哒哒| 久久久国产精品一区| 国产日韩精品在线播放| 粉嫩老牛aⅴ一区二区三区| 91色精品视频在线| 欧美电影电视剧在线观看| 久久精品国产成人| 久久夜色精品国产| 久久av红桃一区二区小说| 日本精品一区二区三区在线| 亚洲人av在线影院| 91av免费观看91av精品在线| 97香蕉久久夜色精品国产| 一区二区三区黄色| 97在线精品国自产拍中文| 久久成人18免费网站| 国产日韩亚洲欧美| 中文字幕亚洲欧美在线| 日本韩国在线不卡| 亚洲香蕉av在线一区二区三区| 亚洲精品福利在线观看| 国产精品专区一| 91国内免费在线视频| 国产精品99蜜臀久久不卡二区| 久久精品视频99| 国产91精品在线播放| 国产精自产拍久久久久久| 亚洲18私人小影院| 一本色道久久88综合亚洲精品ⅰ| 日韩美女中文字幕| 2019中文在线观看| 亚洲免费视频网站| 成人黄色免费在线观看| 日本欧美国产在线| 成人午夜在线视频一区| 欧美国产高跟鞋裸体秀xxxhd| 欧美精品激情在线观看| 国产精品va在线播放我和闺蜜| 亚洲天堂成人在线| 国产精品27p| 欧美一级在线亚洲天堂| 久久影院资源网| 欧美精品做受xxx性少妇| 欧美国产在线电影| 国产精品电影一区| 欧美极品少妇xxxxⅹ免费视频| 欧美日韩亚洲精品一区二区三区| 亚洲毛片在线观看.| 亚洲电影免费观看高清完整版在线观看| 成人乱人伦精品视频在线观看| 日本中文字幕不卡免费| 日韩精品免费综合视频在线播放| 欧美精品精品精品精品免费| 色悠悠国产精品| 欧美成人sm免费视频| 深夜福利一区二区| 成人性生交大片免费看小说| 岛国av一区二区| 久久精品视频播放| 91大神福利视频在线| 亚洲视频日韩精品| 亚洲国产女人aaa毛片在线| 成人免费网视频| 精品国产一区二区三区久久狼5月| 欧美成人精品影院| 欧美日韩国产精品| 日韩电影大全免费观看2023年上| 亚洲国产精品久久久久| 中文字幕一区电影| 一本色道久久88综合亚洲精品ⅰ| 国内外成人免费激情在线视频| 欧美成人免费在线观看| 97国产精品视频人人做人人爱| 九九精品在线观看| 91久久久久久久久| 欧美一级免费视频| 亚洲美女av电影| 日韩有码在线电影| 中文字幕不卡在线视频极品| 国产精品中文字幕久久久| 2019亚洲日韩新视频| 成人av色在线观看| 欧美成人三级视频网站| 这里只有精品久久| 日韩欧美一区视频| 精品国产老师黑色丝袜高跟鞋| 日韩电影免费在线观看中文字幕| 91sao在线观看国产| 欧美成年人网站| 51精品在线观看| 26uuu日韩精品一区二区| 亚洲色图25p| 亚洲第一网中文字幕| 欧美精品电影免费在线观看| 国产精品h在线观看| 国产精品欧美激情在线播放| 亚洲第一福利网| 91情侣偷在线精品国产| 4444欧美成人kkkk| 精品国产乱码久久久久久虫虫漫画| 国内精品久久久久影院 日本资源| 91在线视频一区| 91久久久久久久一区二区| 综合欧美国产视频二区| 日韩精品亚洲元码| 777精品视频| 久久久久久国产| 欧美视频免费在线观看| 亚洲一区二区三区四区视频| 国产精品自产拍在线观看| 精品久久久久久久久中文字幕| 一区二区日韩精品| 亚洲欧美日韩一区二区在线| 91久久久久久久久久久| 亚洲美女中文字幕| 亚洲男人天堂九九视频| 久久免费精品日本久久中文字幕| 美女久久久久久久| 欧美国产精品日韩| 久青草国产97香蕉在线视频| 欧美成人精品不卡视频在线观看| 亚洲高清免费观看高清完整版| 国产精品女人网站| 欧美黄色www| 亚洲精品视频免费在线观看| 91在线视频九色| 国产亚洲精品一区二555| 久久影院在线观看| 国产精品对白刺激| 国产精品久久久久久久久久99| 一区二区三区久久精品| 色综合老司机第九色激情| 欧美极度另类性三渗透| 国产一区二区三区视频| 日韩午夜在线视频| 亚洲国产毛片完整版| 亚洲精品福利免费在线观看| 欧美激情视频一区| 久久躁日日躁aaaaxxxx| 亚洲综合在线中文字幕| 日本久久亚洲电影| 亚洲一区二区三区在线免费观看| 中文字幕亚洲天堂| 九九热精品在线| 国产成人av在线| 亚洲国产精品女人久久久| 久久精品亚洲热| 57pao成人国产永久免费| 这里只有精品丝袜| 亚洲理论电影网| 91精品国产综合久久香蕉的用户体验| 国产91对白在线播放| 国产精品日日做人人爱| 欧美高清视频免费观看| 国内偷自视频区视频综合| 久久久久99精品久久久久| 日韩av免费看| 欧美日韩加勒比精品一区| 欧美成人免费观看| 久久69精品久久久久久国产越南| 欧美激情成人在线视频| 中文字幕日韩高清| 91精品国产综合久久香蕉的用户体验| 26uuu日韩精品一区二区|