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

探秘 MySQL 鎖:原理與實踐

數據庫 MySQL
當我們深入探索 MySQL 的領域時,不得不將目光聚焦于這看似神秘卻又至關重要的鎖。讓我們一同開啟這場關于 MySQL 鎖的探索之旅,逐步揭開它的神秘面紗,去洞悉它背后的深刻原理和廣泛應用。

在當今數字化的時代,數據庫管理系統的重要性不言而喻,而 MySQL 作為廣泛應用的數據庫之一,更是有著舉足輕重的地位。在 MySQL 的復雜世界中,鎖機制宛如一把關鍵的鑰匙,它既是保障數據一致性和完整性的堅實衛士,也是影響數據庫性能和并發處理能力的重要因素。

當我們深入探索 MySQL 的領域時,不得不將目光聚焦于這看似神秘卻又至關重要的鎖。它究竟是如何運作的?有哪些不同的類型和特點?又如何在各種業務場景中發揮著關鍵作用?讓我們一同開啟這場關于 MySQL 鎖的探索之旅,逐步揭開它的神秘面紗,去洞悉它背后的深刻原理和廣泛應用,為我們更好地駕馭 MySQL 數據庫奠定堅實基礎。

注意:本文所有知識點都是從MySQL8.0版本進行討論,針對5.7版本筆者會在特定知識點中點出區別。

一、詳解MySQL鎖原理

1. 詳解共享鎖和排他鎖

共享鎖(Share Lock,S 鎖):又稱讀鎖,進行讀取操作時會上的鎖,上讀鎖之后的鎖其他事務上讀鎖也沒問題。

排他鎖(Exclusive Lock,X 鎖):又稱寫鎖,進行修改操作前就需要上一把X鎖,上了寫鎖的數據,其他事務則無法上讀鎖或者寫鎖。對于已經上了讀鎖的數據,寫鎖自然也是不能上鎖的。

有了上述基礎,我們針對x鎖對應delete和update操作進行一定的拓展,當事務進行delete的操作時,對應的步驟為:

  • 定位要刪除的數據的B+樹。
  • 對其上X鎖。
  • 上鎖成功后將該位置標志位delete mark。
  • 提交事務。

可以看到刪除操作本質就是定位、標記、刪除對應3個步驟,而且刪除也并非實際意義上的刪除,而是標記刪除。

針對update操作,我們可以從以下3個維度探討:

(1) 普通更新,即更新的字段物理空間不會變化,例如update tb set age=19 where id=1,該操作操作和上述操作差不多,定位到B+樹上的數據后上X鎖,并進行修改操作:

(2) 更新可變字段,假設我們基于主鍵更新某個varchar字段,例如update tb set name='aaaaaaaaaaaaaa' where id=1,將name由varchar(1)更新為varchar(14),那么對應的操作就是定位到數據后上X鎖,將數據刪除(這里的刪除就是將記錄移動到垃圾鏈表),然后執行insert操作。

(3) 更新主鍵,該操作因為會修改b+樹,在定位到數據上X鎖之后,先按照delete的方式將數據刪除,然后再執行insert操作即可。

需要了解的是MySQL在進行讀寫操作為保證并發性能并非一定會用到讀寫鎖,在可重復讀和讀已提交兩個級別下,由于mvcc機制的存在,所以MySQL事務的讀操作都是基于readview進行數據查詢的。

深入解讀MySQL的MVCC與事務隔離級別

2. 詳解意向鎖

假如我們要上全表鎖,我們就必須知道這張表有沒有上過讀鎖或者寫鎖的行級鎖,要想做到這點,常規做法是一行一行遍歷過去看看,針對大表而言,這種遍歷的效率是非常低的。

意向鎖就是用于解決這個問題的,它是表級鎖,在事務需要上讀鎖(S鎖)或者寫鎖(X鎖)前,首先必須取得意向鎖,這樣某些事務需要上全表鎖時,只需要看看有沒有事務持有意向鎖即可:

