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

MySQL:逃不掉的鎖事,間隙鎖

數據庫 MySQL
間隙鎖意如其名,就是鎖定符合條件但是實際不存在的記錄,也就是一定的區間,防止其他事務在某個事務執行期間向該區間插入新的記錄。

我們知道在MySQL中存在幻讀的情況,也就是一個事務在讀取某個范圍內的記錄時,發現了另一個事務在該范圍內新增了記錄(或者刪除了記錄),導致兩次讀取的記錄數量不一致,進而產生了“幻覺”一般的現象。也就是說,幻讀是指在多個事務同時讀取同一范圍內的記錄時所產生的矛盾現象。

MySQL為了解決幻讀一般采用快照讀和間隙鎖的方式,其中快照讀在之前的文章已經多次提及,本篇文章重點介紹間隙鎖。

間隙鎖意如其名,就是鎖定符合條件但是實際不存在的記錄,也就是一定的區間,防止其他事務在某個事務執行期間向該區間插入新的記錄。

為清楚梳理間隙鎖的作用,我們在本文中使用的示例表如下:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `c` (`c`)
) ENGINE=InnoDB;


insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);

在示例表中執行如下語句:

begin;
select * from t where d=5 for update;
commit;

語句中的select for update就是為了在查詢時,對相關語句進行加鎖,避免其他用戶對該表進行插入、修改、刪除等操作,造成表的不一致。

d=5這一行對應主鍵為Id=5,執行select語句后改行會被加寫鎖,并在commit后釋放。但是由于d列沒有索引,所以會被全表掃描,這時候真實的加鎖邏輯為:

  1. 全表掃描一般指主鍵索引樹掃描;
  2. 對于會不會被加鎖:

RC級別下,只會在滿足條件的行加行鎖(直至事務commit/rollback才會釋放),不滿足條件的是先加鎖然后再直接釋放鎖;

RR級別下會加行鎖+全表間隙鎖(next-key lock是左開右閉,間隙鎖是左開右開);

這里可以先記住這個邏輯,我們在下面的文章中會逐步開始介紹。

1 幻讀

1.1 幻讀是什么

注意,如下的結論都是假設存在,從而引入間隙鎖的概念。

如果沒有間隙鎖,只有行鎖,即:上面的語句只會鎖住:id=5的這一行數據,那么就會出現如下圖所示的場景:

圖片圖片

for update在當前讀可以理解為:MySQL認為for update已經給當前的行加了寫鎖,因此沒有必要再進行快照讀,但是這樣會造成幻讀的問題。

如果沒有間隙鎖,就會出現如下的結果:

  1. Q1 只返回 id=5 這一行;
  2. 在 T2 時刻,session B 把 id=0 這一行的 d 值改成了 5,因此 T3 時刻 Q2 查出來的是 id=0 和 id=5 這兩行;
  3. 在 T4 時刻,session C 又插入一行(1,1,5),因此 T5 時刻 Q3 查出來的是 id=0、id=1 和 id=5 的這三行。

Q3讀到id=1這一行的現象就是”幻讀“,即:在同一個事務中,兩次讀取到的數據不一致的情況可稱為幻讀和不可重復讀,其中幻讀針對insert導致的數據不一致,不可重復讀針對的delete/update導致的數據不一致。注意:這里的讀指的是當前讀,比如查詢語句中包含for update、in share mode,以及修改刪除語句都會開啟當前讀,否則就是快照讀。

  • 快照讀:指的是在語句執行之前或者在事務開始的時候創建一個一致性視圖,后面的讀都是基于這個視圖,不會再去查詢最新的值;
  • 當前讀:指的是更新之前必須先查詢當前的值,因此叫做當前讀,比如說:select for update或者select in share mode;

SELECT ... LOCK IN SHARE MODE走的是IS鎖(意向共享鎖),即在符合條件的rows上都加了共享鎖,這樣的話,其他session可以讀取這些記錄,也可以繼續添加IS鎖,但是無法修改這些記錄直到你這個加鎖的session執行完成(否則直接鎖等待超時)。 

