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

高并發(fā)場景下的MySQL幾類死鎖事故案例分析

數(shù)據(jù)庫 MySQL
通俗一些來說,A線程持有B鎖,然后想要訪問A鎖,此時B線程持有A鎖,想要訪問B鎖,這種情況下就容易出現(xiàn)死鎖。

本文主要講解MySQL中出現(xiàn)死鎖的應(yīng)用案例,以及相關(guān)的業(yè)務(wù)場景,不會純講理論,希望對這塊感興趣的朋友可以有所幫助。

什么是死鎖

多個線程在訪問某些資源的時候,需要等待對方釋放彼此所需資源,而進入了等待互斥的狀態(tài)。

通俗一些來說,A線程持有B鎖,然后想要訪問A鎖,此時B線程持有A鎖,想要訪問B鎖,這種情況下就容易出現(xiàn)死鎖。

MySQL中鎖的類型有哪些?

下邊我們以用戶消息表案例來進行說明:

CREATE TABLE `t_user_message` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '發(fā)信方id',
  `object_id` int unsigned NOT NULL DEFAULT '0' COMMENT '收信方id',
  `relation_id` int unsigned NOT NULL DEFAULT '0' COMMENT '關(guān)聯(lián)id',
  `is_read` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否已讀(0未讀,1已讀)',
  `sid` int unsigned NOT NULL DEFAULT '0' COMMENT '消息條數(shù)',
  `status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '狀態(tài)(0無效 1有效)',
  `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '消息內(nèi)容',
  `type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '類型(0文本,1語音,2圖片,3視頻,4表情,5分享鏈接)',
  `ext_json` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '擴展字段',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) USING BTREE COMMENT '發(fā)信方id索引',
  KEY `idx_object_id` (`object_id`) USING BTREE COMMENT '收信方id索引',
  KEY `idx_relation_id` (`relation_id`) USING BTREE COMMENT '關(guān)聯(lián)id索引'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='用戶消息表';

按照鎖的粒度來區(qū)分,可以分為以下兩種:

行鎖

只會鎖住特定的行記錄,例如下邊這條sql:

select * from t_user_message where user_id=1001 for update;

表鎖

會把整個表的數(shù)據(jù)給鎖住,性能較差,例如下邊這條sql:

select * from t_user_message  for update;

排它鎖和共享鎖的區(qū)別

共享鎖

在多個事務(wù)里面都可以讀取共享鎖所鎖住的內(nèi)容。

排它鎖

只能在一個事務(wù)里對同樣的數(shù)據(jù)進行加鎖,假設(shè)A事務(wù)對某行數(shù)據(jù)加入了排它鎖之后,其他事務(wù)就無法再對該行記錄加入排它鎖。

關(guān)于排它鎖和共享鎖的使用

看到這里,你可能對共享鎖和排它鎖并不是理解得很徹底,那么先別著急,我們先從實戰(zhàn)來加深下你對它的理解。

排它鎖

在Innodb存儲引擎中,常見的update,insert,delete這些sql都會默認加入上排他鎖,而我們的select語句如果沒有加入特殊關(guān)鍵字(下邊會講是什么樣的特殊關(guān)鍵字) ,是不會加入排他鎖的。

如果select語句希望加入排它鎖,那么可以嘗試以下方式:

使用 for update 關(guān)鍵字

select * from t_user_message  for update;

共享鎖

在正常的select語句中,是不會有加鎖的,例如下邊這條sql:

select * from t_user_message;

這條sql在innodb中,默認是不會鎖表,也不會鎖行記錄。如果你希望加上一把共享鎖,那么可以嘗試以下的這種寫法:

使用 lock in share mode 關(guān)鍵字

select * from t_user_message lock in share mode;

lock in share mode 和 for update使用起來有什么區(qū)別?

來看看這個案例,我們準備了兩個MySQL的會話窗口。

lock in share mode 測試

先來看會話A:會話A中,關(guān)閉了自動提交功能,然后執(zhí)行這個lock in share mode的鎖,此時它使用了共享鎖鎖住了全表的內(nèi)容。

圖片圖片

再來看會話B:會話B中也是相同的,關(guān)閉自動提交后,執(zhí)行l(wèi)ock in share mode的共享鎖,發(fā)現(xiàn)依然可以正常查詢,沒有堵塞行為。

圖片圖片

這時候我們將會話B的當前事務(wù)先提交,然后在會話B中繼續(xù)執(zhí)行一條update語句(非事務(wù)狀態(tài)下) ,要知道update是默認帶了拍它鎖的,此時因為我們的會話A沒有commit,所以會話B的這條update操作會進入堵塞的狀態(tài),如下圖:

圖片圖片

只有當會話A的事務(wù)執(zhí)行完畢了,將lock in share mode的鎖給釋放掉,會話B才會繼續(xù)執(zhí)行。

for update測試

下邊讓我們來看看 for update 加鎖的影響,會話A關(guān)閉了自動提交,然后執(zhí)行了一條for update的sql,但是沒有commit;此時我們的會話B也開始了同樣的步驟,但是卻卡住了。

圖片圖片

假如事務(wù)A一直都不提交的話,那么事務(wù)B最終會報出以下異常:

圖片圖片

[查詢2中發(fā)生錯誤] Lock wait timeout exceeded; try restarting transaction

再來看看for update鎖住的數(shù)據(jù),對于其他會話的寫操作有何影響。

如下圖所示,我們的會話A依舊沒有commit,但是此時會話B中嘗試執(zhí)行一次update操作,由于update默認帶了排他鎖,這條sql會鎖表,所以和會話A中的for update鎖出現(xiàn)了沖突,導(dǎo)致會話B一直處于堵塞狀態(tài)。

圖片圖片

小總結(jié)

通過上述的幾個測試,大家應(yīng)該也有深刻的體會了,那么我們就來進行下總結(jié),加深下印象。


lock in share mode 鎖

for update 鎖

多session讀

不會堵塞,多個session可以讀共同鎖住的記錄。

會堵塞,只能有一個session讀取到鎖住的記錄,其他session的訪問得等待。

多session寫

會堵塞,任何寫相關(guān)的操作都不行

會堵塞,任何寫相關(guān)的操作都不行


看到這里,你應(yīng)該對lock in share mode 和 for update 有一定了解了吧,但是這兩種鎖,光了解理論,其實還是不夠的,需要有實戰(zhàn)才能讓你對它理解更加深刻,來看下邊的案例。

lock in share mode使用不當,導(dǎo)致死鎖

來看下邊的這個業(yè)務(wù)場景:

假設(shè)我們有一個賬戶表,表結(jié)構(gòu)如下:

CREATE TABLE `t_account` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL,
  `coin` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

然后在業(yè)務(wù)操作上,我們的賬戶扣款和增款邏輯上的設(shè)計如下:

//開啟一個事務(wù)操作
set autocommit=0;
begin;
//如果賬戶存在,才進行update,如果賬戶不存在,就得先insert
select * from t_account where user_id=111 lock in share mode;


//這里我們假設(shè)賬戶是存在的,那么就直接選擇打款入賬
update t_account set coin=coin+100 where user_id=111;


//記錄到賬戶流水表中
INSERT INTO `transaction_log` (`id`, `business`, `foreign_key`)
VALUES (1, X'6F726465722D62697A', X'3234303938413535333031324444443044444137363036333744434233373834333643313138423441414332323236454644463430303034');


commit;

這里為了保證將賬戶流水記錄和打款兩個操作保證一致性,得加入一個本地事務(wù)去修飾。但是這段代碼中使用了一個lock in share mode的關(guān)鍵字,這個關(guān)鍵字是為了避免在并發(fā)的情況下,對賬戶記錄進行讀的過程中,有其他地方對賬戶的coin值進行寫的修改。

之所以可能會有其他地方對coin值進行額外的寫操作,主要原因是因為系統(tǒng)業(yè)務(wù)中的老舊代碼存在,重復(fù)造輪子,本來A服務(wù)中只有一處地方對賬戶進行修改操作,結(jié)果在B服務(wù)里,也有一段類似的代碼修改,直接操作了數(shù)據(jù)庫表,但是由于不好去調(diào)整那個服務(wù)的代碼,所以暫時只能用 lock in share mode 操作去加鎖。相比于for update鎖來說,使用lock in share mode加鎖,對于讀的影響不大,所以早期設(shè)計的時候,沒有考慮那么多,就直接用了它上線。并且上線之后并發(fā)度不高,暫時就沒有發(fā)現(xiàn)什么問題。

看到這里,你可能感覺似乎這種設(shè)計沒有什么問題,那么我們來看看下邊的這個場景:

隨著并發(fā)度的增加,我們將修改余額的這個操作,在A服務(wù)里面封裝成為了一個方法,并且供各個地方進行調(diào)用。但是有一天,出現(xiàn)了這么一個業(yè)務(wù)場景:

在RocketMQ的消費方,會對用戶的賬戶進行打款操作。在這個消費方的代碼中,同一個userId的消息會有許多條,而且是同一時刻的大量并發(fā)消費,這就意味著,同一時刻會有大量的請求調(diào)用這個打款的操作,而且是并發(fā),同一個userId。那么這種情況下,我們的 lock in share mode會發(fā)生什么樣的情況呢 -- 死鎖

來看下圖:

圖片圖片

由于我們的線程A持有了鎖,線程B也持有了鎖,但是它們接下來的update操作,都是得等對方將共享鎖釋放后才可以繼續(xù)執(zhí)行,所以就發(fā)生了死鎖的場景。

圖片圖片

如何解決上述的lock in share mode死鎖

那么我們?nèi)绾螀s避免上邊的場景發(fā)生呢,這里我給出以下兩種思路。

不用鎖,提升事務(wù)隔離級別為讀已提交

//開啟一個事務(wù)操作
set autocommit=0;


//如果賬戶存在,才進行update,如果賬戶不存在,就得先insert
select * from t_account where user_id=111;


//這里我們假設(shè)賬戶是存在的,那么就直接選擇打款入賬
update t_account set coin=coin+100,version=version+1 where user_id=111;


//記錄到賬戶流水表中
INSERT INTO `transaction_log` (`id`, `business`, `foreign_key`)
VALUES (1, X'6F726465722D62697A', X'3234303938413535333031324444443044444137363036333744434233373834333643313138423441414332323236454644463430303034');


commit;


去掉使用lock in share mode,使用樂觀鎖。

例如加入一個version字段,那么我們在執(zhí)行賬戶扣款的時候,加入version的判斷。例如:

//開啟一個事務(wù)操作
set autocommit=0;


//如果賬戶存在,才進行update,如果賬戶不存在,就得先insert
select * from t_account where user_id=111 and version=#{version};


//這里我們假設(shè)賬戶是存在的,那么就直接選擇打款入賬
update t_account set coin=coin+100,version=version+1 where user_id=111 and version=#{version};


//記錄到賬戶流水表中
INSERT INTO `transaction_log` (`id`, `business`, `foreign_key`)
VALUES (1, X'6F726465722D62697A', X'3234303938413535333031324444443044444137363036333744434233373834333643313138423441414332323236454644463430303034');


commit;

這里要注意,當同時兩個會話針對同一行數(shù)據(jù)執(zhí)行上述更新操作的時候,可能會導(dǎo)致同一行的記錄被鎖,所以我們在進行update的時候,可以用一個version字段去管理。但是這種設(shè)計,可能會導(dǎo)致一次更新失敗,需要進行重試,因此并發(fā)量高的情況下,容易對MySQL造成較大的壓力。

引入分布式鎖

直接在業(yè)務(wù)層引入一把分布式鎖,這種思路比較暴力,但是確實有效。

其實只要我們的select類型的sql中進行顯示加鎖,就有可能會有死鎖情況發(fā)生,所以建議大家使用的時候謹慎。

行鎖的幾種類型

  • Record Lock(記錄鎖):單個行記錄上的鎖。這個也是我們?nèi)粘UJ為的行鎖。
  • Gap Lock(間隙鎖):間隙鎖,鎖定一個范圍,但不包括記錄本身(只不過它的鎖粒度比記錄鎖的鎖整行更大一些,他是鎖住了某個范圍內(nèi)的多個行,包括根本不存在的數(shù)據(jù))。GAP鎖的目的,是為了防止同一事務(wù)的兩次當前讀,出現(xiàn)幻讀的情況。該鎖只會在隔離級別是RR或者以上的級別內(nèi)存在。間隙鎖的目的是為了讓其他事務(wù)無法在間隙中新增數(shù)據(jù)。
  • Next-Key Lock(臨鍵鎖):它是記錄鎖和間隙鎖的結(jié)合,鎖定一個范圍,并且鎖定記錄本身。對于行的查詢,都是采用該方法,主要目的是解決幻讀的問題。next-key鎖是InnoDB默認的鎖,該鎖也只會在隔離級別是RR或者以上的級別內(nèi)存在。

行鎖的事故案例

消息數(shù)據(jù)更新設(shè)計不當,導(dǎo)致出現(xiàn)Record Lock死鎖

這里我們需要先了解下消息記錄表的結(jié)構(gòu);

CREATE TABLE `t_user_message` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '發(fā)信方id',
  `object_id` int unsigned NOT NULL DEFAULT '0' COMMENT '收信方id',
  `relation_id` int unsigned NOT NULL DEFAULT '0' COMMENT '關(guān)聯(lián)id',
  `is_read` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否已讀(0未讀,1已讀)',
  `sid` int unsigned NOT NULL DEFAULT '0' COMMENT '消息條數(shù)',
  `status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '狀態(tài)(0未審核 1審核失敗 2審核通過)',
  `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '消息內(nèi)容',
  `type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '類型(0文本,1語音,2圖片,3視頻,4表情,5分享鏈接)',
  `ext_json` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '擴展字段',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) USING BTREE COMMENT '發(fā)信方id索引',
  KEY `idx_object_id` (`object_id`) USING BTREE COMMENT '收信方id索引',
  KEY `idx_relation_id` (`relation_id`) USING BTREE COMMENT '關(guān)聯(lián)id索引'
) ENGINE=InnoDB AUTO_INCREMENT=100015 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='用戶消息表';