需要補充的是,意向鎖由數據引擎自行維護,用戶是無法操作的。

說完意向鎖的作用,我們就可以再來聊聊意向鎖的種類,意向鎖分為意向共享鎖和意向排他鎖:

  • 意向共享鎖(Intention Shared Lock,IS 鎖):當事務需要上S鎖時,就需要先嘗試獲取IS鎖。
  • 意向排他鎖(Intention Exclusive Lock,IX 鎖):當事務需要針對某條數據上X鎖的時候,就需要先上一把IX鎖。 而IS和IX之間互相兼容,彼此不互斥,例如:一個事務上了IS,其他事務同樣可以上IS和IX,因為IS本質就是一個共享讀鎖,某個事務持有這個IS鎖之后上的可能是id為1的讀鎖。不影響其他事務上IS或IX后對id為2的數據上X鎖:

本質上來說IS和IX鎖都是表級鎖,它們主要是解決在事務上S鎖或者X鎖前意向詢問來避免掃表的開銷,所以彼此之間是兼容的。

接下來我們從表記鎖的角度探討以下意向鎖和讀寫鎖之間的關系,假設我們的事務需要上IS鎖之后針對表上了S表級鎖,那么就需要查看是否有事務上了IX鎖,如果有則說明有事務正在進行寫操作,此時我們的S表級鎖操作就會阻塞:

同理假設我們的嘗試IX鎖進行修改操作,需要針對全表上了X鎖,此時我們就需要檢查是否有其他事務上了IS或者IX以確定是否存在數據操作,如果有則阻塞等待,這就是IS、IX鎖對于數據讀寫操作的巧妙設計:

3. 詳解表記鎖

表級鎖(table-level locking)即可每一次操作時,鎖的是整張表,鎖的粒度大,上鎖速度快,開銷低,一旦某個事務上了表級鎖,那么其他事務就無法再上行級鎖或者表鎖,這也就意味著高并發場景下性能非常差:

如下所示,這條SQL語句查詢上的就是表級鎖:

SELECT * FROM s1   for update;

這一點我們可以通過查看performance_schema.data_locks表印證這一點,可以看到這個事務上的是IX意向寫鎖,并將表中的所有的記錄即都上了record寫鎖:

4.詳解行級鎖

行級鎖(table-level locking)鎖的粒度相對小一些,是針對索引字段加鎖,鎖的是選定的行數據,相比前者上鎖速度會慢一些,因為需要定位到當前行才能鎖定,并且因為粒度和邏輯設計問題有可能會導致死鎖,但是對于高并發多事務會相對友好一些:

對應我們給出行級鎖的使用示例:

SELECT * FROM s1 WHERE id=1 for update;

通過performance_schema.data_locks表,可以看到這條該事務上X鎖前上了一把IX鎖之后,針對這條記錄上了X,REC_NOT_GAP即上了一把行級鎖,但是不鎖住間隙:

注意:我們上文所討論的都是針對innodb這個存儲引擎,如果是MyISAM這個存儲引擎僅僅支持表級鎖,而InnoDB支持行級鎖。

5.行級鎖實際使用示例

我們先給出行鎖的使用示例:首先創建一張測試表,注意id被設置為主鍵是自帶索引的。

drop  table user;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;

插入模擬數據:

insert into `user`(username, age)values
 ('tom',23),
('joey',22),
('James',21),
('William',20),
('David',24);

關閉事務自動提交,并確認:

-- 關閉事務自動提交
set  autocommit = 0;

-- 查看自動提交是否生效
show VARIABLES like 'autocommit';

此時,在窗口鍵入一下SQL進行查詢,可以看到筆者用了for update對id為1的數據上了排他鎖。

begin;
select * from `user` u where id=1 for update ;

此時我們再開一個排他鎖查詢,可以看到事務阻塞:

begin;
select * from `user` u where id=1 for update ;

由此可知,使用排他鎖對索引列上鎖時,其他排他鎖是無法操作對應數據行的:

補充一個聯合索引的行級鎖使用示例,基于上述表格我們創建一個表級鎖:

create index index_username_age on user(username,age);

開啟一個事務進行查詢:

begin;
select * from user where username ='tom' and age=23  for update ;

此時另一個事務進行相同查詢會阻塞,走不相同的查詢條件不會阻塞,說明聯合索引也是走行級鎖:

begin;
select * from user where username ='tom' and age=23  for update ;

我們通過performance_schema.data_locks表可以看到,第一個事務針對tom數據上了一把行級寫鎖:

6. 表級鎖示例

上文提到,只要不走索引的查詢鎖定的都是整張表,所以我們使用age對應22的SQL查詢語句上排他鎖:

begin;
select * from user where age=20 for update;

再打開另一個窗口就會發現,窗口被阻塞:

begin;
select * from user where age=22 for update ;

很明顯因為沒有命中索引所以無法通過索引方式進行定位,所以上了表級鎖,這一點我們也可以通過information_schema.INNODB_TRX表查看,可以看到第一個事務將所有數據行都上了鎖:

7. 行級鎖使用的注意事項

我們都知道行級鎖鎖的是索引字段,而表級鎖鎖的是非索引字段,這就意味著如果我們進行update或者delete操作 (這兩個操作會上寫鎖互斥的,后文會說明)時where條件沒有命中唯一索引或者索引失效的話,就會上表級鎖,進而出現性能問題。

當然了,有時候MySQL優化器也會不走索引,例如范圍索引檢索范圍區間超過30%,優化器就會走全表掃描,那就無能為力了。

8. InnoDB有哪幾類鎖

  • 記錄鎖(Record Lock):這個鎖鎖定的是單個記錄行上的鎖。
  • 間隙鎖(Gap Lock):這個鎖鎖定的是一個范圍,例如查找id>21的用戶,那么間隙鎖鎖定的就是大于21的記錄,不包括21本身。
  • 臨建鎖(Next-key Lock):這個鎖我們可以理解為是記錄鎖和間隙鎖的綜合,它可以保證當前鎖定的記錄及其間隙都上鎖,這個鎖可以保證可重復讀場景下事務讀避免幻讀問題,例如我們數據正在讀取id為8的數據,針對該鎖上一把Next-key Lock可以阻塞當前數據及其前后區間被其他事務操作導致幻讀:

9. 可重復讀是基于上面那種鎖避免幻讀的呢?

可重讀讀避免幻讀的方式有兩種:

  • 快照讀(一次性非鎖定讀):這種方式就是通過mvcc的方式僅僅在啟動時創建一個readView確保不會出現幻讀。
  • 當前讀(一次性鎖定讀):這種方式就是通過臨建鎖,避免新的記錄插入從而避免幻讀的情況發生。

具體可以參考筆者的這篇文章:《深入解讀MySQL的MVCC與事務隔離級別

10. 詳解間隙鎖

上文說過,間隙鎖就是在范圍查詢時對索引項上鎖,但不包括范圍本身的一種鎖,這種機制在RR這個隔離級別可以一定程度上避免幻讀,注意是一定程度上。 對此我們不妨舉個例子:

首先我們創建一個用戶表,并對age加個索引:

drop  table user;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;


create index age_index on user(age);

然后插入數據:

insert into `user`(username, age)values ('tom',23),('joey',22),('James',21),('William',20),('David',24);

由于MySQL默認隔離級別為RR,所以我們開啟一個窗口設置關閉自動提交,并查看其是否生效。

-- 關閉事務自動提交
set  autocommit = 0;

-- 查看自動提交是否生效
show VARIABLES like 'autocommit';

若生效,我們則輸入一個begin,并進行一個范圍查詢,搜索大于24范圍的數據。

begin;
select * from user where age >24 for update;

當我們在開啟一個新的窗口并進行插入操作時可以發現,操作被阻塞了。