SELECT ... FOR UPDATE 走的是IX鎖(意向排它鎖),即在符合條件的rows上都加了排它鎖,其他session也就無法在這些記錄上添加任何的S鎖或X鎖。如果不存在一致性非鎖定讀的話,那么其他session是無法讀取和修改這些記錄的,但是innodb有非鎖定讀(快照讀并不需要加鎖),for update之后并不會阻塞其他session的快照讀取操作;

除了select ...lock in share mode和select ... for update這種顯示加鎖的查詢操作。 通過對比,發現for update的加鎖方式無非是比lock in share mode的方式多阻塞了select...lock in share mode的查詢方式,并不會阻塞快照讀

1.2 幻讀的問題

1.2.1 語義上的問題

sessionA在T1時刻聲明:把所有d=5的行鎖住,不允許其他的事務進行讀寫操作,但是sessionB和sessionC卻能夠隨意改變語義,新增或者通過修改了對應行的值。

圖片圖片

1.2.2 數據一致性問題

鎖的設計不僅僅是數據庫內存數據狀態的一致性,還包括數據與日志在邏輯上的一致性。

圖片圖片

如果沒有間隙鎖,上面的操作在binlog的記錄(binlog是在commit提交時進行記錄)就是:

/** session B提交語句 */
update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/
/** session C提交語句 */
insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/
/** session A提交語句 */
update t set d=100 where d=5;/*所有d=5的行,d改成100*/

使用該binlog恢復或者備份,三行中d=100,出現異常;

進一步,我們增加寫鎖。

圖片圖片

在binlog的記錄為:

insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/


update t set d=100 where d=5;/*所有d=5的行,d改成100*/


update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/

2 幻讀的解決方法

2.1 next-key lock

因此上面的幻讀產生的原因就是說,行鎖只是鎖住了行,但是新插入記錄這個動作,要更新的是記錄之間的間隙。這也是InnoDB引入間隙鎖(Gap Lock)的原因。

圖片圖片

間隙鎖的增加邏輯為:

  1. 對主鍵或者唯一索引,如果當前讀時,where條件全部精準命中(=或者in),這種場景本身就不會產生幻讀,所以只會加行記錄鎖;
  2. 沒有索引的列,當前讀操作時,會加全表的gap鎖;
  3. 非唯一索引列,如果where條件部分命中(>/</like等)或者全部沒有命中,則會加附近Gap間的間隙鎖;例如,某表數據如下,非唯一索引2,6,9,9,11,15。如下語句要操作非唯一索引列9的數據,gap鎖將會鎖定的列是(6,11],該區間內無法插入數據。
  4. 跟間隙鎖存在沖突關系的,是“往這個間隙中插入/更新/刪除一條新的記錄”這個操作,間隙鎖之間不存在沖突關系。

間隙鎖和行鎖合稱 next-key lock,每個 next-key lock 是前開后閉區間。也就是說,我們的表 t 初始化以后,如果用 select * from t for update 要把整個表所有記錄鎖起來,就形成了 7 個 next-key lock,分別是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

2.2 next-key lock引入的問題

如下的示例,在索引唯一的時候,Insert ... on duplicate key update可用,但是如果有多個唯一鍵的時候,會有異常。

begin;
select * from t where id=N for update;


/*如果行不存在*/
insert into t values(N,N,N);
/*如果行存在*/
update t set d=N set id=N;


commit;

圖片圖片

在并發情況下,即使沒有后續的update操作也會引入死鎖。

  1. sessionA執行select ... for update語句,由于id=9不存在,因此會加上間隙鎖(5,10);
  2. sessionB執行select ... for update語句,由于id=9不存在,因此會加上間隙鎖(5,10),間隙鎖之間不存在沖突,因此可以執行成功;
  3. session B 試圖插入一行 (9,9,9),被 session A 的間隙鎖擋住了,只好進入等待;
  4. session A 試圖插入一行 (9,9,9),被 session B 的間隙鎖擋住了。