假設(shè)我們的會話A執(zhí)行了以下事務(wù)操作:

START TRANSACTION;


//更新用戶的消息狀態(tài),從未讀變?yōu)橐炎x
update t_user_message set is_read=1 where user_id=1003 and object_id=1004;
//...中間有些別的業(yè)務(wù)操作
update t_user_message set is_read=1 where user_id=1001 and object_id=1002;


commit;

而此時我們的會話B在執(zhí)行一個異步的消息是否合法的檢測工作,具體操作如下:

set autocommit=0;
START TRANSACTION;


//定時任務(wù)更新用戶的消息審核狀態(tài),從未審核變?yōu)閷徍送ㄟ^
update t_user_message set status=2 where user_id=1001 and object_id=1002;
//...中間有些別的業(yè)務(wù)操作
update t_user_message set status=2 where user_id=1003 and object_id=1004;


commit;

這兩個事務(wù)如果并發(fā)執(zhí)行,并發(fā)度高的情況下,可能會出現(xiàn)死鎖情況,死鎖產(chǎn)生的步驟如下圖所示:

圖片圖片

一般遇到這類情況,我們都會推薦在進行更新的時候,盡可能的避免死鎖條件發(fā)生,例如調(diào)整sql的執(zhí)行順序。例如變更為如下操作:

圖片圖片

另外,調(diào)整順序后,盡量將本地事務(wù)的顆粒度控制到最小,減少因為加鎖堵塞帶來的性能問題。

間隙鎖堵塞案例分析

首先我們要將當前會話的事務(wù)隔離級別設(shè)置為可重復(fù)讀:

set SESSION transaction ISOLATION LEVEL REPEATABLE READ;

如果你想確認當前的會話的事務(wù)隔離級別,那么可以使用以下命令去查詢:

SELECT @@transaction_isolation; (mysql8.0語法)
 SELECT @@tx_isolation; (mysql5.7語法)

還是針對我們的消息表t_user_message,在某些高并發(fā)場景下,如果使用可重復(fù)讀的話,尤其是事務(wù)場景中,出現(xiàn)死鎖的概率會加大。例如下邊這個場景:

事務(wù)1中,對消息表的可讀狀態(tài)進行修改,修改的是記錄表中的前3條數(shù)據(jù),由于是可重復(fù)讀,以及非唯一索引user_id和object_id所以這里會鎖住的是(0,100011]這個區(qū)間的id記錄,也就是說只要我們更新的行是超過了100011 id的都沒問題。

圖片圖片

但是假設(shè)此時有個插入請求,打算往100009之前寫入一條記錄的話,就會出現(xiàn)間隙鎖堵塞的問題,例如下圖所示:

圖片圖片

產(chǎn)生間隙鎖的原因

1.使用了update,delete,selecct... for update相關(guān)操作

2.使用了可重復(fù)讀的隔離級別

3.在執(zhí)行update/delete/select ... for update操作之后,在對應(yīng)的間隙中插入了新的數(shù)據(jù)(注意是insert了新的數(shù)據(jù)才會有間隙鎖問題產(chǎn)生)。

MySQL中的死鎖檢測

在mysql5.7、mysql5.8等5系版本中

查看死鎖代碼是

select * from information_schema.innodb_locks;

查看等待鎖的代碼

select * from information_schema.innodb_lock_waits

但是要注意,在mysql 8.0中查看死鎖代碼變了,如果繼續(xù)用5.7的代碼會提示報錯

Unknown table ‘INNODB_LOCKS’ in information_schema

所以在8.0使用以下代碼

查看死鎖

select * from performance_schema.data_locks;

查看死鎖等待時間

select * from performance_schema.data_lock_waits;


責(zé)任編輯:武曉燕 來源: Idea的技術(shù)分享
相關(guān)推薦

2020-07-16 21:20:08

數(shù)據(jù)庫MySQL死鎖

2025-02-26 03:00:00

2025-02-28 00:03:22

高并發(fā)TPS系統(tǒng)

