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

為什么開發(fā)人員必須要了解數(shù)據(jù)庫鎖?

運維 數(shù)據(jù)庫運維
何為鎖?鎖在現(xiàn)實中的意義為:封閉的器物,以鑰匙或暗碼開啟。在計算機中的鎖一般用來管理對共享資源的并發(fā)訪問,比如我們 Java 同學熟悉的 Lock,synchronized 等都是我們常見的鎖。

當然在我們的數(shù)據(jù)庫中也有鎖用來控制資源的并發(fā)訪問,這也是數(shù)據(jù)庫和文件系統(tǒng)的區(qū)別之一。

為什么要懂數(shù)據(jù)庫鎖?

通常來說對于一般的開發(fā)人員,在使用數(shù)據(jù)庫的時候一般懂點 DQL(select),DML(insert,update,delete)就夠了。

小明是一個剛剛畢業(yè)在互聯(lián)網(wǎng)公司工作的 Java 開發(fā)工程師,平常的工作就是完成 PM 的需求。

當然在完成需求的同時肯定逃脫不了 Spring,Spring MVC,Mybatis 的那一套框架,所以一般來說 SQL 還是自己手寫,遇到比較復雜的 SQL 會從網(wǎng)上去百度一下。

對于一些比較重要操作,比如交易啊這些,小明會用 Spring 的事務(wù)來對數(shù)據(jù)庫的事務(wù)進行管理,由于數(shù)據(jù)量比較小目前還涉及不到分布式事務(wù)。

前幾個月小明過得都還風調(diào)雨順,直到有一天,小明接了一個需求,商家有個配置項,叫優(yōu)惠配置項,可以配置買一送一,買一送二等等規(guī)則。

當然這些配置是批量傳輸給后端的,這樣就有個問題每個規(guī)則都得去匹配,他到底是刪除還是添加還是修改,這樣后端邏輯就比較麻煩。

聰明的小明想到了一個辦法,直接刪除這個商家的配置,然后全部添加進去。小明馬上開發(fā)完畢,成功上線。

開始上線沒什么毛病,但是日志經(jīng)常會出現(xiàn)一些 mysql-insert-deadlock 異常。

由于小明經(jīng)驗比較淺,對于這類型的問題第一次遇見,于是去問了他們組的老司機大紅。

大紅一看見這個問題,然后看了他的代碼之后,輸出了幾個命令看了幾個日志,馬上定位了問題,告訴了小明:這是因為 delete 的時候會加間隙鎖。

但是間隙鎖之間卻可以兼容,但是插入新的數(shù)據(jù)的時候就會因為插入意向鎖會被間隙鎖阻塞,導致雙方資源被互占,導致死鎖。

小明聽了之后似懂非懂,由于大紅的事情比較多,不方便一直麻煩大紅,所以決定自己下來自己想。

下班過后,小明回想大紅說的話,什么是間隙鎖,什么是插入意向鎖,看來作為開發(fā)者對數(shù)據(jù)庫不應(yīng)該只會寫 SQL 啊,不然遇到一些疑難雜癥完全沒法解決啊。想完,于是小明就踏上了學習 MySQL 鎖這條不歸之路。

什么是 InnoDB?

MySQL 體系架構(gòu)

小明沒有著急去了解鎖這方面的知識,他首先先了解了下 MySQL 體系架構(gòu):

 

可以發(fā)現(xiàn) MySQL 由連接池組件、管理服務(wù)和工具組件、SQL 接口組件、查詢分析器組件、優(yōu)化器組件、 緩沖組件、插件式存儲引擎、物理文件組成。

小明發(fā)現(xiàn)在 MySQL 中存儲引擎是以插件的方式提供的,在 MySQL 中有多種存儲引擎,每個存儲引擎都有自己的特點。

隨后小明在命令行中打出了:

  1. show engines \G; 

一看原來有這么多種引擎。又打出了下面的命令,查看當前數(shù)據(jù)庫默認的引擎:

  1. show variables like '%storage_engine%'

 

小明恍然大悟:原來自己的數(shù)據(jù)庫是使用的 InnoDB,依稀記得自己在上學的時候好像聽說過有個引擎叫 MyIsAM,小明想這兩個有啥不同呢?

馬上查找了一下資料:

 

小明大概了解了一下 InnoDB 和 MyIsAM 的區(qū)別,由于使用的是 InnoDB,小明就沒有過多的糾結(jié)這一塊。

事務(wù)的隔離性