begin;
insert into `user`(username, age)values ('tom',26);

因為年齡上了索引,所以查詢時走了范圍索引,從performance_schema.data_locks可以看出該操作針對id為5、10這兩條年齡為24的數據都上了行級鎖和間隙鎖,導致數據插入失敗:

11.詳解悲觀鎖和樂觀鎖

悲觀鎖就我們上面所說的互斥鎖,它認為自己每次拿到的數據都很可能被人修改,通過上鎖確保互斥性避免數據一致性問題。在MySQL中select...for update,insert,update、delete語句用的都是用排他鎖實現悲觀鎖。 而樂觀鎖則是一種業務鎖,通過用戶手動對表增加一個版本號的字段來解決并發數據正確性問題,如下圖所示,某個時間點兩個相同的事務讀取到相同版本號的當行數據,彼此都執行更新邏輯,為了保證并發更新保證數據準確性,我們就需要通過版本號確保自己更新的數據是最新數據,如下圖所示,左邊的更新SQL最先執行,這就使得右邊的更新失敗了,這樣右邊的事務就知道自己更新條件數據已過期,就會修改版本號再次進行更新。

12. 當前讀和快照讀有什么區別?

答:  先說說當前讀(一致性非鎖定讀)吧,當前讀發生在讀已提交(RC)或者可重復讀(RR)這兩個隔離級別下,我們使用的select使用的就是快照讀:

若在RC這個隔離級別下,用戶每次進行讀操作時,都會創建一個readView,然后通過這個readView獲取數據。

若在RR這個隔離級別下,僅僅在啟動事務時創建一個readVew,后續無論其他事務無論修改用戶讀取的數據,用戶都只會讀取當前readView的數據,這就是為什么RR可以保證可重入讀。

而當前讀(一致性鎖定讀)則基于S鎖或者X鎖實現的一種讀取最新數據,快照讀的select語句如下:

SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE

當然,我們的insert、update、delete語句也是使用當前讀。

二、詳解MySQL中死鎖問題

1. 詳解定位事務各種鎖的幾張表

在正式演示死鎖定位與排查思路之前,我們先簡單介紹幾張比較重要的表,首先是INNODB_TRX 這張表,它會記錄當前活躍事務所持有的鎖的情況:

SELECT * FROM information_schema.INNODB_TRX it ;

如下圖,可以看到我們567584這個事務,這里我們著重查看trx_tables_locked、trx_lock_structs、trx_rows_locked三個字段,其含義分別是:

  • trx_tables_locked:當前事務對幾張表上鎖,以本條數據為例就上了一把鎖。
  • trx_rows_locked:標識當前事務鎖定幾行數據,下圖表示當前事務鎖定了一行數據。
  • trx_lock_structs:當前事務生成幾個鎖的結構體,顯示為2,即生成兩個鎖的結構體。

我們再來看看data_locks表(對應MySQL5.7版本表明為innodb_locks),這張表在MySQL中活躍事務的上鎖情況:

select * from performance_schema.data_locks;

如下圖,可以看到567834事務的線程號、事件id以及這個事務在tb_1表上了一把IX意向讀鎖:

最后再來看看 data_lock_waits表(對應MySQL5.7是innodb_waits表),這張表就比較重要了,它代表了當前事務中處于等待鎖狀態的事務情況:

select * from performance_schema.data_lock_waits;

如下圖,可以看到本文的567585事務正在等待567584的事務的鎖:

2. (實踐)線上定位MySQL死鎖與解決思路

接下來我們就基于一個簡單的例子來掩飾一下如何定位死鎖問題,我們都知道for update上的是寫鎖,這意味著一旦上了X鎖的數據,其他事務就無法針對該數據上S鎖或者X鎖:

如下圖這個說明,假設的我們的事務1先針對id為1的值上了一把寫鎖,對應事務的SQL如下:

begin;
SELECT * FROM  tb_1 t WHERE id =1 for UPDATE ;
SELECT * FROM  tb_1 t WHERE id =2 for UPDATE ;