即:間隙鎖的引入,可能會導致同樣的語句鎖住更大的范圍,影響并發度。

2.3 讀提交+row模式的Binlog解決幻讀

間隙鎖在可重復讀隔離級別下才會出現,因此,如果把隔離級別設置為讀提交,就可以避免幻讀的問題。同時,為了解決可能出現的數據和日志不一致的問題,需要將Binlog的格式設置為row。

舉例: 刪除 statement記錄的是這個刪除的語句,例如: delete from t where age>10 and modified_time<='2020-03-04' limit 1 而row格式記錄的是實際受影響的數據是真實刪除行的主鍵id,例如: delete from t where id=3 and age=12 and modified_time='2020-03-05'

那為什么RR級別不需要修改binlog_format呢:

  1. 間隙鎖是可重復讀級別下解決幻讀的,同時解決了binlog和數據可能存在的不一致問題,即:binlog日志的寫入順序錯誤問題;
  2. 間隙鎖解決了binlog的問題,而不是Binlog解決了間隙鎖的問題;
  3. 讀提交級別也有binlog執行順序錯誤的問題,也沒有間隙鎖,因此,需要將binlog_format修改為row模式,來解決binlog可能帶來的錯誤;
  4. binlog的row模式比statement要記錄的更全面,每一行記錄改變都記錄下來,導致日志大,同時IO次數更多;

如果業務不需要可重復讀場景,考慮在讀提交下操作數據的鎖范圍更小(沒有間隙鎖),這個選擇是合理的。

2.4 讀提交和可重復讀

可重復讀的場景舉例,比如說:金融業務,財務需要統計過去一段時間內某些數據,需要反復根據某些條件查找,此時如果有新數據行插入,會導致統計時發生數據不一致的情況,此時需要使用可重復讀的隔離級別。

又比如說邏輯備份時,mysqldump備份線程會設置為可重復讀,這樣在導數據時就會啟動一個事務,確保拿到一致性視圖。由于MVCC的支持,過程中數據可正常更新。使用可重復讀,是為了保證備份的數據都是那一時刻的最新數據,然后通過binlog再做后續的恢復即可。

業務線程是讀提交,備份線程是可重復讀,同時存在兩種事務隔離級別,是否會沖突?

答案是不會,因為不管是RC還是RR,都是MVCC支持,唯一不同在于生成快照的時間點不同,也就是能夠看到的數據版本不同,所以并不影響。備份完成后,恢復為RC即可。

3 間隙鎖的加鎖規則

加鎖規則總結如下:

  1. 原則1:加鎖的基本單位是next-key lock,是前開后閉;
  2. 原則2:查找過程中訪問到的對象(索引)才會加鎖;
  3. 優化1:索引上的等值查詢,如果可以匹配到對應數據,則給唯一索引加鎖,next-key lock退化為行鎖;如果匹配不到,按照原則2加鎖;
  4. 優化2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件時,next-key lock退化為間隙鎖;
  5. 一個bug:唯一索引的范圍查詢會訪問到不滿足條件的第一個值為止;【該bug已經在MySQL8.0.18版本開始修復,但是也有提出實際上只修復了主鍵上的問題,唯一索引沒有修復,需要驗證】

原則2也就解釋了:

  • 為什么未命中索引的查詢要走全表掃描后導致全表加鎖的原因;
  • 這里說的訪問到的對象,是從底層結構來看待,而不是數據表的一行。例如,普通索引和主鍵索引,如果訪問到的是普通索引,而且通過索引覆蓋并不需要回表查主鍵索引,那么主鍵索引上并不需要加任何的鎖,因為并沒有訪問主鍵索引樹上的對象。

本節還是使用章節組開始的表進行說明。

3.1 等值查詢間隙鎖

圖片圖片

表中沒有id=7的記錄,因此:

  • 根據原則1,加鎖單位為next-key lock,sessionA的加鎖范圍為:(5,10];由于是根據id進行檢索,所以會鎖住主鍵索引對象;
  • 根據優化2,sessionA為等值查詢,id=10不滿足查詢條件,退化為間隙鎖,因此加鎖的最終范圍為(5,10);