小明在研究鎖之前,又回想到之前上學的時候教過的數(shù)據(jù)庫事務(wù)隔離性,其實鎖在數(shù)據(jù)庫中其功能之一也是用來實現(xiàn)事務(wù)隔離性。而事務(wù)的隔離性其實是用來解決臟讀,不可重復讀,幻讀幾類問題。

臟讀

一個事務(wù)讀取到另一個事務(wù)未提交的更新數(shù)據(jù)。什么意思呢?

 

在事務(wù) A,B 中,事務(wù) A 在時間點 2,4 分別對 user 表中 id = 1 的數(shù)據(jù)進行了查詢。

但是事務(wù) B 在時間點 3 進行了修改,導致了事務(wù) A 在 4 中的查詢出的結(jié)果其實是事務(wù) B 修改后的。這樣就破壞了數(shù)據(jù)庫中的隔離性。

不可重復讀

在同一個事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果不同,不可重復讀和臟讀不同的是這里讀取的是已經(jīng)提交過后的數(shù)據(jù)。

 

在事務(wù) B 中提交的操作在事務(wù) A 第二次查詢之前,但是依然讀到了事務(wù) B 的更新結(jié)果,也破壞了事務(wù)的隔離性。

幻讀

一個事務(wù)讀到另一個事務(wù)已提交的 insert 數(shù)據(jù)。

 

在事務(wù) A 中查詢了兩次 id 大于 1 的,在第一次 id 大于 1 查詢結(jié)果中沒有數(shù)據(jù),但是由于事務(wù) B 插入了一條 id = 2 的數(shù)據(jù),導致事務(wù) A 第二次查詢時能查到事務(wù) B 中插入的數(shù)據(jù)。

事務(wù)中的隔離性:

 

小明注意到在收集資料的過程中,有資料寫到 InnoDB 和其他數(shù)據(jù)庫有點不同,InnoDB 的可重復讀其實就能解決幻讀了,小明心想:這 InnoDB 還挺牛逼的,我得好好看看到底是怎么個原理。

InnoDB 鎖類型

小明首先了解了 MySQL 中常見的鎖類型有哪些:

S or X

在 InnoDB 中實現(xiàn)了兩個標準的行級鎖,可以簡單的看為兩個讀寫鎖:

S 共享鎖:又叫讀鎖,其他事務(wù)可以繼續(xù)加共享鎖,但是不能繼續(xù)加排他鎖。

X 排他鎖:又叫寫鎖,一旦加了寫鎖之后,其他事務(wù)就不能加鎖了。

 

兼容性:是指事務(wù) A 獲得一個某行某種鎖之后,事務(wù) B 同樣的在這個行上嘗試獲取某種鎖,如果能立即獲取,則稱鎖兼容,反之叫沖突。

縱軸是代表已有的鎖,橫軸是代表嘗試獲取的鎖。

意向鎖

意向鎖在 InnoDB 中是表級鎖,和它的名字一樣它是用來表達一個事務(wù)想要獲取什么。

意向鎖分為:

  • 意向共享鎖:表達一個事務(wù)想要獲取一張表中某幾行的共享鎖。
  • 意向排他鎖:表達一個事務(wù)想要獲取一張表中某幾行的排他鎖。

這個鎖有什么用呢?為什么需要這個鎖呢?首先說一下如果沒有這個鎖,要給這個表加上表鎖,一般的做法是去遍歷每一行看看它是否有行鎖,這樣的話效率太低。

而我們有意向鎖,只需要判斷是否有意向鎖即可,不需要再去一行行的去掃描。

在 InnoDB 中由于支持的是行級的鎖,因此 InnboDB 鎖的兼容性可以擴展如下:

 

自增長鎖

自增長鎖是一種特殊的表鎖機制,提升并發(fā)插入性能。

對于這個鎖有幾個特點:

  • 在 SQL 執(zhí)行完就釋放鎖,并不是事務(wù)執(zhí)行完。
  • 對于 insert...select 大數(shù)據(jù)量插入會影響插入性能,因為會阻塞另外一個事務(wù)執(zhí)行。
  • 自增算法可以配置。

在 MySQL 5.1.2 版本之后,有了很多優(yōu)化,可以根據(jù)不同的模式來調(diào)整自增加鎖的方式。

小明看到了這里打開了自己的 MySQL 發(fā)現(xiàn)是 5.7 之后,便輸入了下面的語句,獲取到當前鎖的模式:

  1. mysql> show variables like 'innodb_autoinc_lock_mode'
  2. +--------------------------+-------+ 
  3. | Variable_name            | Value | 
  4. +--------------------------+-------+ 
  5. | innodb_autoinc_lock_mode | 2     | 
  6. +--------------------------+-------+ 
  7. 1 row in set (0.01 sec) 