同理第二個事務現針對id為2的數據上寫鎖,在針對id為1的數據上寫鎖,由此雙方循環等待,造成死鎖。

begin;
SELECT * FROM  tb_1 t WHERE id =2 for UPDATE ;
SELECT * FROM  tb_1 t WHERE id =1 for UPDATE ;

接下來我們就基于上述所說的3張表進行死鎖的問題的定位,首先我們查看INNODB_TRX可以看到我們本次SQL的食物號為567585它處于鎖等待狀態,可以看到它正在執行的SQL語句以及上鎖的信息。

然后我們到data_locks表查看當前數據庫的鎖情況,這個事務正在等待X鎖和REC_NOT_GAP鎖,說明這個事務存在死鎖:

最后再到data_lock_waits可以看到567585的事務等待567584的事務。

明確定位了兩個事務的,查看innodb 狀態信息定位到這兩個事務號的執行執行語句:

show engine innodb status;

最終,可以看到處于等待的事務567585鎖等待的事務567584所執行的SQL語句,很明顯是因為上了同一個行級鎖造成事務567585等待造成死鎖:

針對死鎖問題這個問題,我們先得說說造成死鎖的4個條件:

  • 互斥
  • 不可剝奪
  • 請求和保持條件
  • 鎖之間構成環路

所以MySQL解決死鎖的方式大抵有以下幾種:

  • 每個事務按照順序到表中上鎖(破壞環路條件)。
  • 將大事務拆小。
  • 邏輯上要求事務必須一次性取得兩張表的鎖才能操作數據。
  • 降低隔離級別,例如將RR級別降低為RC避免上間隙鎖確保降低發生死鎖的概率。
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2023-02-22 07:04:05

自動機原理優化實踐

2013-04-17 10:06:55

Google GlasMirror API

2009-06-15 15:57:21

Spring工作原理

2025-03-25 10:29:52

2019-06-03 15:15:09

MySQL索引數據庫

2023-04-06 13:15:48

MySQL復制原理應用實踐

2020-05-22 09:12:46

HTTP3網絡協議

2025-01-10 09:47:43

blockSDKiOS

2019-06-04 09:26:35

UCloudUDB數據庫

2025-09-16 07:09:32

2024-05-10 11:35:22

Redis延時隊列數據庫

2025-02-06 08:24:25

AQS開發Java

2009-06-08 16:52:00

2017-04-17 15:48:15

Cinder備份實踐

2013-01-09 10:34:13

OpenStackKVM

2023-06-07 15:25:19

Kafka版本日志

2013-06-06 13:10:44

HashMap無鎖

2023-10-13 13:30:00

MySQL鎖機制

2010-08-10 17:01:48

FlexJavaScript

2024-07-25 09:01:22

點贊
收藏

51CTO技術棧公眾號

