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

亚洲欧美在线不卡| 在线观看成人免费| 中文字幕手机在线视频| 成人羞羞动漫| 精品国产伦一区二区三区观看方式| 17c丨国产丨精品视频| 性感美女一级片| 久久成人久久鬼色| 午夜精品一区二区三区在线视频| 亚洲精品乱码久久久久久久久久久久| 欧美一区=区三区| 亚洲国产综合色| 日产精品高清视频免费| 国产av无码专区亚洲av麻豆| 亚洲综合精品| 超薄丝袜一区二区| 欧美老熟妇乱大交xxxxx| 成人污污www网站免费丝瓜| 岛国精品视频在线播放| 综合久久国产| 第三区美女视频在线| 国产suv精品一区二区6| 国产精品爽黄69| 中日韩精品视频在线观看| 日韩欧美大片| 国产午夜精品久久久 | 欧美日韩国产另类一区| 99视频在线免费播放| 国产成人无吗| 国产精品国产三级国产aⅴ原创 | 欧美日韩一区二区国产| 尤物yw午夜国产精品视频| 91丨九色丨蝌蚪富婆spa| 国产精品视频1区| 久久午夜免费视频| 欧美精品成人| 不卡伊人av在线播放| 久久成人激情视频| 四虎5151久久欧美毛片| 精品国产一区二区国模嫣然| 欧美激情第一区| 成人日韩av| 91极品视觉盛宴| 色综合久久久久无码专区| 午夜影院免费在线| 亚洲女同ⅹxx女同tv| 亚洲制服中文| 77导航福利在线| 国产精品午夜电影| 亚洲bbw性色大片| 成在在线免费视频| 国产女主播一区| 视频在线观看成人| 最新av网站在线观看| 欧美激情一区不卡| 日韩欧美亚洲区| 9191在线观看| 亚洲丝袜精品丝袜在线| 黄色网络在线观看| 污视频在线免费观看网站| 亚洲一区二区精品视频| 麻豆tv在线播放| 无码小电影在线观看网站免费| 精品国产乱码久久久久酒店| 国产a级一级片| 欧美天堂视频| 精品视频1区2区| 一级黄色在线播放| 中文字幕一区二区三区四区久久 | 色婷婷综合视频| 91麻豆国产福利在线观看| 欧美视频观看一区| 午夜免费福利在线观看| 亚洲日本电影在线| 成人免费在线网| 樱桃视频成人在线观看| 欧美日韩亚洲综合| 少妇熟女视频一区二区三区| 日韩在线影视| 日韩在线国产精品| 国产亚洲精品久久777777| 亚洲专区免费| 国产精品高清免费在线观看| 国产精品久久影视| av在线一区二区| 日韩jizzz| 青草在线视频| 91成人在线免费观看| 日本高清一区二区视频| 大奶在线精品| 亚洲一级免费视频| 全网免费在线播放视频入口 | 精品日韩一区| 欧美成人免费网| 最新中文字幕一区| 狠狠色丁香久久婷婷综合_中| av资源一区二区| 国产毛片av在线| 一区二区三区免费看视频| 国产二区视频在线播放| 精品网站999| 亚洲天堂色网站| 麻豆亚洲av熟女国产一区二 | 国产91久久婷婷一区二区| 一区二区三区亚洲视频| av福利精品导航| 中文字幕久精品免| 香蕉伊大人中文在线观看| 91精品欧美久久久久久动漫 | 九九久久婷婷| 九九精品在线观看| 中日韩av在线| 成人av电影在线播放| 亚洲欧洲一区二区| 色一区二区三区| 日韩欧美一区电影| 亚洲女同二女同志奶水| 国产亚洲毛片| www.成人av| 天天综合视频在线观看| 日韩欧美在线观看视频| 日本人妻一区二区三区| 999视频精品| 国产成人综合av| 西西人体44www大胆无码| 一区二区三区四区国产精品| 天天视频天天爽| 自拍偷拍一区| 欧美一级免费看| 免费观看国产精品| 亚洲一二三四在线| 亚洲成人av免费观看| 欧美高清视频在线观看mv| 国产成人欧美在线观看| 香蕉av在线播放| 精品日韩美女的视频高清| 亚洲麻豆一区二区三区| 影音先锋日韩在线| 91色精品视频在线| 黄av在线播放| 欧美一区二区三级| 97在线观看免费高| 免费观看在线综合色| 亚洲精品电影在线一区| 日韩av电影资源网| 中文字幕视频一区二区在线有码 | 国产成人亚洲精品青草天美| 国产精品一二三在线观看| 国产精品麻豆| 欧美精品在线播放| 丰满人妻一区二区| 亚洲成人动漫精品| 亚洲精品乱码久久久久久久| 一区二区三区导航| 久久大片网站| 婷婷综合六月| 中文字幕日本精品| 夜夜躁狠狠躁日日躁av| 亚洲人成在线播放网站岛国| 97超碰人人看| 亚洲大片av| 欧美日韩国产综合视频在线| 国产精品高清乱码在线观看| 尤物九九久久国产精品的特点 | 精品99999| 激情五月色婷婷| 国产色产综合产在线视频 | 国产不卡一区视频| 欧美日韩成人免费视频| 精品72久久久久中文字幕| 国产精品久久久久久影视| 欧美成人二区| 欧美精品一区二区三区很污很色的| 国产精品16p| 久久精品亚洲国产奇米99| 亚洲欧美日韩一级| 欧美视频日韩| 欧美日韩电影一区二区三区| 99精品国自产在线| 色综合老司机第九色激情 | 久久精品一区二区三区不卡| 中国黄色片一级| 亚洲国产综合在线看不卡| 日本黑人久久| 一区二区三区免费在线看| 国产99久久精品一区二区永久免费| 在线激情小视频| 亚洲国产成人91精品| 超碰在线免费97| 亚洲专区一二三| 国产精品20p| 东方aⅴ免费观看久久av| 99热成人精品热久久66| 亚洲xxx拳头交| 蜜桃网站成人| 亚洲不卡视频| 国产精品视频精品| av电影院在线看| 少妇精69xxtheporn| 色婷婷激情五月| 欧美裸体一区二区三区| 国产成人综合欧美精品久久| 亚洲日本韩国一区| 久久久久久久久福利| youjizz国产精品| 8x8x成人免费视频| 日韩国产欧美视频| 欧美精品卡一卡二| 五月开心六月丁香综合色啪| 欧美日韩一区综合| 91综合精品国产丝袜长腿久久| 国产精品久久久久久久久免费看| 2018av在线| 久久国产精品久久久久久| 成人一区二区不卡免费| 日韩激情av在线免费观看| wwwxxxx国产| 制服丝袜日韩国产| 最近中文字幕免费观看| 欧美日韩在线视频一区| 久久久久成人精品无码| 亚洲天堂福利av| 黄色国产在线播放| 久久精品一区四区| 青青草视频成人| 99久久精品国产导航| 免费国偷自产拍精品视频| 久久精品理论片| 亚洲欧美国产日韩综合| 日精品一区二区三区| 99久久久无码国产精品6| 亚洲激情不卡| 日韩网站在线免费观看| 欧美成人高清| 樱空桃在线播放| 久久久久久免费视频| 亚洲一区二区三区午夜| 欧美另类69xxxxx| 日本中文不卡| 欧洲激情综合| 亚洲国产欧美一区二区三区不卡| 影视先锋久久| 欧美一级二级三级九九九| 欧美猛男男男激情videos| 欧美理论一区二区| 国产一区二区三区天码| 天天人人精品| 91一区二区三区四区| 日本三级福利片| 欧美一区二区三区另类| 成年人网站国产| 亚洲福利免费| 激情五月开心婷婷| 免费看欧美美女黄的网站| www.99r| 日本强好片久久久久久aaa| 岛国毛片在线播放| 韩国毛片一区二区三区| 国产精品久久久久野外| 成人午夜视频免费看| 日韩av无码一区二区三区不卡| 9l国产精品久久久久麻豆| 亚洲激情视频小说| 国产精品麻豆99久久久久久| 久久久久久久麻豆| 亚洲一区二区精品视频| 二区视频在线观看| 欧美日韩综合不卡| 亚洲av无码国产精品永久一区| 精品国产精品网麻豆系列| 日本五码在线| 色系列之999| 天堂va在线| 日本精品一区二区三区在线| www.国产精品| 超碰97在线资源| 日本一区福利在线| 亚洲精品乱码久久久久久蜜桃91| 91精品精品| 奇米精品一区二区三区| 日韩在线一区二区三区| 久久精品国产99久久99久久久| 高清视频一区二区| 免费在线观看污| 亚洲少妇中出一区| 国产免费av一区二区| 欧美在线free| 午夜久久久久久久久久| 精品在线小视频| 黄色网页在线看| 欧美一区二区影院| 在线免费成人| 牛人盗摄一区二区三区视频| 亚洲破处大片| 欧美视频第一区| а√天堂8资源在线| 欧美日韩视频在线第一区| 国产乱淫a∨片免费视频| 精品欧美一区二区久久| 三区在线视频| 久久久极品av| 亚洲色图官网| 91精品视频在线| 伊人久久大香线蕉av不卡| 欧美与动交zoz0z| 性一交一乱一区二区洋洋av| 日本成人xxx| 国产欧美日韩另类视频免费观看| 国产va在线播放| 91国偷自产一区二区三区观看| 精品久久无码中文字幕| 国产一区二区精品丝袜| 男女免费观看在线爽爽爽视频| 日韩美女免费观看| 给我免费播放日韩视频| 精品久久免费观看| 日韩电影免费在线看| 熟妇人妻久久中文字幕| 亚洲精品久久7777| 亚洲一级av毛片| 亚洲午夜精品久久久久久性色| 超碰在线资源| 91精品国产91久久久久青草| 欧洲杯什么时候开赛| 无码播放一区二区三区| 成人手机在线视频| www.99re7| 91精品国产手机| 日本三级在线视频| 国产精品国产自产拍高清av水多 | 宅男在线观看免费高清网站| 国产精品国产亚洲伊人久久 | 中文字幕亚洲欧美一区二区三区 | 四虎亚洲精品| 91影视免费在线观看| 成久久久网站| 国产区二区三区| 中文欧美字幕免费| 一级做a爱片久久毛片| 中文字幕亚洲欧美日韩在线不卡 | 久久综合激情| 三级网站在线免费观看| 色香色香欲天天天影视综合网| 色吊丝在线永久观看最新版本| 欧美一区二区三区艳史| 九色精品国产蝌蚪| 国产福利一区视频| 欧美国产丝袜视频| 在线观看国产精品视频| 精品国产欧美一区二区五十路| 亚洲三级在线| 韩国无码av片在线观看网站| 国产成人一区二区精品非洲| 国产精品6666| 亚洲欧美国产一区二区三区| 日韩欧美看国产| 亚洲高清视频在线观看| 国产在线不卡一卡二卡三卡四卡| 极品美妇后花庭翘臀娇吟小说| 5566中文字幕一区二区电影| 制服丝袜在线播放| 国产一区不卡在线观看| 奶水喷射视频一区| 神马久久久久久久久久久| 欧美欧美午夜aⅴ在线观看| 麻豆免费在线观看| 国产精品国模大尺度私拍| 亚洲一区二区三区四区五区午夜| 插吧插吧综合网| 欧美午夜片在线看| 秋霞在线视频| 欧美午夜欧美| 国产一区二区三区国产| 国产无精乱码一区二区三区| 亚洲免费高清视频| 9999精品视频| 日本少妇高潮喷水视频| 亚洲国产精品成人久久综合一区| 国产婷婷在线视频| 欧美在线一区二区视频| 91精品久久久久久久久久不卡| 美女伦理水蜜桃4| 欧美在线一区二区| 性国产高清在线观看| 欧美午夜精品理论片a级大开眼界| 久久99国产精品久久| 日本少妇xxxx动漫| 中文字幕久精品免费视频| 99香蕉久久| 免费看涩涩视频| 精品久久久国产| www国产在线观看 | 欧美久久影院| 女人又爽又黄免费女仆| 精品久久久久久久久久久久久久久| 性欧美18一19sex性欧美| 国产精品国三级国产av| 国产精品午夜电影| 五月婷婷久久久| 亚洲tv在线观看|