在 MySQL 中 innodbautoinclock_mode 有 3 種配置模式 0、1、2,分別對應(yīng):

傳統(tǒng)模式:也就是我們最上面的使用表鎖。

連續(xù)模式:對于插入的時候可以確定行數(shù)的使用互斥量,對于不能確定行數(shù)的使用表鎖的模式。

交錯模式:所有的都使用互斥量,為什么叫交錯模式呢,有可能在批量插入時自增值不是連續(xù)的,當然一般來說如果不看重自增值連續(xù)一般選擇這個模式,性能是最好的。

InnoDB 鎖算法

小明已經(jīng)了解到了在 InnoDB 中有哪些鎖類型,但是如何去使用這些鎖,還是得靠鎖算法。

記錄鎖(Record-Lock)

記錄鎖是鎖住記錄的,這里要說明的是這里鎖住的是索引記錄,而不是我們真正的數(shù)據(jù)記錄:

如果鎖的是非主鍵索引,會在自己的索引上面加鎖之后然后再去主鍵上面加鎖鎖住。

如果沒有表上沒有索引(包括沒有主鍵),則會使用隱藏的主鍵索引進行加鎖。

如果要鎖的列沒有索引,則會進行全表記錄加鎖。

間隙鎖

間隙鎖顧名思義鎖間隙,不鎖記錄。鎖間隙的意思就是鎖定某一個范圍,間隙鎖又叫 gap 鎖,其不會阻塞其他的 gap 鎖,但是會阻塞插入間隙鎖,這也是用來防止幻讀的關(guān)鍵。

 

 

 

 

next-key 鎖

這個鎖本質(zhì)是記錄鎖加上 gap 鎖。在 RR 隔離級別下(InnoDB 默認),InnoDB 對于行的掃描鎖定都是使用此算法,但是如果查詢掃描中有唯一索引會退化成只使用記錄鎖。

為什么呢? 因為唯一索引能確定行數(shù),而其他索引不能確定行數(shù),有可能在其他事務(wù)中會再次添加這個索引的數(shù)據(jù)造成幻讀。

這里也說明了為什么 MySQL 可以在 RR 級別下解決幻讀。

插入意向鎖

插入意向鎖 MySQL 官方對其的解釋:

An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

可以看出插入意向鎖是在插入的時候產(chǎn)生的,在多個事務(wù)同時寫入不同數(shù)據(jù)至同一索引間隙的時候,并不需要等待其他事務(wù)完成,不會發(fā)生鎖等待。

假設(shè)有一個記錄索引包含鍵值 4 和 7,不同的事務(wù)分別插入 5 和 6,每個事務(wù)都會產(chǎn)生一個加在 4-7 之間的插入意向鎖,獲取在插入行上的排它鎖,但是不會被互相鎖住,因為數(shù)據(jù)行并不沖突。

這里要說明的是如果有間隙鎖了,插入意向鎖會被阻塞。

MVCC

MVCC,多版本并發(fā)控制技術(shù)。在 InnoDB 中,在每一行記錄的后面增加兩個隱藏列,記錄創(chuàng)建版本號和刪除版本號。通過版本號和行鎖,從而提高數(shù)據(jù)庫系統(tǒng)并發(fā)性能。

在 MVCC 中,對于讀操作可以分為兩種讀:

  • 快照讀:讀取的歷史數(shù)據(jù),簡單的 select 語句,不加鎖,MVCC 實現(xiàn)可重復讀,使用的是 MVCC 機制讀取 undo 中的已經(jīng)提交的數(shù)據(jù)。所以它的讀取是非阻塞的。
  • 當前讀:需要加鎖的語句,update,insert,delete,select...for update 等等都是當前讀。

在 RR 隔離級別下的快照讀,不是以 begin 事務(wù)開始的時間點作為 snapshot 建立時間點,而是以第一條 select 語句的時間點作為 snapshot 建立的時間點。以后的 select 都會讀取當前時間點的快照值。

在 RC 隔離級別下每次快照讀均會創(chuàng)建新的快照。

具體的原理是通過每行會有兩個隱藏的字段一個是用來記錄當前事務(wù),一個是用來記錄回滾的指向 Undolog。利用 Undolog 就可以讀取到之前的快照,不需要單獨開辟空間記錄。