2025-02-26 08:10:40

2018-07-27 10:56:10

2025-06-05 01:22:00

SpringGateway高并發(fā)

2021-01-13 05:27:02

服務(wù)器性能高并發(fā)

2025-06-30 02:15:00

2016-11-09 21:09:54

mysqlmysql優(yōu)化

2025-05-26 02:11:00

2017-06-07 16:10:24

Mysql死鎖死鎖日志

2025-01-27 00:40:41

2024-08-29 09:32:36

2025-03-31 10:42:31

2023-10-07 08:54:28

項目httpPost對象

2018-05-04 15:15:37

數(shù)據(jù)庫MySQL并發(fā)場景

2017-05-03 16:26:24

MySQL并發(fā)死鎖

2019-07-05 17:40:24

MySQL并發(fā)數(shù)據(jù)庫

2025-07-09 04:00:00

Kafka億級流量高并發(fā)

2025-01-03 09:56:09

點贊
收藏

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

亚洲成人黄色av| 成人黄色av片| aaa一区二区三区| 亚洲国产免费看| 国产午夜一区二区| 午夜影院免费观看视频| 亚洲天堂电影| 亚洲视频一二三区| 久久精精品视频| 国产又粗又猛又爽又黄视频| 亚洲看片一区| 久久人人爽人人爽人人片亚洲| 国产日韩在线一区二区三区| av大全在线观看| 亚洲h色精品| 欧美色精品天天在线观看视频| 精品高清视频| 久久久久久天堂| 久久不卡国产精品一区二区| 91精品国产91综合久久蜜臀| 欧美成人xxxxx| 国产福利视频在线观看| 久久精品综合网| 国产精品免费观看高清| 一级黄色短视频| 久久精品在线| 91精品国产乱码久久久久久蜜臀 | 成人动漫一区二区三区| 国产日本欧美一区| 无码人妻精品一区二区三区9厂| 国产精品videossex久久发布| 中日韩美女免费视频网址在线观看 | 日韩精品资源| 五月婷婷在线观看视频| 国产乱子伦视频一区二区三区| 日韩免费精品视频| 天天做天天爱夜夜爽| 欧美日本一区| 久久亚洲影音av资源网| 国产三级短视频| 国产乱码精品一区二区三区四区| 亚洲国产日韩精品在线| 在线成人精品视频| 国产福利视频在线| 国产精品美女视频| 色就是色欧美| 极品美乳网红视频免费在线观看 | 国产精品女主播一区二区三区| 欧美超级乱淫片喷水| 91香蕉视频污在线观看| 日韩在线观看电影完整版高清免费悬疑悬疑| 亚洲精品国产拍免费91在线| av av在线| 美女扒开腿让男人桶爽久久动漫| 精品精品欲导航| 中文字幕无人区二| 超碰在线公开| 亚洲6080在线| 黄色国产一级视频| 性孕妇free特大另类| 狠狠色狠色综合曰曰| 欧美日韩成人免费视频| 草草视频在线观看| 欧美性猛交xxxx富婆弯腰| 日韩高清国产精品| 韩国精品视频| 国产日产欧美一区| 天堂av一区二区| 日本在线免费网| 成人av网址在线观看| 国产精品一区视频| 亚洲人视频在线观看| 久久人人97超碰com| 天堂va久久久噜噜噜久久va| 98在线视频| 亚洲精品成人少妇| 久久久久久免费看| 欧美亚洲大片| 亚洲va欧美va国产va天堂影院| 国产真人做爰毛片视频直播| 深夜在线视频| 欧美日韩国产综合久久| 亚洲欧美天堂在线| 免费观看欧美大片| 欧美在线短视频| 一二三av在线| 欧美变态挠脚心| 中文字幕欧美精品日韩中文字幕| 亚洲天堂黄色片| 不卡av一区二区| 久久天天躁狠狠躁夜夜躁2014| 久久久全国免费视频| 亚洲一卡久久| 国产在线高清精品| 无码国产色欲xxxx视频| 亚洲国产精品二十页| 国产伦精品一区二区三区视频孕妇 | 国产女人被狂躁到高潮小说| 国产精品呻吟| 91久久国产精品91久久性色| 午夜影院免费视频| 中文字幕一区免费在线观看 | 久久精选视频| 91视频国产一区| 亚洲欧美丝袜中文综合| 自拍av一区二区三区| 欧美高清一区二区| 免费看美女视频在线网站| 五月综合激情网| 色天使在线观看| 伊人成综合网yiren22| 欧美精品手机在线| 亚洲天堂五月天| 成人午夜私人影院| 小说区视频区图片区| 新版的欧美在线视频| 日韩欧美国产精品一区| 黑人と日本人の交わりビデオ| 欧州一区二区| 亚洲最新在线视频| 日韩精品一区二区不卡| 国产一区啦啦啦在线观看| 日本婷婷久久久久久久久一区二区| 女子免费在线观看视频www| 欧美日韩在线精品一区二区三区激情 | 精品视频久久久久久| 疯狂试爱三2浴室激情视频| 日韩电影在线免费| 欧美下载看逼逼| 成人观看网址| 精品黑人一区二区三区久久| 久久高清内射无套| 黄色精品一二区| 亚洲国产精品123| 性欧美videohd高精| 日韩av网址在线| 日本亚洲欧美在线| 成人精品一区二区三区四区| 热久久最新地址| 成人噜噜噜噜| 久久不射热爱视频精品| 亚洲一区中文字幕在线| 亚洲国产精品av| 福利在线一区二区三区| 日韩专区视频网站| 国产亚洲精品高潮| 无码视频在线观看| 久久久国产综合精品女国产盗摄| 九色在线视频观看| 亚洲人成网www| 日韩美女av在线免费观看| 日韩在线免费看| 欧美性开放视频| 亚洲自拍偷拍图| 日本亚洲一区二区| 亚洲一区二区四区| 999精品视频在线观看| 久久久国产在线视频| 99精品久久久久久中文字幕| 中文字幕视频一区二区三区久| 99国产精品久久久久久| 一本一本久久a久久综合精品| 国内外成人免费激情在线视频网站| 一级片在线观看免费| 91美女视频网站| 精品嫩模一区二区三区| 91精品国产自产精品男人的天堂| 欧美丰满片xxx777| 天天干,夜夜爽| 一本大道久久a久久精品综合| 国产成人无码精品久久二区三| 日韩高清一区在线| 欧美h视频在线观看| 日韩精品视频在线看| 97久久伊人激情网| 成人免费高清在线播放| 欧美日韩国产美| 免费又黄又爽又色的视频| 成人av网址在线观看| 国产精品亚洲二区在线观看| 91亚洲一区| 国产精品区免费视频| 成人美女大片| 久久综合九色九九| 午夜影院免费视频| 欧美日韩国产成人在线91| 放荡的美妇在线播放| 91网上在线视频| 污污动漫在线观看| 在线视频观看日韩| 亚洲精品人成| 国产成人精品福利| 国产精品自产拍在线观| 国产精品探花在线| 在线观看欧美www| 懂色av成人一区二区三区| 欧美在线小视频| 亚洲欧美日本一区| 喷白浆一区二区| 欧美一级爱爱视频| 欧美日韩一二三四| 国产日韩欧美综合精品 | 日本高清成人免费播放| 精品国产视频一区二区三区| 久久亚洲综合色| 绯色av蜜臀vs少妇| 免费在线观看精品| 久久综合色视频| 91精品一区二区三区综合| 蜜桃av噜噜一区二区三| 亚洲福利合集| 91精品国产自产在线| 乡村艳史在线观看| 国内精品久久久久影院优| 日本激情在线观看| 亚洲欧美色婷婷| 手机在线观看毛片| 精品免费国产二区三区| 国产精品传媒在线观看| 精品国产乱码久久久久久天美| 黄色一级片中国| 国产精品乱人伦中文| 少妇精品一区二区三区| 成人三级伦理片| 亚洲综合123| 日本视频免费一区| 欧美日韩在线一| 亚洲一级一区| 国产精品一区二区三区在线观| 欧美一级网址| 国产精品久久久久久久久免费 | 国产精品一区二区婷婷| 欧美综合天天夜夜久久| 午夜精品久久久久久久久久久久久蜜桃 | 国内一区二区三区在线视频| silk一区二区三区精品视频| 92国产精品久久久久首页 | 欧美日韩在线直播| 国产成人av免费| 日本电影亚洲天堂一区| 欧美一区二区三区不卡视频| 欧美性猛交xxxxx免费看| 一级黄色免费网站| 一本大道久久a久久综合| 精品人妻一区二区色欲产成人| 欧美日韩亚洲网| 免费观看一区二区三区毛片| 亚洲高清视频中文字幕| 国产一级在线免费观看| 偷窥国产亚洲免费视频| 1级黄色大片儿| 欧美性猛交xxxx富婆弯腰| 亚洲国产成人精品女人久久| 色婷婷久久一区二区三区麻豆| 销魂美女一区二区| 欧美日韩高清在线播放| 国产又黄又粗又硬| 日韩午夜av电影| www.五月婷| 日韩欧美亚洲国产一区| 国产精品777777| 在线看日韩精品电影| 亚洲天堂男人网| 欧美一区二区女人| 好吊色一区二区三区| 精品伊人久久97| 国产女人在线视频| 久久久精品视频成人| 免费污视频在线| 国产91成人video| 日韩一级二级 | 国产精品无码av在线播放| 国产精品老牛| 不卡的av中文字幕| 国产不卡在线播放| 人妻在线日韩免费视频| 欧美国产精品久久| 1024手机在线视频| 岛国av在线不卡| 伊人亚洲综合网| 欧美成人vr18sexvr| 欧美一区二区三区少妇| 日韩网站免费观看| av第一福利在线导航| 国产精品久久久久77777| a一区二区三区亚洲| 精品国产一区二区三| 日韩欧美三级| 黄色大片中文字幕| 免费人成精品欧美精品| 日韩综合第一页| 亚洲国产精品成人综合色在线婷婷| 久久久久久久久久久久久久久久久| 色哟哟国产精品| 性中国xxx极品hd| 一区二区三区四区视频| 第四色日韩影片| 国产欧美一区二区白浆黑人| 国产精品对白久久久久粗| 亚洲欧洲一区二区| 亚洲小说欧美另类婷婷| 五月激情婷婷在线| 久久综合一区二区| 久久久久久久久久久网| 欧美三级日韩三级| 亚洲色图狠狠干| 欧美人在线视频| 九七影院97影院理论片久久| 韩国成人一区| 午夜欧美精品| 日本黄大片一区二区三区| 91网站最新网址| 精品少妇久久久| 欧美一区二区视频网站| 福利在线午夜| 8x拔播拔播x8国产精品| 日韩三级久久| 国产精品99久久久久久大便| 久久久久91| 国产三级国产精品| 亚洲国产cao| www.日韩在线观看| 免费97视频在线精品国自产拍| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲最大福利视频| 懂色av蜜臀av粉嫩av喷吹| 国产wwwwwww| 99麻豆久久久国产精品免费| 国产肥白大熟妇bbbb视频| 亚洲无人区一区| 国产日韩精品suv| 中文字幕在线亚洲| 午夜欧美巨大性欧美巨大| 久久精品中文字幕一区二区三区 | 亚洲欧美日韩一区在线| 爱搞国产精品| 国产精品美女诱惑| 欧美日本在线| 亚洲av无码久久精品色欲| 日韩理论片一区二区| 在线免费看91| 中文字幕久久亚洲| 国产麻豆一区| 亚洲精品中字| 麻豆免费精品视频| 精品国产大片大片大片| 欧美三级在线视频| av免费在线一区二区三区| 国产成人鲁鲁免费视频a| 免费观看不卡av| 激情网站五月天| 久久久99精品免费观看| 日韩av免费播放| 中文字幕av一区| 国产精品蜜月aⅴ在线| 亚洲资源在线网| 国产主播一区二区三区| 日韩欧美综合视频| 欧美大胆一级视频| 欧美亚洲日本精品| 欧美xxxx黑人又粗又长精品| 天堂在线一区二区| 欧美另类69xxxx| 91精品免费观看| 免费在线观看的电影网站| 九九九九九精品| 日韩精品一二三| 男人的午夜天堂| 日韩三级电影网址| 国产乱码午夜在线视频| 欧美精品尤物在线| 久久成人免费电影| 欧美爱爱小视频| 日韩精品高清视频| 免费高清视频在线一区| 美国av在线播放| 成人少妇影院yyyy| 五月婷婷激情五月| 美日韩精品视频免费看| 欧美三级电影在线| 免费看污污网站| 美女视频一区在线观看| 欧美黄色aaa| 日韩电影网在线| 九九久久国产| 精品一二三四五区| 国产女人18毛片水真多成人如厕 | 久久久久久久久99| 亚洲欧美国产制服动漫| 亚洲国产aⅴ精品一区二区三区| 日本黄大片在线观看| 国产日韩欧美不卡| 亚洲精品视频网| 国产精品视频yy9099| 韩日在线一区| 国产一级淫片久久久片a级| 欧美精品一区男女天堂| 国产亚洲精彩久久| 青春草国产视频| 中文字幕亚洲在|