因此,插入id=8的記錄會被鎖住,等待sessionA鎖釋放,sessionC修改id=10這一行可以正常執行。

3.2 非唯一索引等值鎖

圖片圖片

這個例子說明的就是原則2中的對象。

注意:sessionA要給索引c=5加讀鎖,而且是索引c獲取主鍵,實際上就是覆蓋索引,不需要回表。

  • 根據原則1,加鎖單位為next-key lock,給(0,5]加next-key lock;
  • c為普通索引,且非唯一,需要向右遍歷到第一個不符合條件的值才能停止,即:直到c=10放棄。根據原則2,被訪問到的對象都需要加鎖,因此,(5,10]加next-key lock;
  • 根據優化2,因為是等值判斷,最后一個值不滿足c=5,因此退化為間隙鎖(5,10);
  • 根據原則2,只有被訪問到的對象才會加鎖,這個查詢使用覆蓋索引,并不需要主鍵索引,所以主鍵索引沒有加任何索,sessionB的update語句可以執行完成;sessionC的語句被sessionA的間隙鎖鎖住。

同時需要注意的是:

  • for update:系統認為接下來會更新數據,因此會將主鍵索引滿足條件的行加行鎖;
  • in share mode:如果有覆蓋索引優化,沒有訪問到主鍵索引,那么主鍵索引不會加鎖;

因此,這里也就存在說,如果要使用lock in share mode給行家讀鎖防止數據行被更新,就必須繞過覆蓋索引的優化

3.3 主鍵索引范圍鎖

對于表t,如下兩條語句的加鎖范圍完全不同,語句1只會加行鎖,那么語句2呢?

mysql> select * from t where id=10 for update;
mysql> select * from t where id>=10 and id<11 for update;

圖片圖片

  • 開始執行時,要找到第一個id=10的行,由于是主鍵,所以是唯一索引,由next-key lock(5,10]退化為行鎖id=10;
  • 范圍查找繼續往后查找,找到id=15停止,因此需要加next-key lock(10,15],從8.0.18版本,間隙鎖退化為(10,15);

此時sessionA鎖的范圍為id=10的行鎖和(10,15]的間隙鎖,因此sessionB和sessionC被阻塞;

可以使用語句“select * from performance_schema.data_locks”表獲取加鎖的數據。

3.4 非唯一索引范圍鎖

使用索引c進行范圍查詢:

圖片圖片

由于c不是唯一索引,因此需要加(5,10]和(10,15]兩個next-key lock,因此后兩個會話的操作全部被阻塞。

3.5 唯一索引范圍鎖bug

注意,這個bug在8.0.18版本及之后的版本已經優化,不再存在。

圖片圖片

session A 是一個范圍查詢,按照原則 1 的話,應該是索引 id 上只加 (10,15]這個 next-key lock,并且因為 id 是唯一鍵,所以循環判斷到 id=15 這一行就應該停止了。

但是實現上,InnoDB 會往前掃描到第一個不滿足條件的行為止,也就是 id=20。而且由于這是個范圍掃描,因此索引 id 上的 (15,20]這個 next-key lock 也會被鎖上。

3.6 非唯一索引上存在“等值”的問題

執行插入語句:

mysql> insert into t values(30,10,30);

圖片圖片

雖然有兩個c=10的索引,但是主鍵不同,因此,c=10記錄存在間隙。

圖片圖片

sessionA在遍歷的時候,先訪問到第一個c=10的記錄,根據原則1,加鎖為:(c=5,id=5)到(c=10,id=10)這個next-key lock,即c的索引為(5,10]。

然后sessionA向右查找,直至(c=15,id=15),循環結束。根據優化2,等值查詢,退化為(c=10,id=10)到(c=15,id=15)的間隙鎖,即c的索引為(10,15);

主鍵索引上,增加了行鎖id=10和id=30;

