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

MySQL 死鎖了,怎么辦?

開發 前端 MySQL
間隙鎖本質上是用于阻止其他事務在該間隙內插入新記錄,而自身事務是允許在該間隙內插入數據的。也就是說間隙鎖的應用場景包括并發讀取、并發更新、并發刪除和并發插入。

之前分享過?? MySQL 死鎖??的文章,然后很多讀者對「插入意向鎖」認識很迷糊。

大家誤以為「插入意向鎖」是意向鎖,也就是表鎖,確實這個名字很讓人誤解。

但是,實際上「插入意向鎖」不是意向鎖,而是特殊的間隙鎖,屬于行級鎖,注意是「特殊」的間隙鎖,并不是我們常說的間隙鎖。

所以,我在原來文章的基礎上補充了兩個知識點:

  • 什么是插入意向鎖?
  • insert 語句是怎么加鎖的?

提綱如下:

圖片

有個業務主要邏輯就是新增訂單、修改訂單、查詢訂單等操作。然后因為訂單是不能重復的,所以當時在新增訂單的時候做了冪等性校驗,做法就是在新增訂單記錄之前,先通過 select ... for update 語句查詢訂單是否存在,如果不存在才插入訂單記錄。

而正是因為這樣的操作,當業務量很大的時候,就可能會出現死鎖。

接下來跟大家聊下為什么會發生死鎖,以及怎么避免死鎖。

死鎖的發生

本次案例使用存儲引擎 Innodb,隔離級別為可重復讀(RR)。

接下來,我用實戰的方式來帶大家看看死鎖是怎么發生的。

我建了一張訂單表,其中 id 字段為主鍵索引,order_no 字段普通索引,也就是非唯一索引:

CREATE TABLE `t_order` (
`id` int NOT NULL AUTO_INCREMENT,
`order_no` int DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_order` (`order_no`) USING BTREE
) ENGINE=InnoDB ;

然后,先 t_order 表里現在已經有了 6 條記錄:

圖片

假設這時有兩事務,一個事務要插入訂單 1007 ,另外一個事務要插入訂單 1008,因為需要對訂單做冪等性校驗,所以兩個事務先要查詢該訂單是否存在,不存在才插入記錄,過程如下:

圖片

可以看到,兩個事務都陷入了等待狀態(前提沒有打開死鎖檢測),也就是發生了死鎖,因為都在相互等待對方釋放鎖。

這里在查詢記錄是否存在的時候,使用了 select ... for update 語句,目的為了防止事務執行的過程中,有其他事務插入了記錄,而出現幻讀的問題。

如果沒有使用 select ... for update 語句,而使用了單純的 select 語句,如果是兩個訂單號一樣的請求同時進來,就會出現兩個重復的訂單,有可能出現幻讀,如下圖:

圖片

為什么會產生死鎖?

可重復讀隔離級別下,是存在幻讀的問題。

Innodb 引擎為了解決「可重復讀」隔離級別下的幻讀問題,就引出了 next-key 鎖,它是記錄鎖和間隙鎖的組合。

  • Record Loc,記錄鎖,鎖的是記錄本身;
  • Gap Lock,間隙鎖,鎖的就是兩個值之間的空隙,以防止其他事務在這個空隙間插入新的數據,從而避免幻讀現象。

普通的 select 語句是不會對記錄加鎖的,因為它是通過 MVCC 的機制實現的快照讀,如果要在查詢時對記錄加行鎖,可以使用下面這兩個方式:

begin;
//對讀取的記錄加共享鎖
select ... lock in share mode;
commit; //鎖釋放

begin;
//對讀取的記錄加排他鎖
select ... for update;
commit; //鎖釋放

行鎖的釋放時機是在事務提交(commit)后,鎖就會被釋放,并不是一條語句執行完就釋放行鎖。

比如,下面事務 A 查詢語句會鎖住(2, +∞]范圍的記錄,然后期間如果有其他事務在這個鎖住的范圍插入數據就會被阻塞。

圖片

next-key 鎖的加鎖規則其實挺復雜的,在一些場景下會退化成記錄鎖或間隙鎖。

需要注意的是,如果 update 語句的 where 條件沒有用到索引列,那么就會全表掃描,在一行行掃描的過程中,不僅給行加上了行鎖,還給行兩邊的空隙也加上了間隙鎖,相當于鎖住整個表,然后直到事務結束才會釋放鎖。

所以在線上千萬不要執行沒有帶索引條件的 update 語句,不然會造成業務停滯,我有個讀者就因為干了這個事情,然后被老板教育了一波。

回到前面死鎖的例子,在執行下面這條語句的時候:

select id from t_order where order_no = 1008 for update;

因為 order_no 不是唯一索引,所以行鎖的類型是間隙鎖,于是間隙鎖的范圍是(1006, +∞)。那么,當事務 B 往間隙鎖里插入 id = 1008 的記錄就會被鎖住。

因為當我們執行以下插入語句時,會在插入間隙上再次獲取插入意向鎖。

Insert into t_order (order_no, create_date) values (1008, now());

插入意向鎖與間隙鎖是沖突的,所以當其它事務持有該間隙的間隙鎖時,需要等待其它事務釋放間隙鎖之后,才能獲取到插入意向鎖。而間隙鎖與間隙鎖之間是兼容的,所以所以兩個事務中 select ... for update 語句并不會相互影響。

案例中的事務 A 和事務 B 在執行完后 select ... for update 語句后都持有范圍為(1006,+∞)的間隙鎖,而接下來的插入操作為了獲取到插入意向鎖,都在等待對方事務的間隙鎖釋放,于是就造成了循環等待,導致死鎖。

為什么間隙鎖與間隙鎖之間是兼容的?

在MySQL官網上還有一段非常關鍵的描述:

Gap locks in InnoDB are “purely inhibitive”, which means that their only purpose is to prevent other transactions from Inserting to the gap. Gap locks can co-exist. A gap lock taken by one transaction does not prevent another transaction from taking a gap lock on the same gap. There is no difference between shared and exclusive gap locks. They do not conflict with each other, and they perform the same function.

這段話表明間隙鎖在本質上是不區分共享間隙鎖或互斥間隙鎖的,而且間隙鎖是不互斥的,即兩個事務可以同時持有包含共同間隙的間隙鎖。

這里的共同間隙包括兩種場景:

  • 其一是兩個間隙鎖的間隙區間完全一樣;
  • 其二是一個間隙鎖包含的間隙區間是另一個間隙鎖包含間隙區間的子集。

間隙鎖本質上是用于阻止其他事務在該間隙內插入新記錄,而自身事務是允許在該間隙內插入數據的。也就是說間隙鎖的應用場景包括并發讀取、并發更新、并發刪除和并發插入。

插入意向鎖是什么?

注意!插入意向鎖名字雖然有意向鎖,但是它并不是意向鎖,它是一種特殊的間隙鎖。

在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.

這段話表明盡管插入意向鎖是一種特殊的間隙鎖,但不同于間隙鎖的是,該鎖只用于并發插入操作。

如果說間隙鎖鎖住的是一個區間,那么「插入意向鎖」鎖住的就是一個點。因而從這個角度來說,插入意向鎖確實是一種特殊的間隙鎖。

插入意向鎖與間隙鎖的另一個非常重要的差別是:盡管「插入意向鎖」也屬于間隙鎖,但兩個事務卻不能在同一時間內,一個擁有間隙鎖,另一個擁有該間隙區間內的插入意向鎖(當然,插入意向鎖如果不在間隙鎖區間內則是可以的)。

另外,我補充一點,插入意向鎖的生成時機:

每插入一條新記錄,都需要看一下待插入記錄的下一條記錄上是否已經被加了間隙鎖,如果已加間隙鎖,那 Insert 語句應該被阻塞,并生成一個插入意向鎖 。

Insert 語句是怎么加行級鎖的?

Insert 語句在正常執行時是不會生成鎖結構的,它是靠聚簇索引記錄自帶的 trx_id 隱藏列來作為隱式鎖來保護記錄的。

什么是隱式鎖?

當事務需要加鎖的時,如果這個鎖不可能發生沖突,InnoDB會跳過加鎖環節,這種機制稱為隱式鎖。隱式鎖是 InnoDB 實現的一種延遲加鎖機制,其特點是只有在可能發生沖突時才加鎖,從而減少了鎖的數量,提高了系統整體性能。

隱式鎖就是在 Insert 過程中不加鎖,只有在特殊情況下,才會將隱式鎖轉換為顯示鎖,這里我們列舉兩個場景。

如果記錄之間加有間隙鎖,為了避免幻讀,此時是不能插入記錄的;

如果 Insert 的記錄和已有記錄存在唯一鍵沖突,此時也不能插入記錄;

1.記錄之間加有間隙鎖

每插入一條新記錄,都需要看一下待插入記錄的下一條記錄上是否已經被加了間隙鎖,如果已加間隙鎖,那 Insert 語句應該被阻塞,并生成一個插入意向鎖。

舉個例子,現在 t_order 表中,只有這些數據,order_no 是二級索引。

圖片

現在,事務 A 執行了下面這條語句。

# 事務 A
mysql> begin;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from t_order where order_no = 1006 for update;
Empty set (0.01 sec)

接著,我們執行 select * from performance_schema.data_locks\G; 語句  ,確定事務 A 加了什么類型的鎖,這里只關注在記錄上加鎖的類型。

圖片

可以看到,加的是 X 型得鎖,但是具體是記錄鎖、間隙鎖、next-key 鎖呢?注意,這里 LOCK_TYPE 中的 RECORD 表示行級鎖,而不是記錄鎖的意思。

首先通過 LOCK_MODE 可以確認是「next-key 鎖或者間隙鎖」,還是「記錄鎖」:

  • 如果 LOCK_MODE 為 X,說明是 next-key 鎖或者間隙鎖;
  • 如果 LOCK_MODE 為X, REC_NOT_GAP,說明是記錄鎖。

對于是 next-key 鎖,還是間隙鎖,就要看  LOCK_DATA 信息。

  • 如果 LOCK_DATA 信息為 supremum,說明是間隙鎖;
  • 如果 LOCK_DATA 信息為具體的記錄值,說明是 next-key;

因此,本次的例子加的是間隙鎖,間隙鎖的范圍是(1005, +∞)。

然后,有個事務 B 在這個間隙鎖中,插入了一個記錄,那么此時該事務 B 就會被阻塞:

# 事務 B 插入一條記錄
mysql> begin;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order(order_no, create_date) values(1010,now());
### 阻塞狀態。。。。

接著,我們執行 select * from performance_schema.data_locks\G; 語句  ,確定事務 B 加了什么類型的鎖,這里只關注在記錄上加鎖的類型。

圖片

可以看到,事務 B 的狀態為等待狀態,因為向事務 A 生成的間隙鎖 (1005, +∞) 中插入了一條記錄,所以事務 B 的插入操作生成了一個插入意向鎖(LOCK_MODE: X,INSERT_INTENTION )。

2.遇到唯一鍵沖突

如果在插入新記錄時,插入了一個與「已有的記錄的主鍵或者唯一二級索引列值相同」的記錄」(不過可以有多條記錄的唯一二級索引列的值同時為NULL,這里不考慮這種情況),此時插入就會失敗,然后對于這條記錄加上了 S 型的鎖。

至于是行級鎖的類型是記錄鎖,還是 next-key 鎖,跟是主鍵沖突還是唯一二級索引沖突有關系。

如果主鍵值重復:

  • 當隔離級別為讀已提交時,插入新記錄的事務會給已存在的主鍵值重復的聚簇索引記錄添加 S 型記錄鎖。
  • 當隔離級別是可重復讀(默認隔離級別),插入新記錄的事務會給已存在的主鍵值重復的聚簇索引記錄添加 S 型 next-key 鎖。

如果唯一二級索引列重復:

  • 不論是哪個隔離級別,插入新記錄的事務都會給已存在的二級索引列值重復的二級索引記錄添加 S 型 next-key 鎖。對的,沒錯,即使是讀已提交隔離級別也是加 next-key 鎖,這是讀已提交隔離級別中為數不多的給記錄添加間隙鎖的場景。因為如果不添加間隙鎖的話,會讓唯一二級索引中出現多條唯一二級索引列值相同的記錄,這就違背了 UNIQUE 的約束。

下面舉個唯一二級索引沖突的例子,MySQL 8.0 版本,事務隔離級別為可重復讀(默認隔離級別)。

t_order 表中的 order_no 字段為唯一二級索引,并且已經存在 order_no 值為 1001 的記錄,此時事務 A,插入了 order_no 為 1001 的記錄,就出現了報錯。

圖片

但是除了報錯之外,還做一個很重要的事情,就是對 order_no 值為 1001 這條記錄加上了 S 型的 next-key 鎖。

我們可以執行 select * from performance_schema.data_locks\G; 語句  ,確定事務加了什么類型的鎖,這里只關注在記錄上加鎖的類型。

圖片

可以看到,index_order 二級索引中的 1001(LOCK_DATA) 記錄的鎖類型為 S 型的 next-key 鎖。注意,這里 LOCK_TYPE 中的 RECORD 表示行級鎖,而不是記錄鎖的意思。如果是記錄鎖的話,LOCK_MODE 會顯示 S, REC_NOT_GAP。

此時,事務 B 執行了 select * from t_order where order_no = 1001 for update;  就會阻塞,因為這條語句想加 X 型的鎖,是與 S 型的鎖是沖突的,所以就會被阻塞。

圖片

我們也可以從 performance_schema.data_locks 這個表中看到,事務 B 的狀態(LOCK_STATUS)是等待狀態,加鎖的類型 X 型的記錄鎖(LOCK_MODE: X,REC_NOT_GAP    )。

圖片

上面的案例是針對唯一二級索引重復而插入失敗的場景。

接下來,分析兩個事務執行過程中,執行了相同的 insert 語句的場景。

現在 t_order 表中,只有這些數據,order_no 為唯一二級索引。

圖片

在隔離級別可重復讀的情況下,開啟兩個事務,前后執行相同的  Insert 語句,此時事務 B 的  Insert 語句會發生阻塞。

圖片

兩個事務的加鎖過程:

  • 事務 A 先插入 order_no 為 1006 的記錄,可以插入成功,此時對應的唯一二級索引記錄被「隱式鎖」保護,此時還沒有實際的鎖結構;
  • 接著,事務 B 也插入 order_no 為 1006 的記錄,由于事務 A 已經插入 order_no 值為 1006 的記錄,所以事務 B 在插入二級索引記錄時會遇到重復的唯一二級索引列值,此時事務 B 想獲取一個 S 型 next-key 鎖,但是事務 A 并未提交,事務 A 插入的 order_no 值為 1006 的記錄上的「隱式鎖」會變「顯示鎖」且鎖類型為  X 型的記錄鎖,所以事務 B 向獲取 S 型 next-key 鎖時會遇到鎖沖突,事務 B 進入阻塞狀態。

我們可以執行 select * from performance_schema.data_locks\G; 語句  ,確定事務加了什么類型的鎖,這里只關注在記錄上加鎖的類型。

先看事務 A 對 order_no 為 1006 的記錄加了什么鎖?從下圖可以看到,事務 A  對 order_no 為 1006 記錄加上了類型為  X 型的記錄鎖(注意,這個是在執行事務 B 之后才產生的鎖,沒執行事務 B 之前,該記錄還是隱式鎖)。

圖片

然后看事務 B 想對 order_no 為 1006 的記錄加什么鎖?從下圖可以看到,事務 B 想對 order_no 為 1006 的記錄加 S 型的 next-key 鎖,但是由于事務 A 在該記錄上持有了 X 型的記錄鎖,這兩個鎖是沖突的,所以導致事務 B 處于等待狀態。

圖片

從這個實驗可以得知,并發多個事務的時候,第一個事務插入的記錄,并不會加鎖,而是會用隱式鎖保護唯一二級索引的記錄。

但是當第一個事務還未提交的時候,有其他事務插入了與第一個事務相同的記錄,第二個事務就會被阻塞,因為此時第一事務插入的記錄中的隱式鎖會變為顯示鎖且類型是 X 型的記錄鎖,而第二個事務是想對該記錄加上 S 型的 next-key 鎖,X 型與 S 型的鎖是沖突的,所以導致第二個事務會等待,直到第一個事務提交后,釋放了鎖。

如果 order_no 不是唯一二級索引,那么兩個事務,前后執行相同的  Insert 語句,是不會發生阻塞的,就如前面的這個例子。

圖片

如何避免死鎖?

死鎖的四個必要條件:互斥、占有且等待、不可強占用、循環等待。只要系統發生死鎖,這些條件必然成立,但是只要破壞任意一個條件就死鎖就不會成立。

在數據庫層面,有兩種策略通過「打破循環等待條件」來解除死鎖狀態:

設置事務等待鎖的超時時間。當一個事務的等待時間超過該值后,就對這個事務進行回滾,于是鎖就釋放了,另一個事務就可以繼續執行了。在 InnoDB 中,參數 innodb_lock_wait_timeout 是用來設置超時時間的,默認值時 50 秒。當發生超時后,就出現下面這個提示:

圖片

開啟主動死鎖檢測。主動死鎖檢測在發現死鎖后,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以繼續執行。將參數 innodb_deadlock_detect 設置為 on,表示開啟這個邏輯,默認就開啟。當檢測到死鎖后,就會出現下面這個提示:

圖片

上面這個兩種策略是「當有死鎖發生時」的避免方式。

我們可以回歸業務的角度來預防死鎖,對訂單做冪等性校驗的目的是為了保證不會出現重復的訂單,那我們可以直接將 order_no 字段設置為唯一索引列,利用它的唯一下來保證訂單表不會出現重復的訂單,不過有一點不好的地方就是在我們插入一個已經存在的訂單記錄時就會拋出異常。

參考資料:

  • 《MySQL 是怎樣運行的?》
  • http://mysql.taobao.org/monthly/2020/09/06/
責任編輯:武曉燕 來源: 小林coding
相關推薦

2020-09-29 12:15:13

生死鎖MySQL

2022-05-19 08:01:49

PostgreSQL數據庫

2022-12-19 11:31:57

緩存失效數據庫

2009-11-03 08:56:02

linux死機操作系統

2011-11-16 10:02:48

DNSDNS記錄DNS記錄消失

2022-10-14 08:18:07

Guavaweb應用

2011-11-18 10:52:00

2022-07-05 14:19:30

Spring接口CGLIB

2018-01-30 15:08:05

2023-12-25 08:22:02

2020-07-10 08:46:26

HTTPS證書劫持網絡協議

2024-08-06 08:08:14

2021-01-05 10:48:38

RedisAOF日志RDB快照

2024-04-22 08:17:23

MySQL誤刪數據

2020-02-24 11:02:37

斷網網絡故障

2013-02-18 09:19:11

谷歌X PhoneNexus

2024-07-29 08:01:32

2022-10-21 08:17:06

開源項目閉源

2024-08-06 12:29:23

2018-08-15 15:20:00

Windows電腦藍屏錯誤代碼
點贊
收藏

51CTO技術棧公眾號

国产91精品久久久| 欧美一三区三区四区免费在线看| 久久一区二区三区av| 国产嫩bbwbbw高潮| 国产精品免费不| 欧美色网一区二区| 精品国产三级a∨在线| 亚洲黄色片视频| 米奇777在线欧美播放| 国产一区二区激情| 亚洲va在线va天堂va偷拍| 羞羞电影在线观看www| av综合在线播放| 国产精品视频在线播放| 欧美精品一级片| 国产精品片aa在线观看| 日韩欧美视频在线| 日韩一级片播放| 色呦呦在线看| 日本一二三不卡| 久久av二区| a天堂在线观看视频| 首页欧美精品中文字幕| 欧美激情欧美激情| 9.1片黄在线观看| 欧美大片网址| 日韩一区二区视频| 亚洲综合色在线观看| www.youjizz.com在线| 亚洲三级在线播放| 色综合久久久久久久久五月| 日韩一级片免费看| 国产高清精品久久久久| 国产精品视频xxxx| 久久久黄色大片| 黄色在线成人| 久久视频在线直播| 精品伦精品一区二区三区视频密桃| 琪琪久久久久日韩精品 | aⅴ在线免费观看| 色呦呦在线资源| 亚洲欧美二区三区| 在线观看一区二区三区三州| 第三区美女视频在线| 2021中文字幕一区亚洲| 国产亚洲一区在线播放| 亚洲第一大网站| 国产一区二区免费在线| 成人综合网网址| 97人妻精品一区二区三区| 日本vs亚洲vs韩国一区三区二区| 88国产精品欧美一区二区三区| 久久一级黄色片| 欧美全黄视频| 九九热这里只有在线精品视 | 亚洲国产日韩综合久久精品| 黄色网zhan| 国产日产一区二区| 亚洲柠檬福利资源导航| 中文字幕色呦呦| 亚洲淫性视频| 亚洲一区av在线| 国产va亚洲va在线va| 182在线视频观看| 性感美女极品91精品| 一卡二卡三卡视频| 激情国产在线| 黑丝美女久久久| 成年人免费大片| 亚洲mmav| 91精品欧美福利在线观看| 日韩高清在线一区二区| 亚洲精品不卡在线观看| 亚洲成av人片在线观看香蕉| 中文文字幕文字幕高清| 精品在线手机视频| 中文字幕久久久av一区| www深夜成人a√在线| 欧美激情麻豆| 性欧美在线看片a免费观看| 制服.丝袜.亚洲.中文.综合懂色| 免费日韩av片| 国产区亚洲区欧美区| 国产黄色一区二区| 91一区二区三区在线播放| 日韩av电影在线观看| 欧美69xxxx| 亚洲第一激情av| 免费日韩视频在线观看| 日日夜夜亚洲| 欧美精品一区二| 性少妇bbw张开| 欧美韩日高清| 国内自拍欧美激情| 久久精品偷拍视频| 国产成人在线电影| 美日韩精品免费| 毛片在线看网站| 午夜精品一区二区三区电影天堂| 熟妇人妻无乱码中文字幕真矢织江| av在线亚洲一区| 亚洲国产毛片完整版| 国产三级黄色片| 亚洲午夜一区| 国产精品久久久久久久久借妻| 国产麻豆精品一区| 91麻豆文化传媒在线观看| 在线观看国产一区| 在线观看特色大片免费视频| 欧美高清一级片在线| 99re久久精品国产| 51精产品一区一区三区| 日韩美女在线播放| 亚洲第一黄色片| 国产精品久久久一本精品 | 欧美一级精品大片| 亚洲成人网在线播放| 国产一区二区三区自拍| 国产精品国产三级国产aⅴ浪潮 | 亚洲人av在线影院| 欧美卡一卡二卡三| 开心九九激情九九欧美日韩精美视频电影 | 制服国产精品| 欧美动物xxx| 精品福利一区二区三区免费视频| fc2ppv在线播放| 免费视频久久| 久久99精品国产99久久| 自拍亚洲图区| 91精品国产乱码久久蜜臀| 99久久精品免费视频| 国产一级一区二区| 国产精品一区二区三区免费| a视频在线免费看| 欧美日韩视频专区在线播放| 中文字幕国产综合| 亚洲综合国产| 精品日韩欧美| 成人一级福利| 亚洲高清久久久久久| 久久久精品99| 国产激情视频一区二区三区欧美 | 亚洲一区 二区 三区| 国产精品久久久久久久久免费 | 99国产精品久久久久久久久久| 超级碰在线观看| 国产精品视频一区二区三区| yellow中文字幕久久| 亚洲图片欧美在线| 中文字幕av不卡| 冲田杏梨av在线| 欧美亚洲国产精品久久| 国产精品美女在线观看| yiren22综合网成人| 欧美亚男人的天堂| 国产日产在线观看| 精品一区二区三区在线播放| 在线观看成人av| 欧美久久亚洲| 久久久久久久爱| 特黄视频在线观看| 欧美日韩激情视频| www.中文字幕av| 麻豆91小视频| 佐佐木明希av| ady日本映画久久精品一区二区| 欧美激情奇米色| 五月婷婷丁香花| 色美美综合视频| 日本精品久久久久中文| 国内精品伊人久久久久av一坑| 三年中文高清在线观看第6集| 成人黄色91| 欧美激情亚洲自拍| 涩爱av在线播放一区二区| 色狠狠色噜噜噜综合网| 青青青视频在线免费观看| 国产一区二区0| 亚洲国产精品无码观看久久| 岳的好大精品一区二区三区| 国产精品视频久久久久| 天堂av在线电影| 亚洲精品网站在线播放gif| 黄色一区二区视频| 亚洲专区一二三| 精品国产av无码| 日韩国产欧美三级| 男人日女人的bb| 亚洲伊人春色| 91中文字幕在线| 天堂√中文最新版在线| 日韩午夜在线视频| 污视频网站在线播放| 欧美日韩精品一区视频| 久久国产精品二区| 国产欧美日韩精品a在线观看| 一级日本黄色片| 免费日韩一区二区| 国产精品无码免费专区午夜| 视频福利一区| 亚洲直播在线一区| 老司机2019福利精品视频导航| 久久久黄色av| 黄色美女网站在线观看| 日韩欧美综合一区| 日日骚av一区二区| 一区二区三区日韩精品视频| 免费看91的网站| 成人精品在线视频观看| 日韩av卡一卡二| 亚洲综合不卡| 91免费黄视频| 亚洲91视频| 四虎影视永久免费在线观看一区二区三区| 最新国产精品精品视频| 国产精品美女主播| 日本免费久久| 91国内精品久久| 成人免费在线| 最近2019年好看中文字幕视频| 欧美特黄一级视频| 欧美一级淫片007| 中文字幕日产av| 色94色欧美sute亚洲线路一久 | 欧美在线色视频| 国产成人精品a视频一区| 亚洲精品免费在线| 99久久久免费精品| 欧美国产97人人爽人人喊| 中文字幕在线看高清电影| 91视频91自| 88av在线播放| 国产不卡视频一区| 亚洲午夜精品在线观看| 久久99国产精品久久| 波多野结衣天堂| 视频一区二区中文字幕| 国产福利视频在线播放| 在线亚洲成人| 5月婷婷6月丁香| 亚洲东热激情| 热99这里只有精品| 99精品国产福利在线观看免费| 四虎精品欧美一区二区免费| 一区二区三区毛片免费| 一级黄色片播放| 欧美国产精品| 视色,视色影院,视色影库,视色网| 色综合久久网| 一本一道久久a久久综合精品| 日韩系列欧美系列| 一本二本三本亚洲码| 中文字幕日韩欧美精品高清在线| 黄色一级视频播放| 欧美日韩在线大尺度| 成人免费性视频| 亚洲三级色网| 日本精品免费在线观看| 久久婷婷av| 中文字幕 91| 国产乱一区二区| 国产艳妇疯狂做爰视频| 97精品久久久午夜一区二区三区 | 天天干天天综合| 精品中文字幕一区二区小辣椒 | 日韩08精品| 成人欧美一区二区| 四虎884aa成人精品最新| 日本不卡在线观看| 日韩片欧美片| 无码人妻精品一区二区蜜桃百度| 国产精品www.| 青青在线视频观看| 久久国产夜色精品鲁鲁99| 在线免费黄色小视频| 白白色亚洲国产精品| 亚洲国产av一区| 最近日韩中文字幕| 国产午夜福利片| 在线视频国内自拍亚洲视频| 国产精品综合在线| 亚洲电影免费观看高清完整版在线观看| 天堂视频中文在线| 丝袜美腿精品国产二区| 亚洲七七久久综合桃花剧情介绍| 国产91精品久久久久久久| 精品乱码一区二区三区四区| 粉嫩av四季av绯色av第一区| 妖精一区二区三区精品视频| 欧美日韩视频免费在线观看| 亚洲福利免费| jizzzz日本| proumb性欧美在线观看| 国产成人精品视频免费| 亚洲成av人片观看| 6—12呦国产精品| 日韩激情片免费| 久久99精品久久| 欧美一级黄色网| 久久三级中文| 欧美日韩精品久久久免费观看| 亚洲最新色图| 国产性xxxx18免费观看视频| 国产精品66部| 国产极品视频在线观看| 黑人巨大精品欧美一区二区免费| 国产又黄又猛又爽| 伊人久久五月天| 国产福利在线免费观看| 国产精品免费网站| 久久精品福利| 亚洲小视频在线播放| 成人在线免费电影| 激情图片小说一区| ass精品国模裸体欣赏pics| 亚洲丝袜另类动漫二区| 婷婷激情五月综合| 亚洲国产天堂久久国产91| 超碰在线caoporn| 国产精品欧美激情在线播放| 美女呻吟一区| 国产一级做a爰片久久毛片男| 蜜桃视频在线观看一区二区| 亚洲午夜久久久久久久久红桃| 亚洲午夜精品在线| 97人妻精品一区二区三区视频 | yw193.com尤物在线| 日韩av大片免费看| 国产精品欧美大片| 97av中文字幕| 国产福利不卡视频| 成年人一级黄色片| 欧美巨大另类极品videosbest | 国产精品乱码久久久久| bt7086福利一区国产| 国产午夜精品无码| 精品国产sm最大网站免费看| 色图在线观看| 亚洲一区二区三区视频播放| 97精品视频| 国产精品嫩草影院8vv8| 中文在线一区二区| 免费黄色一级大片| 中文字幕日韩电影| 青青热久免费精品视频在线18| 欧美日韩一区二区三| 西西裸体人体做爰大胆久久久| 日韩免费高清一区二区| 五月婷婷久久丁香| 视频午夜在线| 日本午夜在线亚洲.国产| 免费成人高清在线视频theav| 国模无码视频一区二区三区| 99re热视频精品| 天天干天天操天天操| 伊人伊成久久人综合网站| 欧美影视资讯| 一区二区视频国产| 国产精品亚洲一区二区三区妖精| 波多野结衣亚洲一区二区| 精品国产乱码久久久久久老虎| 国产精品探花在线| 麻豆一区区三区四区产品精品蜜桃| 老司机午夜精品视频在线观看| 在线视频第一页| 欧美日韩成人综合| 污污影院在线观看| 国产一区二区高清不卡| 老司机精品久久| 蜜桃视频最新网址| 日韩一区二区三| 国产亚洲成av人片在线观看| 欧美日韩高清在线一区| 久久丁香综合五月国产三级网站| 男女性高潮免费网站| 日韩福利视频在线观看| 亚洲精品国产嫩草在线观看| 精品一区二区成人免费视频| 国产999精品久久| 精品人妻一区二区三区潮喷在线 | 日韩成人av影视| 性色国产成人久久久精品| 欧美大片免费久久精品三p| 中文字幕乱码在线播放| 亚洲欧美久久234| 国产91色综合久久免费分享| 少妇太紧太爽又黄又硬又爽| 色偷偷88888欧美精品久久久| 亚洲性视频在线| 黑鬼大战白妞高潮喷白浆| 亚洲女同一区二区| 精品欧美不卡一区二区在线观看| 成人欧美一区二区三区黑人| a91a精品视频在线观看| 美国一级片在线观看| 亚洲国产精彩中文乱码av| 78精品国产综合久久香蕉| 日韩精品在线中文字幕| 中文字幕人成不卡一区| 三级视频网站在线|