精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

自拍偷拍亚洲图片| 涩爱av在线播放一区二区| 色狮一区二区三区四区视频| 色综合久久天天| 日本高清视频一区二区三区| aaa在线视频| 成人羞羞动漫| 911国产精品| 精品视频在线观看一区二区| 国产又粗又猛视频| 亚洲一区二区| 精品福利在线导航| 成人观看免费完整观看| 波多野结衣在线影院| 久久精品免费观看| 欧美高清第一页| 亚洲精品视频大全| 福利一区二区| 一区二区三区视频在线看| 国产成人亚洲欧美| 欧美日韩一级黄色片| 色婷婷色综合| 亚洲а∨天堂久久精品9966 | 九色porny91| 日本中文字幕伦在线观看| 国产精品一区二区在线看| 久久久亚洲精品视频| 国产三级短视频| 911精品国产| 91国偷自产一区二区使用方法| 一区二区三区四区欧美日韩| 中文字幕永久在线| 成人激情免费视频| 欧美精品一区视频| 免费 成 人 黄 色| 超碰人人在线| 国产亚洲精品超碰| 国产精品久久久久久免费观看| 99久久久无码国产精品免费蜜柚 | 精品亚洲成a人在线观看| 久久久久久久久久久久av| 97人妻精品一区二区免费| 国产电影一区二区| 91国在线观看| 国产玉足脚交久久欧美| 在线观看免费黄色| 99久久国产综合精品麻豆| 成人网址在线观看| 波多野结衣视频免费观看| 欧美91视频| 色哟哟亚洲精品一区二区| 最新在线黄色网址| 国产乱码精品一区二区三区亚洲人| 欧美性猛交xxxx免费看| 日本aa在线观看| 中文字幕在线免费| 久久久亚洲午夜电影| 国产九色精品| 精品毛片在线观看| 久久99久久久欧美国产| 日本久久久久久久| 欧美三级韩国三级日本三斤在线观看| 国产精品福利在线观看播放| 精品国产伦一区二区三区观看体验| 污污的网站免费| 少妇精品视频一区二区免费看| 激情成人中文字幕| 国产一区二区四区| 任你弄在线视频免费观看| 亚洲欧洲另类国产综合| 日韩精品久久一区二区三区| 蜜桃视频在线观看网站| 懂色av一区二区在线播放| 91在线观看免费高清| 夜夜嗨aⅴ一区二区三区| 日韩 欧美一区二区三区| 欧美一二三视频| 男人的天堂一区二区| 精品福利电影| 91国产视频在线| 久久久久99精品成人片毛片| 好吊日精品视频| 欧美日韩电影在线观看| 欧美又粗又大又长| 国产综合视频| 97国产精品视频| 一级免费在线观看| 亚洲影院一区| 国产精品99导航| 99re这里只有精品在线| 狂野欧美性猛交xxxx巴西| 青青草国产精品一区二区| 日韩人妻精品中文字幕| 人妖欧美一区二区| 国产在线拍偷自揄拍精品| 国产巨乳在线观看| 国产一区二区伦理片| 成人激情在线观看| 精品久久久无码中文字幕| 成人午夜碰碰视频| 日本不卡一区二区三区视频| 在线观看免费版| 亚洲精品网站在线观看| 隔壁人妻偷人bd中字| 午夜av不卡| 欧美无砖砖区免费| 亚洲成人av免费观看| 国产精品超碰| 亚洲精品影视在线观看| 中文字幕求饶的少妇| 在线一区免费| 9.1国产丝袜在线观看| 日韩久久久久久久久久| 精品一区二区免费看| 国产在线一区二区三区四区| www免费网站在线观看| 国产精品美女久久久久久久久久久 | 成人欧美一区二区三区在线| 国精产品一品二品国精品69xx | 精品视频二区| 成人欧美一区二区三区视频网页| 欧美激情 国产精品| 国产精品第一| 日韩成人中文字幕| 国产在线观看免费视频软件| 国产欧美日韩一区二区三区在线| 国产精品一区二区3区| 亚洲精品国产精| 久久婷婷国产综合精品青草| 蜜桃视频一区二区在线观看| 日韩pacopacomama| 欧美高清hd18日本| 亚洲av无码国产精品久久| 国产精品久久久久久久久妇女| 91精品国产91久久久久福利| 91精品国自产| 久久色在线视频| 日本不卡一区二区三区四区| 亚洲精品中文字幕| 欧美成va人片在线观看| 一级在线观看视频| 国产精品毛片一区二区三区| 成人精品aaaa网站| 国产在线视频网址| 亚洲电影激情视频网站| 手机免费看av网站| 国产精品一区二区av日韩在线| 欧美日韩国产成人在线观看| 中文字幕免费在线看| 久久综合99re88久久爱| 免费人成自慰网站| 国产高清视频一区二区| 亚洲最大中文字幕| 男人天堂av在线播放| 成人做爰69片免费看网站| 老司机av福利| 国外成人福利视频| 亚洲小视频在线观看| 欧美日韩精品一区二区三区视频播放| 久久国产夜色精品鲁鲁99| 欧美一区二区在线视频观看| 悠悠资源网亚洲青| 日韩av在线网页| 黄色小视频在线免费看| 精品亚洲成a人在线观看| 色综合666| 素人一区二区三区| 亚洲一区二区国产| 中文字幕精品视频在线观看| 91视频在线看| 国产午夜伦鲁鲁| 亚洲精品成人无码熟妇在线| gogo高清在线播放免费| 日韩美女一区二区三区四区| 手机在线免费看毛片| 久久精品理论片| 欧美一区三区二区在线观看| 精品欧美一区二区三区在线观看| 亚洲免费成人av电影| 欧美在线观看不卡| 久久久久久久久久久久久女国产乱| 亚洲精品无码久久久久久| 欧一区二区三区| 久久久久久国产精品| 手机看片1024日韩| 精品久久久久久中文字幕| 中国极品少妇videossexhd| 亚洲一区二区三区四区五区午夜| 精品欧美乱码久久久久久1区2区| av在线com| 国产午夜精品一区在线观看| 成人午夜av在线| 99久re热视频精品98| 欧美高清hd| 国内揄拍国内精品| 亚洲欧美自偷自拍| 欧美性黄网官网| 天天操天天舔天天射| 狠狠色综合日日| 日本视频一区二区在线观看| 亚洲精品成a人ⅴ香蕉片| 毛片精品免费在线观看| 国产xxxx孕妇| 狠狠躁夜夜躁久久躁别揉| 91中文字幕永久在线| 日韩视频不卡| 欧美三级电影在线播放| 国产成人精品一区二区三区在线| 最好看的2019年中文视频| 国产不卡精品视频| 一本色道久久综合精品竹菊| 四虎永久免费在线观看| 国内精品免费**视频| 国产中文字幕乱人伦在线观看| 伊人成综合网yiren22| 国产精品av在线播放| 国产精品久久麻豆| 精品国产乱码久久久久久浪潮| wwwwww国产| 成人欧美一区二区三区视频网页 | 天堂av在线免费观看| 欧美优质美女网站| 欧美成人国产精品高潮| 91视频.com| 久久人人爽人人片| 国产精品一级| 一道本在线观看视频| 小说区图片区色综合区| 亚洲sss综合天堂久久| av综合电影网站| 欧美日韩爱爱视频| av色图一区| 亚洲国产成人精品久久久国产成人一区| 五月婷婷激情视频| 亚洲自拍偷拍欧美| 性欧美一区二区| 国产jizzjizz一区二区| 手机看片福利日韩| 极品少妇一区二区三区| 亚洲综合网中心| 天堂综合网久久| 国产狼人综合免费视频| 在线手机中文字幕| 欧美精品一区三区| 思思99re6国产在线播放| 日韩精品免费在线播放| 国产女人18毛片水18精| 91精品办公室少妇高潮对白| 日本三级黄色大片| 亚洲欧美综合在线精品| 在线免费观看视频| 99免费精品视频| 欧美日韩一区二区区| 久久九九精品| 日韩小视频网站| 欧美理论在线| 中文字幕乱码免费| 91亚洲国产高清| 亚洲国产成人不卡| 成人羞羞视频播放网站| 国内视频一区| 国产人妖ts一区二区| 宅男在线国产精品| 色婷婷久久综合中文久久蜜桃av| 欧美日韩国产一区中文午夜| 精品少妇一二三区| 一区二区在线观看不卡| 国产免费美女视频| 国产精品久久久久久久岛一牛影视 | 在线视频自拍| 日韩国产在线播放| 天堂影院在线| 亚洲精品一区二区三区不| 四虎在线免费看| 亚洲欧美综合区自拍另类| 欧美zzoo| 中文字幕欧美亚洲| 拍真实国产伦偷精品| 中文字幕日韩精品在线| av电影在线观看| 色偷偷av一区二区三区| 日本欧美在线视频免费观看| 北条麻妃久久精品| 成人免费在线| 色琪琪综合男人的天堂aⅴ视频| 尤物视频在线免费观看| xxx欧美精品| 含羞草www国产在线视频| 欧美成人免费在线视频| 久久亚洲资源| 91高清视频在线免费观看| 在线中文字幕播放| 国产精品pans私拍| 韩国精品视频在线观看 | 亚洲欧洲av另类| 国产亚洲欧美精品久久久久久| 欧美丝袜美女中出在线| 在线免费观看高清视频| 精品久久久久久最新网址| 国内在线精品| 美女少妇精品视频| 免费观看一级欧美片| 91欧美视频网站| 亚洲欧美成人vr| 九九久久九九久久| 三级成人在线视频| 国产ts在线观看| 中文字幕不卡在线播放| 国产无遮挡又黄又爽又色| 日本高清成人免费播放| 亚洲av无码一区二区三区dv| 一本色道久久88精品综合| 午夜影院免费在线| 国产精品第七十二页| 高清欧美性猛交xxxx黑人猛| 亚洲一区二区不卡视频| 国产午夜精品一区二区三区欧美| 57pao国产成永久免费视频| 久久美女高清视频| 日韩免费一二三区| 91麻豆精品国产91久久久久久久久 | 久久国内精品自在自线400部| 亚洲av成人片色在线观看高潮| 亚洲色图另类专区| 中文字幕二区三区| 亚洲免费视频一区二区| 日本在线观看高清完整版| 91精品国产综合久久香蕉| 国产欧美一区二区精品久久久| 日韩中字在线观看| 国产福利一区二区三区视频| 日韩精品久久久久久久的张开腿让| 都市激情亚洲色图| 日本加勒比一区| 欧美丰满少妇xxxx| 精品国产亚洲一区二区三区大结局| 亚洲国产精品视频一区| 视频一区在线播放| 久久精品综合视频| 亚洲va欧美va国产va天堂影院| 精品久久久久成人码免费动漫| 久久视频在线播放| 伊人久久大香| 自拍另类欧美| 久久国产尿小便嘘嘘| 殴美一级黄色片| 777a∨成人精品桃花网| 麻豆网站在线| 91久久精品国产91久久性色| 五月精品视频| 天天综合天天添夜夜添狠狠添| 国产午夜精品理论片a级大结局| 丁香社区五月天| 亚洲欧美另类中文字幕| 吞精囗交69激情欧美| 日本精品一区二区三区高清 久久| 免播放器亚洲| www在线观看免费视频| 色狠狠综合天天综合综合| www免费网站在线观看| 成人av在线亚洲| 欧美在线三区| 亚洲欧美日韩色| 天天免费综合色| 黄色大片在线看| 国产精品欧美日韩| 国产精品久久久久久久免费观看 | 国产精品综合视频| 欧美成人免费看| 亚洲第一国产精品| 9i看片成人免费高清| 亚洲国产午夜伦理片大全在线观看网站 | 国产午夜亚洲精品一级在线| 欧美一级爱爱视频| av在线这里只有精品| 你懂的国产在线| 中文字幕不卡在线视频极品| 国产精品一区二区三区www| 肉大捧一出免费观看网站在线播放 | 国产成人91久久精品| 99国产精品免费视频观看| 欧美熟妇精品一区二区| 欧美午夜女人视频在线| 在线播放麻豆| 成人动漫在线视频| 久久天堂成人| 国产精品久久国产精麻豆96堂| 精品卡一卡二卡三卡四在线| 欧美一级大黄| avove在线观看| 99久久国产综合精品麻豆| 欧美在线视频精品| 欧美激情精品久久久久久久变态 | 日韩国产在线播放| 国产高清精品二区| 欧美女人性生活视频| 亚洲男人电影天堂| 日本福利午夜视频在线| 成人精品视频99在线观看免费 | 欧美国产日韩一区二区三区|