加鎖分析

小明到這里,已經(jīng)學習很多 MySQL 鎖有關(guān)的基礎(chǔ)知識,所以決定自己創(chuàng)建一個表搞下實驗。

首先創(chuàng)建了一個簡單的用戶表:

  1. CREATE TABLE `user` ( 
  2.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(11) CHARACTER SET utf8mb4 DEFAULT NULL
  4.   `comment` varchar(11) CHARACTER SET utf8 DEFAULT NULL
  5.   PRIMARY KEY (`id`), 
  6.   KEY `index_name` (`name`) 
  7. ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; 

然后插入了幾條實驗數(shù)據(jù):

  1. insert user select 20,333,333; 
  2. insert user select 25,555,555; 
  3. insert user select 20,999,999; 

數(shù)據(jù)庫事務(wù)隔離選擇了 RR。

實驗 1

小明開啟了兩個事務(wù),進行了實驗 1,如下圖:


 

 

小明開啟了兩個事務(wù)并輸入了上面的語句,發(fā)現(xiàn)事務(wù) B 居然出現(xiàn)了超時,小明看了一下自己明明是對 name = 555 這一行進行的加鎖,為什么我想插入 name = 556 給我阻塞了。

于是小明打開命令行輸入:

  1. select * from information_schema.INNODB_LOCKS 

發(fā)現(xiàn)在事務(wù) A 中給 555 加了 next-key 鎖,事務(wù) B 插入的時候會首先進行插入意向鎖的插入。

于是得出下面結(jié)果:


 

 

可以看見事務(wù) B 由于間隙鎖和插入意向鎖的沖突,導致了阻塞。

實驗 2

小明發(fā)現(xiàn)上面查詢條件用的是普通的非唯一索引,于是小明就試了一下主鍵索引:

 

居然發(fā)現(xiàn)事務(wù) B 并沒有發(fā)生阻塞,哎這個是咋回事呢,小明有點疑惑,按照實驗 1 的套路應(yīng)該會被阻塞啊,因為 25-30 之間會有間隙鎖。

于是小明又祭出了命令行,發(fā)現(xiàn)只加了 X 記錄鎖。原來是因為唯一索引會降級記錄鎖。

這么做的理由是:非唯一索引加 next-key 鎖由于不能確定明確的行數(shù)有可能其他事務(wù)在你查詢的過程中,再次添加這個索引的數(shù)據(jù),導致隔離性遭到破壞,也就是幻讀。

唯一索引由于明確了唯一的數(shù)據(jù)行,所以不需要添加間隙鎖解決幻讀。

 

實驗 3

上面測試了主鍵索引,非唯一索引,這里還有個字段是沒有索引,如果對其加鎖會出現(xiàn)什么呢?

 

小明一看哎喲我去,這個咋回事呢,咋不管是用實驗 1 非間隙鎖范圍的數(shù)據(jù),還是用間隙鎖里面的數(shù)據(jù)都不行,難道是加了表鎖嗎?

的確,如果用沒有索引的數(shù)據(jù),其會對所有聚簇索引上都加上 next-key 鎖。


 

 

所以大家平常開發(fā)的時候如果對查詢條件沒有索引的,一定進行一致性讀,也就是加鎖讀,會導致全表加上索引,會導致其他事務(wù)全部阻塞,數(shù)據(jù)庫基本會處于不可用狀態(tài)。

回到事故

死鎖

小明做完實驗之后總算是了解清楚了加鎖的一些基本套路,但是之前線上出現(xiàn)的死鎖又是什么東西呢?

死鎖是指兩個或兩個以上的事務(wù)在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象。說明有等待才會有死鎖,解決死鎖可以通過去掉等待,比如回滾事務(wù)。

解決死鎖的兩個辦法:

  • 等待超時:當某一個事務(wù)等待超時之后回滾該事務(wù),另外一個事務(wù)就可以執(zhí)行了。

但是這樣做效率較低,會出現(xiàn)等待時間,還有個問題是如果這個事務(wù)所占的權(quán)重較大,已經(jīng)更新了很多數(shù)據(jù)了,但是被回滾了,就會導致資源浪費。

  • 等待圖(wait-for-graph):等待圖用來描述事務(wù)之間的等待關(guān)系,當這個圖如果出現(xiàn)回路如下:

 

事務(wù)就出現(xiàn)回滾,通常來說 InnoDB 會選擇回滾權(quán)重較小的事務(wù),也就是 undo 較小的事務(wù)。

線上問題

小明到這里,基本需要的基本功都有了,于是在自己的本地表中開始復現(xiàn)這個問題:

 

可以看見事務(wù) A 出現(xiàn)被回滾了,而事務(wù) B 成功執(zhí)行。具體每個時間點發(fā)生了什么呢?

時間點 2:事務(wù) A 刪除 name = '777' 的數(shù)據(jù),需要對 777 這個索引加上 next-key 鎖,但是其不存在。

所以只對 555-999 之間加間隙鎖,同理事務(wù) B 也對 555-999 之間加間隙鎖。間隙鎖之間是兼容的。

時間點 3:事務(wù) A,執(zhí)行 insert 操作,首先插入意向鎖,但是 555-999 之間有間隙鎖。

由于插入意向鎖和間隙鎖沖突,事務(wù) A 阻塞,等待事務(wù) B 釋放間隙鎖。事務(wù) B 同理,等待事務(wù) A 釋放間隙鎖。于是出現(xiàn)了 A->B,B->A 回路等待。

時間點 4:事務(wù)管理器選擇回滾事務(wù) A,事務(wù) B 插入操作執(zhí)行成功。

 

修復 Bug

這個問題總算是被小明找到了,就是因為間隙鎖,現(xiàn)在需要解決這個問題。

這個問題的原因是出現(xiàn)了間隙鎖,那就來去掉它吧:

  • 方案一:隔離級別降級為 RC,在 RC 級別下不會加入間隙鎖,所以就不會出現(xiàn)毛病了,但是在 RC 級別下會出現(xiàn)幻讀,可提交讀都破壞隔離性的毛病,所以這個方案不行。
  • 方案二:隔離級別升級為可序列化,小明經(jīng)過測試后發(fā)現(xiàn)不會出現(xiàn)這個問題,但是在可序列化級別下,性能會較低,會出現(xiàn)較多的鎖等待,同樣的也不考慮。
  • 方案三:修改代碼邏輯,不要直接刪,改成每個數(shù)據(jù)由業(yè)務(wù)邏輯去判斷哪些是更新,哪些是刪除,那些是添加,這個工作量稍大,小明寫這個直接刪除的邏輯就是為了不做這些復雜的事的,所以這個方案先不考慮。
  • 方案四:較少的修改代碼邏輯,在刪除之前,可以通過快照查詢(不加鎖),如果查詢沒有結(jié)果,則直接插入;如果有通過主鍵進行刪除,在之前第三節(jié)實驗 2 中,通過唯一索引會降級為記錄鎖,所以不存在間隙鎖。

經(jīng)過考慮小明選擇了第四種,馬上進行了修復,然后上線觀察驗證,發(fā)現(xiàn)現(xiàn)在已經(jīng)不會出現(xiàn)這個 Bug 了,這下小明總算能睡個安穩(wěn)覺了。

如何防止死鎖

小明通過基礎(chǔ)的學習和平常的經(jīng)驗總結(jié)了如下幾點:

  • 以固定的順序訪問表和行。交叉訪問更容易造成事務(wù)等待回路。
  • 盡量避免大事務(wù),占有的資源鎖越多,越容易出現(xiàn)死鎖。建議拆成小事務(wù)。
  • 降低隔離級別。如果業(yè)務(wù)允許(上面也分析了,某些業(yè)務(wù)并不能允許),將隔離級別調(diào)低也是較好的選擇,比如將隔離級別從 RR 調(diào)整為 RC,可以避免掉很多因為 gap 鎖造成的死鎖。
  • 為表添加合理的索引。防止沒有索引出現(xiàn)表鎖,出現(xiàn)死鎖的概率會突增。

最后

由于篇幅有限很多東西并不能介紹全,如果感興趣的同學可以閱讀《MySQL 技術(shù)內(nèi)幕-InnoDB 引擎》第 6 章,以及何大師的 MySQL 加鎖處理分析。

責任編輯:武曉燕 來源: 咖啡拿鐵
相關(guān)推薦

2022-04-02 11:49:54

分布式數(shù)據(jù)庫Java

2022-12-19 07:33:49

開發(fā)人員谷歌制度

2020-07-23 08:21:25

PHP開發(fā)人員MVC

2022-03-03 23:30:27

TypeScrip開發(fā)前端

2011-05-05 17:57:18

軟件開發(fā)

2011-03-21 16:38:29

數(shù)據(jù)庫管理員開發(fā)人員

2020-08-24 15:05:38

iOS 14 beta蘋果更新

2024-02-23 18:32:17

2021-11-01 22:19:29

開發(fā)測試代碼

2021-04-18 18:12:07

Linux開發(fā)操作系統(tǒng)

2018-07-09 14:05:16

編程語言PythonPipenv

2020-06-22 07:18:21

Java語言開發(fā)

2023-12-14 11:39:57

2022-12-01 10:05:19

2021-01-30 10:51:07

Python編程語言開發(fā)

2011-06-20 08:43:15

Windows 8開發(fā)人員

2023-09-04 08:20:00

2013-11-14 09:24:13

Visual Stud微軟Web開發(fā)

2016-11-09 13:46:00

云數(shù)據(jù)庫

2016-10-14 19:30:21

云計算云數(shù)據(jù)庫數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號

日本视频久久久| 日韩亚洲欧美成人一区| 日韩精品大片| 国产日韩欧美视频在线观看| 亚洲精品极品少妇16p| 日韩免费高清av| 国产最新免费视频| jizz在线免费观看| 国内国产精品久久| 91高清视频在线免费观看| 亚洲最大成人综合网| 久久精品九色| 91久久精品一区二区| 日韩欧美视频免费在线观看| 久色视频在线| 国产ts人妖一区二区| 国产精品第3页| 国产在线观看免费av| 欧洲激情视频| 亚洲国模精品私拍| 爱豆国产剧免费观看大全剧苏畅 | www.亚洲天堂| 在线观看国产网站| 精品欧美视频| 欧美视频在线观看一区二区| 国产一线二线三线女| jyzzz在线观看视频| 91免费国产在线观看| 国产精品入口免费| 99久久国产热无码精品免费| 奇米影视7777精品一区二区| 欧美一区三区三区高中清蜜桃| 免费网站看av| 亚洲二区三区不卡| 日韩中文字幕在线| 男女做爰猛烈刺激| 精品成人自拍视频| 精品国产一区久久| 99中文字幕在线| 日韩av电影资源网| 欧美性猛交xxxx免费看久久久| 欧美乱大交xxxxx潮喷l头像| 亚洲www色| 亚洲人亚洲人成电影网站色| 一本色道婷婷久久欧美 | 九九热这里只有在线精品视| 国产人与禽zoz0性伦| 国产一区网站| 永久免费看mv网站入口亚洲| 一级黄色片网址| 欧洲三级视频| 中文字幕一精品亚洲无线一区| a级片在线观看| 国产日产精品_国产精品毛片| 精品亚洲一区二区三区在线播放| 自拍视频一区二区| 欧美大奶一区二区| 国产视频欧美视频| av男人的天堂av| 日产午夜精品一线二线三线| 色婷婷综合成人av| 91精品少妇一区二区三区蜜桃臀| 999成人精品视频线3| 久久久精品久久久久| 国产少妇在线观看| 红桃视频国产一区| 97视频在线观看成人| 在线观看黄网站| 久久综合九色| 国产美女精品免费电影| 国产一区二区在线播放视频| 国产精品综合一区二区| 国产69精品久久久久9999apgf| www.四虎在线观看| 91在线丨porny丨国产| 欧美日韩免费观看一区| yw193.com尤物在线| 亚洲免费在线视频一区 二区| 老司机激情视频| 欧美裸体视频| 欧美色涩在线第一页| 日韩精品aaa| 欧美美女在线直播| 在线看日韩av| 久久综合色综合| 巨乳诱惑日韩免费av| 国产日韩精品视频| 老熟妇高潮一区二区高清视频| 久久理论电影网| 日本在线播放一区| 日韩精品分区| 在线这里只有精品| 黑人无套内谢中国美女| 天堂99x99es久久精品免费| 自拍偷拍亚洲区| 日韩三级视频在线| 久久97超碰色| 久久精品日产第一区二区三区 | 欧美巨乳美女视频| 成年人免费高清视频| 秋霞成人午夜伦在线观看| 99在线观看视频| 二区三区在线播放| 亚洲一区视频在线| 免费看污污网站| 九九热播视频在线精品6| 在线播放国产一区中文字幕剧情欧美| 欧美成人三级在线观看| 久久资源在线| 精品国产乱码久久久久| 黄黄的网站在线观看| 日韩欧美精品免费在线| 中文字幕乱妇无码av在线| 精品国产一区二区三区av片| 久久久免费精品| 国产欧美综合视频| 亚洲国产精品激情在线观看| 国产特级黄色大片| 91国内精品| 裸体女人亚洲精品一区| 久久久久亚洲视频| 99精品视频在线观看| 亚洲中文字幕无码一区二区三区| 久久精品国产福利| 亚洲人成网站777色婷婷| 久久中文字幕在线观看| 精品中文字幕一区二区小辣椒| 久久精品中文字幕一区二区三区 | 午夜一区二区视频| 国产精品免费99久久久| 欧美性受xxxx黑人猛交| 丁香六月色婷婷| 一区二区三区日韩| 超碰91在线播放| 国产精品久久久久一区二区三区厕所 | 韩国av一区二区三区四区| 日本不卡一区二区三区在线观看 | 国产日韩欧美视频在线| 黄色片在线看| 色嗨嗨av一区二区三区| 久久丫精品国产亚洲av不卡| 在线一区视频| 国产精品传媒毛片三区| 欧美性爽视频| 亚洲成人黄色网| 久久久香蕉视频| 国产成人精品免费网站| mm131午夜| 日韩欧美久久| 欧美激情国产精品| 亚洲AV无码成人片在线观看| 一区二区三区日韩在线观看| 中文字幕 欧美 日韩| 欧美久久99| 国产激情美女久久久久久吹潮| 久久国产精品黑丝| 亚洲国产99精品国自产| 日韩精品在线免费看| 99re66热这里只有精品3直播 | 日韩精品免费在线播放| 日韩aaaaaa| 久久夜色精品一区| 日韩一级片播放| 日韩一区电影| 91久久大香伊蕉在人线| 久久亚洲资源| 亚洲欧美日韩精品久久亚洲区| 久久国产乱子伦精品| 国产精品美女视频| 中国男女全黄大片| 国产亚洲毛片在线| 亚洲欧美日韩国产yyy| 国产在线视频欧美一区| 国模吧一区二区| 成年网站在线| 日韩一区二区三区免费观看| 日韩精品人妻中文字幕| 国产欧美日韩在线视频| 在线观看av免费观看| 精品动漫一区| 日韩免费三级| **国产精品| 欧美性资源免费| 麻豆网在线观看| 亚洲国产成人久久综合一区| 香蕉影院在线观看| 亚洲欧洲一区二区三区| 白嫩情侣偷拍呻吟刺激| 日韩福利电影在线| 免费高清一区二区三区| 免费久久久久久久久| 亚洲在线观看视频| 欧美精品日日操| 欧美日韩高清在线观看| 国产中文字幕在线播放| 日韩亚洲欧美在线| 人人妻人人爽人人澡人人精品 | 欧美成年网站| 国产99在线|中文| 婷婷av在线| 在线播放亚洲激情| 天堂在线视频免费观看| 欧美精品tushy高清| 天天爽夜夜爽夜夜爽精品| 亚洲色图20p| 亚洲久久久久久久| 成人激情av网| 亚洲网中文字幕| 玖玖玖国产精品| 水蜜桃色314在线观看| 久久国产电影| 免费成人深夜夜行视频| 亚洲1区在线观看| 国产精品一区电影| 桃色av一区二区| 久久久久久成人| 二区三区在线观看| 国产亚洲精品日韩| 五月婷婷丁香网| 日韩精品一区二区在线观看| 一级aaaa毛片| 欧美网站一区二区| 免费看毛片网站| 同产精品九九九| 国产一级片免费看| 亚洲视频 欧洲视频| 欧洲性xxxx| 国产欧美日韩在线| 性欧美丰满熟妇xxxx性仙踪林| 成人亚洲一区二区一| 亚洲av无码久久精品色欲| 久久99国产精品久久99| wwww.国产| 奇米影视一区二区三区| 啊啊啊国产视频| 天堂成人免费av电影一区| 激情深爱综合网| 亚洲美女一区| 人妻无码久久一区二区三区免费| 久久久综合色| 亚洲国产精品久久久久久女王| 欧美日韩久久精品| 手机看片福利永久国产日韩| 欧美人与物videos另类xxxxx| 久久国产精品久久精品国产| 亚洲婷婷伊人| 日本高清视频一区二区三区| 欧美手机在线| 一区二区精品免费视频| 婷婷综合在线| 粉嫩av一区二区三区天美传媒 | 激情五月亚洲色图| 视频一区二区三区在线| 中文字幕第36页| 美女看a上一区| 亚洲免费黄色网| 国产精品中文字幕一区二区三区| 99999精品| 成人丝袜视频网| 人妻无码中文久久久久专区| 99r精品视频| 国产精品扒开腿做爽爽| 日本一区二区久久| 精品人妻伦九区久久aaa片| 夜夜精品浪潮av一区二区三区| 国产精品日日夜夜| 欧美性生交xxxxx久久久| 日本一本在线观看| 这里是久久伊人| 人妻精品无码一区二区| 日韩精品免费在线观看| 午夜视频在线免费观看| 欧美精品制服第一页| 9765激情中文在线| 国产精品美女www爽爽爽视频| 亚洲欧洲日韩精品在线| 国产精品xxxx| 欧美在线电影| 久久久天堂国产精品| 国产日韩欧美在线播放不卡| 亚洲第一中文av| 国产成人精品免费视频网站| 受虐m奴xxx在线观看| 亚洲欧美偷拍卡通变态| 欧美特黄aaaaaa| 欧美精品xxxxbbbb| 视频一区二区三区在线看免费看| 最近2019免费中文字幕视频三| 啦啦啦中文在线观看日本| 国产suv精品一区二区| 精品一区二区三区中文字幕视频 | 欧美日韩免费观看一区=区三区| 国产一区二区视频播放| 日韩av中文在线观看| 亚洲妇女无套内射精| 2021久久国产精品不只是精品 | 精品欧美激情精品一区| 一卡二卡三卡在线| 精品一区二区三区四区在线| 麻豆av免费在线观看| 4388成人网| 日韩视频1区| 亚洲欧美日韩精品久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 天天操天天爱天天爽| 99久久精品国产麻豆演员表| 国产精品三区在线观看| 91精品福利在线| 人妻偷人精品一区二区三区| 久久人人爽亚洲精品天堂| 伊人成综合网站| 国产伦精品一区二区三区在线| 日韩av密桃| 爆乳熟妇一区二区三区霸乳| 成人午夜av在线| 国产盗摄x88av| 欧美久久免费观看| 国产h在线观看| 亲子乱一区二区三区电影| 开心激情综合| 真实国产乱子伦对白视频| 国内成+人亚洲+欧美+综合在线| av男人的天堂av| 一本色道综合亚洲| 日本黄色大片视频| 欧美日韩国产成人| 99国内精品久久久久| 亚洲午夜久久久影院伊人| 老司机精品久久| 欧美老熟妇乱大交xxxxx| 午夜精品爽啪视频| 人妻少妇一区二区三区| 国内精品久久久| 91成人精品在线| 日本人体一区二区| 国产a久久麻豆| 久久久精品99| 精品国产欧美一区二区| 白白色在线观看| 国产一区再线| 午夜在线视频一区二区区别| 国产福利在线观看视频| 无吗不卡中文字幕| 视频在线观看你懂的| 日本精品一区二区三区在线| 免费观看不卡av| 九九热免费精品视频| 国产精品女同一区二区三区| 在线播放成人av| 日韩小视频网址| 91精品国产一区二区在线观看 | 擼擼色在线看观看免费| 精品蜜桃传媒| 欧美综合国产| 五月天精品在线| 欧美另类久久久品| 成人av福利| 国产麻豆日韩| 欧美亚洲专区| 国产一二三四区在线| 欧美电影在线免费观看| www在线免费观看视频| caoporen国产精品| 亚洲一区国产一区| 亚洲图片另类小说| 在线播放国产精品二区一二区四区| 八戒八戒神马在线电影| 97超碰人人模人人爽人人看| 99热在线精品观看| 人人爽人人爽人人片| 欧美一区二区视频观看视频| xxx.xxx欧美| 日本一区二区三区精品视频| 麻豆久久一区二区| 2021亚洲天堂| 亚洲男子天堂网| 懂色av色香蕉一区二区蜜桃| 99er在线视频| 国产欧美一区二区三区鸳鸯浴| 国产丝袜视频在线观看| 88xx成人精品| 久久精品欧美一区| 国产又黄又粗又猛又爽的视频| 欧美亚洲国产怡红院影院| 视频在线这里都是精品| 欧美一区二区三区在线播放 | 中出视频在线观看| 欧美精品日韩一本| 91白丝在线| 亚洲一区二区三区在线观看视频 | 91麻豆精品国产91久久久更新时间| 丁香高清在线观看完整电影视频| 日产精品一线二线三线芒果| 国产成人精品一区二区三区四区| 日韩手机在线视频| 欧美激情极品视频| 欧美残忍xxxx极端| 成人精品在线观看视频| 欧美一区二区三区免费观看视频| 91av亚洲|