2024国产精品| 精品国产乱码久久久久久果冻传媒| 中文字幕一区二区三区不卡在线 | 日韩欧美精品一区二区三区经典| 这里只有精品6| 亚洲国产裸拍裸体视频在线观看乱了中文 | 毛片免费在线| 国产一区亚洲一区| 日本最新高清不卡中文字幕| 成人免费黄色小视频| 视频小说一区二区| 日韩写真欧美这视频| 国产精品亚洲a| 中文字幕在线观看网站| 国产丝袜在线精品| 国产伦精品一区二区三区高清版 | 91精品国产91久久久久久一区二区| 丁香花在线影院观看在线播放| 99精品老司机免费视频| 99久久精品国产网站| 国产这里只有精品| 无码人妻丰满熟妇精品区| 欧美日韩综合| 久久精品国亚洲| 97伦伦午夜电影理伦片| 91午夜精品| 91精品国产aⅴ一区二区| 超碰影院在线观看| 九色porny丨首页入口在线| 亚洲免费视频成人| 中文字幕一区二区中文字幕| 国外av在线| xnxx国产精品| 裸体丰满少妇做受久久99精品| 精品国产免费无码久久久| 麻豆国产欧美一区二区三区| 日韩**中文字幕毛片| 日韩欧美亚洲一区二区三区| 国内精品久久久久久久97牛牛 | 日本人妖一区二区| 欧美在线一区二区三区四| 久久精品视频9| 欧美精品观看| 久久精品视频导航| 三级黄色在线观看| 欧美hentaied在线观看| 亚洲欧美视频在线| 中国毛片在线观看| blacked蜜桃精品一区| 亚洲午夜精品久久久久久性色| 大地资源二中文在线影视观看| 激情小说一区| 亚洲国产日韩精品在线| 国产成人av无码精品| 国产精品久久久久av蜜臀| 日韩精品一区二区三区视频播放| 三级黄色片免费看| 18国产精品| 亚洲国产三级网| 屁屁影院国产第一页| 精品欧美午夜寂寞影院| 日韩成人久久久| 双性尿奴穿贞c带憋尿| 国产亚洲欧美日韩在线观看一区二区| 亚洲少妇中文在线| 啪啪一区二区三区| 欧美日本免费| 69av成年福利视频| 欧美超碰在线观看| 加勒比av一区二区| 北条麻妃高清一区| 亚洲人视频在线观看| 久久久久国产一区二区三区四区| 日韩高清国产精品| 国产在线一区二区视频| 亚洲国产日韩a在线播放性色| 日本中文字幕亚洲| 偷拍视频一区二区三区| 韩国女主播成人在线观看| 欧美色视频日本版| 国产裸体免费无遮挡| 国产亚洲欧美日韩精品一区二区三区 | 成人51免费| 欧美精品一区二区蜜臀亚洲| 日韩av一二区| 亚洲人metart人体| 国产69精品久久久久久| 中文永久免费观看| 国产.欧美.日韩| 日韩av大全| 秋霞在线视频| 在线观看不卡一区| 蜜臀视频在线观看| 久久一区二区三区喷水| 欧美精品在线网站| 69亚洲精品久久久蜜桃小说 | 波多野结衣一二三区| 在线亚洲a色| 欧美日产国产成人免费图片| 午夜影院免费在线观看 | 99re久久精品国产| 欧美aaaa视频| 欧美专区第一页| 国产熟女一区二区三区五月婷| 97se狠狠狠综合亚洲狠狠| 亚洲一区二区三区免费看| freexxx性亚洲精品| 欧美日韩国产区一| 久久国产精品无码一级毛片| 你懂的成人av| 国产精品欧美日韩久久| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 国产精品chinese| 国产精品九九九| 日韩中文字幕免费观看| 最新热久久免费视频| 99免费视频观看| 久久夜色电影| 欧美精品午夜视频| 91久久精品国产91性色69 | 日韩免费一区二区三区在线播放| 永久免费av无码网站性色av| 99精品免费| 国产精品xxx在线观看www| 国产成人无吗| 欧美日韩国产精选| 国产精品美女高潮无套| 一本久道综合久久精品| 成人av资源网| 色爱综合区网| 欧美一级免费大片| 国产精品丝袜一区二区| 久热成人在线视频| 日韩福利视频| 精品裸体bbb| 亚洲午夜未满十八勿入免费观看全集| 色婷婷av国产精品| 99国产麻豆精品| 你真棒插曲来救救我在线观看| 色悠久久久久综合先锋影音下载| 北条麻妃99精品青青久久| 精品乱码一区内射人妻无码| 国产丝袜在线精品| 国产精品人人爽人人爽| 日本一区二区在线看| 国产成人在线亚洲欧美| 黄色片在线看| 日本韩国精品在线| 91l九色lporny| 喷水一区二区三区| 在线不卡日本| 亚洲91网站| 国模精品视频一区二区| 天天综合天天综合| 色综合久久久久| 六月婷婷七月丁香| 美腿丝袜在线亚洲一区| 一区在线电影| 视频一区在线免费看| 国产视频精品xxxx| 美女黄页在线观看| 中文字幕视频一区二区三区久| 久久久久久久高清| 国产一区二区三区自拍| 久久国产精品 国产精品| 成人影院av| 色偷偷噜噜噜亚洲男人| 99久久精品国产成人一区二区| 一区二区三区欧美日| 久草视频福利在线| 日韩中文字幕一区二区三区| 亚洲乱码一区二区三区| 波多野结衣家庭教师在线| 亚洲综合伊人| 欧美激情二区三区| 日本天堂在线| 欧美日韩在线播放| 久久久久久福利| 久久久综合视频| 毛片毛片毛片毛| 亚洲精品1区| 手机在线观看国产精品| 亚洲性视频在线| 人体精品一二三区| 国产激情视频在线观看| 日韩精品中文字幕在线| 97久久人国产精品婷婷| 五月天亚洲婷婷| 亚洲熟女少妇一区二区| av在线播放一区二区三区| 欧美性猛交xxx乱久交| 欧美欧美天天天天操| 热re99久久精品国产99热| 九九热这里有精品| 97香蕉超级碰碰久久免费软件| 97视频在线观看网站| 亚洲精品一区二区三区福利| 中文字幕乱码人妻无码久久| 亚洲午夜一二三区视频| 五月天免费网站| 2023国产精品视频| 色欲无码人妻久久精品| 日韩国产高清影视| 婷婷五月综合缴情在线视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | av永久免费观看| 成人毛片视频在线观看| 日本人视频jizz页码69| 国产欧美一区二区三区国产幕精品| 超碰成人在线免费观看| 久久99国产精一区二区三区| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 奇米在线7777在线精品| 人妻少妇精品无码专区二区 | 国产色爱av资源综合区| 无码人妻精品一区二区三区99不卡| 久久精品久久99精品久久| 日本不卡在线观看视频| 很黄很黄激情成人| 97超碰免费观看| 91一区在线| 日韩电影免费观看高清完整| 亚洲黄页网站| 国产一区二区三区av在线| 欧美另类中文字幕| 91久久久久久久| 四虎国产精品永久在线国在线 | 99精品在线免费视频| 欧美日韩三区| 久久国产精品免费观看| 午夜久久免费观看| 这里只有精品66| 日韩精品免费一区二区三区| 日本一区二区精品视频| 亚洲国产国产| 欧美18视频| 自拍自偷一区二区三区| 久久福利电影| 国产精品免费不| 欧美高清一区二区| 国产成人精品999在线观看| 久久精品日产第一区二区三区| 伊人久久亚洲| 国产综合动作在线观看| 精品日产乱码久久久久久仙踪林| 国产精品一区二区在线观看| 成人香蕉社区| 久久精品ww人人做人人爽| 亚洲免费成人av在线| 秋霞在线观看一区二区三区| 凹凸成人精品亚洲精品密奴| 午夜老司机精品| 日韩一区亚洲二区| 日本黄网站色大片免费观看| 欧美日韩国产亚洲一区| www.av毛片| 久久福利一区| 婷婷六月天在线| 久久国产麻豆精品| 国产又粗又猛大又黄又爽| 国产精品一级在线| av免费观看不卡| 2020国产精品自拍| 久久日免费视频| 依依成人综合视频| 日本熟妇一区二区| 色哟哟在线观看一区二区三区| 国产精品无码粉嫩小泬| 欧美一区二区在线视频| 色婷婷中文字幕| 一区二区福利视频| 国产在线一区二区视频| 91精品国产91久久久久久吃药| 成人av免费电影网站| 国产日韩在线亚洲字幕中文| 99a精品视频在线观看| 久久人人爽爽人人爽人人片av| 国产亚洲精品美女久久久久久久久久| 制服丝袜综合日韩欧美| 国产一区欧美| 男人插女人下面免费视频| 国产一区二区三区观看| aaaa黄色片| 中文字幕乱码日本亚洲一区二区| youjizz亚洲女人| 亚洲亚洲人成综合网络| 小泽玛利亚一区二区三区视频| 日韩精品一区二区三区蜜臀| 亚洲精品综合网| 亚洲欧洲在线免费| www免费在线观看| 国产精品xxx视频| 一区二区三区欧洲区| 日韩妆和欧美的一区二区| 91精品一区二区三区综合| 欧美牲交a欧美牲交aⅴ免费真| 国内精品视频一区二区三区八戒| 国产高清自拍视频| 最新欧美精品一区二区三区| 中文字幕精品视频在线观看| 欧美成人vps| 日本最黄一级片免费在线| 97avcom| 欧洲大片精品免费永久看nba| 日韩一区二区电影在线观看| 日韩亚洲国产欧美| 激情成人在线观看| 国产视频在线观看一区二区三区 | 麻豆传媒在线观看| 欧美在线不卡区| 国产精品99久久免费观看| 中文字幕在线观看一区二区三区| 视频在线在亚洲| 91黄色免费视频| 亚洲一区二区欧美| 国产三级在线观看视频| 亚洲视频第一页| 亚洲深夜视频| 久久久久久国产精品免费免费| 欧美 日韩 国产 一区| 污网站免费在线| 欧美激情在线看| 日韩精品成人免费观看视频| 亚洲国产欧美在线成人app| 亚洲七七久久综合桃花剧情介绍| 国产伦精品一区二区三区精品视频| 欧美性生活一级片| 精品无码一区二区三区在线| 国产成人一区在线| 青花影视在线观看免费高清| 欧美久久久久中文字幕| 国产精品ⅴa有声小说| 国产成人一区三区| 欧美日韩在线播放视频| xxxx一级片| 国产精品热久久久久夜色精品三区| 国产成人无码av| 亚洲欧美一区二区三区情侣bbw| 嗯啊主人调教在线播放视频 | 日韩精品欧美激情一区二区| 无人在线观看的免费高清视频| 久久久久久久精| 艳妇乳肉豪妇荡乳av无码福利| 一区二区亚洲精品国产| 欧美18—19sex性hd| 日韩精品国内| 日本中文一区二区三区| 国产小视频你懂的| 日韩一区二区在线免费观看| 欧美xxx黑人xxx水蜜桃| 国产成人精品福利一区二区三区 | 亚洲主播在线观看| 日韩一级中文字幕| 日本一区二区在线播放| 欧美最新另类人妖| 亚洲天堂网2018| 亚洲自拍偷拍综合| 欧美一级特黄aaaaaa大片在线观看| 午夜精品一区二区三区av| 老司机凹凸av亚洲导航| 久久无码高潮喷水| 国产欧美日韩另类一区| 国产绳艺sm调教室论坛| 久久久亚洲精品视频| 日本欧美三级| 日本人视频jizz页码69| 一区二区三区中文在线观看| 日日夜夜精品免费| 日韩免费不卡av| 国产高清一区二区| 国产女人18毛片水真多18| 欧美性生交xxxxx久久久| 免费黄色在线| 国产日韩欧美精品| 秋霞成人午夜伦在线观看| 免费看一级大片| 日韩av影视综合网| 懂色aⅴ精品一区二区三区| 黄色免费高清视频| 99久久久久免费精品国产 | 日韩精品久久久久久| 午夜精品福利在线视频| 亚洲精品v天堂中文字幕| 九九九精品视频| www.国产在线播放| 国产欧美日韩在线视频| 午夜久久久久久久久久| 国产不卡视频在线| 欧美~级网站不卡| 自拍偷拍亚洲天堂| 精品日韩成人av| 电影亚洲一区| 美脚丝袜脚交一区二区| 亚洲国产成人在线| 偷拍精品一区二区三区| 成人免费在线视频网址| 性色一区二区三区| 国产亚洲小视频| 中文字幕不卡av| 亚洲警察之高压线|