因此,索引c上的加鎖范圍為下圖藍色區域:

圖片圖片

藍色兩邊是虛線,表示開區間,即 (c=5,id=5) 和 (c=15,id=15) 這兩行上都沒有鎖。

這里再次舉例: 如果session b插入(4,5,50),不會被鎖,如果插入(6,5,50) 會被鎖住,因為二級索引的葉子節點存儲的是主鍵值,二級索引的葉子節點也是有序的,這樣6,5,50根據二級索引來排的話 是在5,5,10后面的 。

3.7 limit語句加鎖

圖片圖片

sessionA的delete語句加了limit 2,表內只有兩條數據,刪除效果一樣,但是加鎖效果不同。

delete語句加了limit 2的限制,遍歷到(c=10,id=30)這一行之后,滿足條件的語句已經有兩條,循環結束。因此,索引c的加鎖范圍變成了(c=5,id=5) 到(c=10,id=30) 這個前開后閉區間。

圖片圖片

因此說,在執行刪除的時候盡量加Limit,但是這里需要注意的是,刪除的行數不清楚,可能會帶來業務的bug。

3.8 一個死鎖的例子

圖片圖片

  • sessionA啟動事務后執行查詢語句加lock in share mode,在索引c加next-key lock(5,10]和間隙鎖(10,15);
  • sessionB的update語句也要在索引c上加next-key lock(5,10],進入鎖等待;
  • 然后sessionA要再插入(8,8,8)這一行,被sessionB的間隙鎖鎖住。由于出現了死鎖,InnoDB讓sessionB回滾;

session B 的“加 next-key lock(5,10] ”操作,實際上分成了兩步,先是加 (5,10) 的間隙鎖,加鎖成功;然后加 c=10 的行鎖,這時候才被鎖住的。也就是說,我們在分析加鎖規則的時候可以用 next-key lock 來分析。但是要知道,具體執行的時候,是要分成間隙鎖和行鎖兩段來執行的。

就算分成了兩步,為什么session B加(5,10)就能成功呢?session A不是加了(5, 10]的鎖嗎? 前面應該也是提到過的,間隙鎖和間隙鎖之間并不沖突,間隙鎖和insert到這個間隙的語句才會沖突,因此session B加間隙鎖(5, 10)是可以成功的,但是如果往(5, 10)里面插入的話會被阻塞。 但是如果直接加next-key lock(5, 10],那么肯定是會被阻塞的,因此這個例子確實說明,加鎖的步驟是分兩步的,先是間隙鎖,后是行鎖。而且只要理解了間隙鎖和行鎖之間沖突的原則是不一樣的,也就很容易理解這兩個鎖并不是一起加的了。 

責任編輯:武曉燕 來源: 陸隊長
相關推薦

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2020-10-20 13:50:47

MySQL數據庫

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2022-10-24 08:02:14

MySQL索引類型

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2025-11-10 08:41:06

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2020-07-02 08:22:56

MySQL間隙鎖過行鎖

2024-04-03 09:50:33

MySQLMDL事務

2013-12-19 13:25:40

InnoDB數據庫

2024-01-16 12:19:08

MySQL重要機制高并發

2011-04-11 17:10:16

Oracle

2018-07-31 10:10:06

MySQLInnoDB死鎖

2024-11-29 07:38:12

MySQL數據庫

2018-11-16 11:03:34

Java樂觀鎖無鎖

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2023-03-26 21:51:42

2022-02-21 15:01:45

MySQL共享鎖獨占鎖

2024-05-13 12:44:00

InnodbMySQL行級鎖

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖
點贊
收藏

51CTO技術棧公眾號

亚洲精品国产91| 成人一级片网站| 亚洲精品综合久久| 免费久久99精品国产自在现线| 亚洲精品网站在线播放gif| 国模无码视频一区二区三区| 国产在线观看免费| 久久99久久99小草精品免视看| 久热精品在线视频| 无码人妻一区二区三区在线| 性高爱久久久久久久久| 亚洲人成电影网站色mp4| 精品国产_亚洲人成在线| 成人av网站在线播放| 欧美二区视频| 在线视频一区二区| 亚洲成年人在线观看| 播放一区二区| 午夜久久久久久| 亚洲一区二区在线看| 天堂网av2014| 国产精品一二三在| 国产精品福利观看| 日韩xxxxxxxxx| 一区二区免费不卡在线| 亚洲日韩欧美视频| 无码任你躁久久久久久老妇| 国产精品99久久久久久董美香 | 国产精品免费无码| 欧美一级大片在线视频| 欧洲一区二区三区免费视频| 国精产品一区一区三区视频| 久草中文在线| 亚洲国产精品二十页| 久久免费99精品久久久久久| www.av导航| 精品一区免费av| 国产精品毛片a∨一区二区三区|国| 国产情侣自拍av| 一区精品久久| 另类图片亚洲另类| 999福利视频| 欧美日中文字幕| 亚洲欧美另类国产| 少妇精品一区二区| 国产精品网址| 精品久久国产97色综合| 国产精品久久久久久久99| 欧美成人黄色| 欧美日韩国产美| 美女少妇一区二区| 99久久久国产精品免费调教网站| 色综合久久久网| 日本在线观看a| 精品91久久| 色哟哟日韩精品| 免费在线观看的毛片| 成人激情综合| 欧美日韩久久一区| 91小视频在线播放| 精品国产不卡一区二区| 日韩久久精品一区| 色哟哟无码精品一区二区三区| 1204国产成人精品视频| 亚洲а∨天堂久久精品9966| 黄色av电影网站| 老牛国内精品亚洲成av人片| 亚洲国产欧美久久| 在线观看福利片| 日韩欧美一区二区三区免费看| 中文字幕日韩高清| 午夜爽爽爽男女免费观看| 中文字幕一区二区三区欧美日韩 | 日韩欧美久久一区| 欧美丰满熟妇bbb久久久| 高清一区二区三区| 精品亚洲一区二区| 国产第一页精品| 亚洲精品2区| 欧美激情xxxxx| 青草视频在线观看免费| 久久亚洲色图| 亚洲japanese制服美女| 欧美熟妇乱码在线一区| aaa欧美日韩| 亚洲第一导航| 欧美性受ⅹ╳╳╳黑人a性爽| 污片在线观看一区二区| 手机视频在线观看| 18国产精品| 亚洲天堂av综合网| 男女做暖暖视频| 国产精品毛片| 成人欧美在线视频| 视频一区二区免费| 中文av字幕一区| www.好吊操| 日韩色淫视频| 精品福利视频一区二区三区| 日韩一级av毛片| 欧美日本二区| 日韩美女中文字幕| 国产sm主人调教女m视频| 91麻豆国产自产在线观看| 一区不卡字幕| 91九色porn在线资源| 欧美三级日本三级少妇99| www.四虎精品| 五月天久久777| 人体精品一二三区| 亚洲第一大网站| 欧美激情一区二区三区四区| 免费超爽大片黄| 97精品资源在线观看| 亚洲男人第一av网站| 九九热国产精品视频| 蜜臀精品一区二区三区在线观看| 国内精品视频在线播放| 成人短视频在线| 在线日韩国产精品| 国产精品久久久免费观看| 一区二区三区在线观看免费| 国产脚交av在线一区二区| 蜜臀av在线观看| 亚洲天堂久久久久久久| 少妇人妻互换不带套| 精品欠久久久中文字幕加勒比| 久久人人爽人人爽人人片亚洲| 精品免费囯产一区二区三区| 成人免费看视频| 黄瓜视频免费观看在线观看www | 国产精品天堂| 五月天激情综合| 国产国语老龄妇女a片| 久久精品影视| 91精品久久久久久| 色影院视频在线| 在线观看日韩电影| 自拍偷拍视频亚洲| 久久久久久9| 蜜桃999成人看片在线观看| 色呦呦在线视频| 91精品国产91久久久久久一区二区 | 日韩欧美精品一区二区三区经典| 超碰在线99| 亚洲第一福利视频| 久久精品国产亚洲av无码娇色 | 日韩欧美一区二区三区| 香港三级日本三级| 亚洲精选久久| 久久久久久久久四区三区| 2019中文字幕在线电影免费 | 国产精品日韩欧美综合| 川上优的av在线一区二区| 日本乱码高清不卡字幕| 人人妻人人藻人人爽欧美一区| 国产精品久久777777毛茸茸| 国产精品久久亚洲| 美女视频在线免费| 亚洲男人7777| 日本一区二区三区久久| 国产精品欧美一级免费| 亚洲天堂网2018| 欧美暴力喷水在线| 国产高清在线一区| 蜜桃视频动漫在线播放| 亚洲天堂男人天堂| 91女人18毛片水多国产| 亚洲免费观看高清完整| av天堂一区二区| 久久青草久久| 在线无限看免费粉色视频| 一区中文字幕| 欧美一级淫片aaaaaaa视频| 国产毛片在线| 欧美一区二区精品| 日本三级午夜理伦三级三| 久久亚洲精品国产精品紫薇| 日本中文字幕高清| 综合激情在线| 久久久久久九九九九| yy6080久久伦理一区二区| 久久影视电视剧免费网站| 亚洲精品国产精| 色婷婷久久久亚洲一区二区三区 | 成人免费看片39| 成人免费淫片aa视频免费| 成人高潮aa毛片免费| 亚洲男人的天堂在线播放| 国产孕妇孕交大片孕| 午夜久久久久久| 久久久久人妻一区精品色| 国产.精品.日韩.另类.中文.在线.播放| 男女激情无遮挡| 色777狠狠狠综合伊人| 粉嫩高清一区二区三区精品视频 | www.男人天堂| 免费在线观看精品| 欧美高清中文字幕| 欧美先锋资源| 国产免费一区二区| 未满十八勿进黄网站一区不卡| 欧美激情按摩在线| 午夜免费福利在线观看| 精品粉嫩超白一线天av| 免费看av在线| 欧美日韩国产在线播放| 亚洲天堂黄色片| 久久九九久久九九| 四虎永久免费观看| 精品一区二区三区视频在线观看| 免费无遮挡无码永久视频| 希岛爱理一区二区三区| 欧美另类一区| 久久久久97| 亚洲自拍在线观看| 久久爱.com| 国产成人精品久久| bl在线肉h视频大尺度| 日韩有码在线视频| 国产无套粉嫩白浆在线2022年| 精品蜜桃在线看| 国产探花精品一区二区| 欧美中文字幕一二三区视频| 成人毛片18女人毛片| 一区二区高清视频在线观看| 中文字幕第69页| 国产亚洲精久久久久久| 国产精品无码在线| 福利一区福利二区| 午夜性福利视频| 国产一区二区在线观看免费| jizzzz日本| 日本vs亚洲vs韩国一区三区| 欧美一级黄色片视频| 一本一道久久综合狠狠老精东影业| 超碰97在线看| 亚洲欧美综合久久久| 正在播放国产精品| 999久久久精品国产| 亚洲精品乱码视频| 日韩精品免费一区二区三区| 午夜老司机精品| 国产日产精品_国产精品毛片| 欧美精品国产精品久久久| 日韩a级大片| 久久久一本精品99久久精品| 欧美做受69| 裸模一区二区三区免费| 妖精视频一区二区三区免费观看| 精品久久sese| 亚洲精品动态| 日韩免费中文专区| 98精品视频| 国产精品啪啪啪视频| 欧美日韩网站| 日韩视频免费播放| 欧美亚洲一区二区三区| 无码无遮挡又大又爽又黄的视频| 久久福利一区| 依人在线免费视频| 国产在线不卡一区| 欧美性生交xxxxx| 91在线porny国产在线看| 国产精品揄拍100视频| 久久久久久97三级| 日韩黄色中文字幕| 亚洲欧美视频一区| 日本天堂在线视频| 色综合一区二区| 一级黄色片在线播放| 欧美一区二区久久久| 天天躁日日躁狠狠躁喷水| 亚洲免费电影一区| 秋霞成人影院| 欧美激情视频三区| 视频二区不卡| 成人亚洲激情网| 极品尤物一区| 亚洲欧美日韩不卡一区二区三区| 亚洲色图欧美| 成人综合视频在线| 久久精品国产久精国产| 午夜性福利视频| 国产日韩欧美精品在线| 成人在线观看小视频| 欧美日韩国产精品一区二区三区四区 | 日韩精品资源| 欧美日韩精品一本二本三本| 国产三区在线视频| 国产一区二区三区在线观看免费 | 欧美另类精品xxxx孕妇| 18video性欧美19sex高清| 国产精品高潮在线| 一区二区日韩| 图片区小说区区亚洲五月| 欧美视频导航| 国产91色在线观看| 99久久99精品久久久久久| 国产小视频你懂的| 欧美日韩加勒比精品一区| 国产又色又爽又黄又免费| 日韩成人在线视频| 97超碰在线公开在线看免费| 国产aaa精品| 97久久综合区小说区图片区| 色女人综合av| 亚洲人成久久| 永久av免费在线观看| 久久久久亚洲综合| 久草网在线观看| 欧美三级电影在线看| 色视频在线观看免费| 色综合久久悠悠| 欧美极品在线| 日韩高清国产一区在线观看| 亚洲另类视频| 国产探花一区二区三区| 中文字幕高清一区| 天天干天天干天天操| 日韩欧美一二三区| 麻豆视频在线观看免费网站| 国产精品电影网| 天天操综合520| 成年人网站国产| 国产精品一级片在线观看| 国产jizz18女人高潮| 亚洲精品一区二区三区樱花| 日本视频一区二区在线观看| 欧美色图在线播放| 国产中文字幕二区| 国产毛片精品一区| 羞羞在线观看视频| 欧美又粗又大又爽| 极品美乳网红视频免费在线观看| 97欧美精品一区二区三区| 91亚洲无吗| 99色这里只有精品| 国产成人aaa| 久草免费在线观看视频| 日韩欧美的一区| 国产调教视频在线观看| 国产精品吴梦梦| 日韩国产欧美| 91 在线视频观看| 国产精品久久三| 亚洲天堂久久久久| 视频一区视频二区国产精品| 亚洲成人av观看| 日韩精品电影网站| 日本视频一区二区三区| 中文字幕有码在线播放| 日本韩国视频一区二区| 国产资源在线播放| 国产精品国产三级国产专播精品人| 色婷婷久久久| 欧美少妇性生活视频| 国产亚洲一二三区| 奴色虐av一区二区三区| 在线观看欧美视频| 九九九精品视频| 粉嫩av一区二区三区天美传媒| 国产福利视频一区二区三区| 久久久久久蜜桃| 亚洲精品美女在线| 日本综合字幕| 中文字幕中文字幕99| 国产高清在线精品| 97超碰人人干| 在线播放日韩av| 国产免费av国片精品草莓男男| 国产一级大片免费看| av资源网一区| 91黑人精品一区二区三区| 日韩一区视频在线| www.爱久久| 十八禁视频网站在线观看| 中文字幕一区二区5566日韩| 国产女人高潮毛片| 91禁外国网站| 大色综合视频网站在线播放| 97超碰人人看| 欧美日韩亚洲91| av一本在线| 国产一区免费观看| 久久婷婷丁香| 国产成人综合在线视频| 亚洲国产99精品国自产| 欧美free嫩15| av动漫在线播放| 国产免费观看久久| 国产后入清纯学生妹| 欧美一区二区三区免费观看| 欧美激情成人| 星空大象在线观看免费播放| 欧美三级午夜理伦三级中视频| 91超碰国产在线| 正在播放精油久久| 91论坛在线播放| av官网在线观看|