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

一次詭異的線上數(shù)據(jù)庫的死鎖問題排查過程

數(shù)據(jù)庫 MySQL
前幾天,線上發(fā)生了一次數(shù)據(jù)庫死鎖問題,這一問題前前后后排查了比較久的時間,這個過程中自己也對數(shù)據(jù)庫的鎖機制有了更深的理解。本文總結(jié)了這次死鎖排查的全過程,并分析了導(dǎo)致死鎖的原因及解決方案。希望給大家提供一個死鎖的排查及解決思路。

[[262458]]

前幾天,線上發(fā)生了一次數(shù)據(jù)庫死鎖問題,這一問題前前后后排查了比較久的時間,這個過程中自己也對數(shù)據(jù)庫的鎖機制有了更深的理解。本文總結(jié)了這次死鎖排查的全過程,并分析了導(dǎo)致死鎖的原因及解決方案。希望給大家提供一個死鎖的排查及解決思路。

本文涉及到MySQL執(zhí)行引擎、數(shù)據(jù)庫隔離級別、Innodb鎖機制、索引、數(shù)據(jù)庫事務(wù)等多領(lǐng)域知識。前車之鑒,后事之師,希望讀者們都可以有所收獲。

1、現(xiàn)象

某天晚上,同事正在發(fā)布,突然線上大量報警,很多是關(guān)于數(shù)據(jù)庫死鎖的,報警提示信息如下:

  1. {"errorCode":"SYSTEM_ERROR","errorMsg":"nested exception is org.apache.ibatis.exceptions.PersistenceException:  
  2. Error updating database. Cause: ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL]  
  3. Deadlock found when trying to get lock;  
  4. The error occurred while setting parameters\n### SQL:  
  5. update fund_transfer_stream set gmt_modified=now(),state = ? where fund_transfer_order_no = ? and seller_id = ? and state = 'NEW' 

通過報警,我們基本可以定位到發(fā)生死鎖的數(shù)據(jù)庫以及數(shù)據(jù)庫表。先來介紹下本文案例中涉及到的數(shù)據(jù)庫相關(guān)信息。

2、背景情況

我們使用的數(shù)據(jù)庫是Mysql 5.7,引擎是InnoDB,事務(wù)隔離級別是READ-COMMITED。

數(shù)據(jù)庫版本查詢方法:

  1. select version(); 

引擎查詢方法:

  1. show create table fund_transfer_stream; 

建表語句中會顯示存儲引擎信息,形如:ENGINE=InnoDB

事務(wù)隔離級別查詢方法:

  1. select @@tx_isolation; 

事務(wù)隔離級別設(shè)置方法(只對當(dāng)前Session生效):

  1. set session transaction isolation level read committed

PS:注意,如果數(shù)據(jù)庫是分庫的,以上幾條SQL語句需要在單庫上執(zhí)行,不要在邏輯庫執(zhí)行。

發(fā)生死鎖的表結(jié)構(gòu)及索引情況(隱去了部分無關(guān)字段和索引):

  1. CREATE TABLE `fund_transfer_stream` (  
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵'
  3.   `gmt_create` datetime NOT NULL COMMENT '創(chuàng)建時間'
  4.   `gmt_modified` datetime NOT NULL COMMENT '修改時間',  
  5.   `pay_scene_name` varchar(256) NOT NULL COMMENT '支付場景名稱',  
  6.   `pay_scene_version` varchar(256) DEFAULT NULL COMMENT '支付場景版本'
  7.   `identifier` varchar(256) NOT NULL COMMENT '唯一性標(biāo)識'
  8.   `seller_id` varchar(64) NOT NULL COMMENT '賣家Id'
  9.   `state` varchar(64) DEFAULT NULL COMMENT '狀態(tài)', `fund_transfer_order_no` varchar(256)  
  10.   DEFAULT NULL COMMENT '資金平臺返回的狀態(tài)',  
  11.   PRIMARY KEY (`id`),UNIQUE KEY `uk_scene_identifier`  
  12.   (KEY `idx_seller` (`seller_id`), 
  13.   KEY `idx_seller_transNo` (`seller_id`,`fund_transfer_order_no`(20)) 
  14.   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='資金流水'

該數(shù)據(jù)庫共有三個索引,1個聚簇索引(主鍵索引),2個非聚簇索(非主鍵索引)引。

聚簇索引:

  1. PRIMARY KEY (`id`) 

非聚簇索引:

  1. KEY `idx_seller` (`seller_id`),  
  2. KEY `idx_seller_transNo` (`seller_id`,`fund_transfer_order_no`(20)) 

以上兩個索引,其實idx_seller_transNo已經(jīng)覆蓋到了idx_seller,由于歷史原因,因為該表以seller_id分表,所以是先有的idx_seller,后有的idx_seller_transNo

3、死鎖日志

當(dāng)數(shù)據(jù)庫發(fā)生死鎖時,可以通過以下命令獲取死鎖日志: 

  1. show engine innodb status 

發(fā)生死鎖,***時間查看死鎖日志,得到死鎖日志內(nèi)容如下:

  1. Transactions deadlock detected, dumping detailed information. 
  2. 2019-03-19T21:44:23.516263+08:00 5877341 [Note] InnoDB:  
  3.  
  4. *** (1) TRANSACTION
  5. TRANSACTION 173268495, ACTIVE 0 sec fetching rows 
  6. mysql tables in use 1, locked 1 
  7. LOCK WAIT 304 lock struct(s), heap size 41168, 6 row lock(s), undo log entries 1 
  8. MySQL thread id 5877358, OS thread handle 47356539049728, query id 557970181 11.183.244.150 fin_instant_app updating 
  9.  
  10. update `fund_transfer_stream` set `gmt_modified` = NOW(), `state` = 'PROCESSING' where ((`state` = 'NEW'AND (`seller_id` = '38921111'AND (`fund_transfer_order_no` = '99010015000805619031958363857')) 
  11. 2019-03-19T21:44:23.516321+08:00 5877341 [Note] InnoDB:  
  12.  
  13. *** (1) HOLDS THE LOCK(S): 
  14. RECORD LOCKS space id 173 page no 13726 n bits 248 index idx_seller_transNo of table `xxx`.`fund_transfer_stream` trx id 173268495 lock_mode X locks rec but not gap 
  15. Record lock, heap no 168 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 
  16.  
  17. 2019-03-19T21:44:23.516565+08:00 5877341 [Note] InnoDB:  
  18.  
  19. *** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
  20. RECORD LOCKS space id 173 page no 12416 n bits 128 index PRIMARY of table `xxx`.`fund_transfer_stream` trx id 173268495 lock_mode X locks rec but not gap waiting 
  21. Record lock, heap no 56 PHYSICAL RECORD: n_fields 17; compact format; info bits 0 
  22. 2019-03-19T21:44:23.517793+08:00 5877341 [Note] InnoDB:  
  23.  
  24. *** (2) TRANSACTION
  25. TRANSACTION 173268500, ACTIVE 0 sec fetching rows, thread declared inside InnoDB 81 
  26. mysql tables in use 1, locked 1 
  27. 302 lock struct(s), heap size 41168, 2 row lock(s), undo log entries 1 
  28. MySQL thread id 5877341, OS thread handle 47362313119488, query id 557970189 11.131.81.107 fin_instant_app updating 
  29.  
  30. update `fund_transfer_stream_0056` set `gmt_modified` = NOW(), `state` = 'PROCESSING' where ((`state` = 'NEW'AND (`seller_id` = '38921111'AND (`fund_transfer_order_no` = '99010015000805619031957477256')) 
  31. 2019-03-19T21:44:23.517855+08:00 5877341 [Note] InnoDB:  
  32.  
  33. *** (2) HOLDS THE LOCK(S): 
  34. RECORD LOCKS space id 173 page no 12416 n bits 128 index PRIMARY of table `fin_instant_0003`.`fund_transfer_stream_0056` trx id 173268500 lock_mode X locks rec but not gap 
  35. Record lock, heap no 56 PHYSICAL RECORD: n_fields 17; compact format; info bits 0 
  36.  
  37. 2019-03-19T21:44:23.519053+08:00 5877341 [Note] InnoDB:  
  38.  
  39. *** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
  40. RECORD LOCKS space id 173 page no 13726 n bits 248 index idx_seller_transNo of table `fin_instant_0003`.`fund_transfer_stream_0056` trx id 173268500 lock_mode X locks rec but not gap waiting 
  41. Record lock, heap no 168 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 
  42.  
  43. 2019-03-19T21:44:23.519297+08:00 5877341 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (2) 

簡單解讀一下死鎖日志,可以得到以下信息:

    1.導(dǎo)致死鎖的兩條SQL語句分別是: 

  1. update `fund_transfer_stream_0056`  
  2. set `gmt_modified` = NOW(), `state` = 'PROCESSING'  
  3. where ((`state` = 'NEW'AND (`seller_id` = '38921111'AND (`fund_transfer_order_no` = '99010015000805619031957477256')) 

    和 

  1. update `fund_transfer_stream_0056`  
  2. set `gmt_modified` = NOW(), `state` = 'PROCESSING'  
  3. where ((`state` = 'NEW'AND (`seller_id` = '38921111'AND (`fund_transfer_order_no` = '99010015000805619031958363857')) 

    2.事務(wù)1,持有索引idx_seller_transNo的鎖,在等待獲取PRIMARY的鎖。

    3.事務(wù)2,持有PRIMARY的鎖,在等待獲取idx_seller_transNo的鎖。

    4.因事務(wù)1和事務(wù)2之間發(fā)生循環(huán)等待,故發(fā)生死鎖。

    5.事務(wù)1和事務(wù)2當(dāng)前持有的鎖均為:lock_mode X locks rec but not gap

兩個事務(wù)對記錄加的都是X 鎖,No Gap鎖,即對當(dāng)行記錄加鎖(Record Lock),并未加間隙鎖。

X鎖:排他鎖、又稱寫鎖。若事務(wù)T對數(shù)據(jù)對象A加上X鎖,事務(wù)T可以讀A也可以修改A,其他事務(wù)不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。

與之對應(yīng)的是S鎖:共享鎖,又稱讀鎖,若事務(wù)T對數(shù)據(jù)對象A加上S鎖,則事務(wù)T可以讀A但不能修改A,其他事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

Gap Lock:間隙鎖,鎖定一個范圍,但不包括記錄本身。GAP鎖的目的,是為了防止同一事務(wù)的兩次當(dāng)前讀,出現(xiàn)幻讀的情況。

Next-Key Lock:1+2,鎖定一個范圍,并且鎖定記錄本身。對于行的查詢,都是采用該方法,主要目的是解決幻讀的問題。

4、問題排查

根據(jù)我們目前已知的數(shù)據(jù)庫相關(guān)信息,以及死鎖的日志,我們基本可以做一些簡單的判定。

首先,此次死鎖一定是和Gap鎖以及Next-Key Lock沒有關(guān)系的。因為我們的數(shù)據(jù)庫隔離級別是RC(READ-COMMITED)的,這種隔離級別是不會添加Gap鎖的。前面的死鎖日志也提到這一點。

然后,就要翻代碼了,看看我們的代碼中事務(wù)到底是怎么做的。核心代碼及SQL如下:

  1. @Transactional(rollbackFor = Exception.class) 
  2. public int doProcessing(String sellerId, Long id, String fundTransferOrderNo) { 
  3.     fundTreansferStreamDAO.updateFundStreamId(sellerId, id, fundTransferOrderNo); 
  4.     return fundTreansferStreamDAO.updateStatus(sellerId, fundTransferOrderNo,"PROCESSING"); 

該代碼的目的是先后修改同一條記錄的兩個不同字段,updateFundStreamId SQL:

  1. update fund_transfer_stream 
  2.         set gmt_modified=now(),fund_transfer_order_no = #{fundTransferOrderNo} 
  3.         where id = #{id} and seller_id = #{sellerId} 

updateStatus SQL:

  1. update fund_transfer_stream 
  2.     set gmt_modified=now(),state = #{state} 
  3.     where fund_transfer_order_no = #{fundTransferOrderNo} and seller_id = #{sellerId} 
  4.     and state = 'NEW' 

可以看到,我們的同一個事務(wù)中執(zhí)行了兩條Update語句,這里分別查看下兩條SQL的執(zhí)行計劃: 

 

 

 

updateFundStreamId執(zhí)行的時候使用到的是PRIMARY索引。 

 

 

 

updateStatus執(zhí)行的時候使用到的是idx_seller_transNo索引。

通過執(zhí)行計劃,我們發(fā)現(xiàn)updateStatus其實是有兩個索引可以用的,執(zhí)行的時候真正使用的是idx_seller_transNo索引。這是因為MySQL查詢優(yōu)化器是基于代價(cost-based)的查詢方式。因此,在查詢過程中,最重要的一部分是根據(jù)查詢的SQL語句,依據(jù)多種索引,計算查詢需要的代價,從而選擇***的索引方式生成查詢計劃。

我們查詢執(zhí)行計劃是在死鎖發(fā)生之后做的,事后查詢的執(zhí)行計劃和發(fā)生死鎖那一刻的索引使用情況并不一定相同的。但是,我們結(jié)合死鎖日志,也可以定位到以上兩條SQL語句執(zhí)行的時候使用到的索引。即updateFundStreamId執(zhí)行的時候使用到的是PRIMARY索引,updateStatus執(zhí)行的時候使用到的是idx_seller_transNo索引。

有了以上這些已知信息,我們就可以開始排查死鎖原因及其背后的原理了。通過分析死鎖日志,再結(jié)合我們的代碼以及數(shù)據(jù)庫建表語句,我們發(fā)現(xiàn)主要問題出在我們的idx_seller_transNo索引上面: 

  1. KEY `idx_seller_transNo` (`seller_id`,`fund_transfer_order_no`(20)) 

索引創(chuàng)建語句中,我們使用了前綴索引,為了節(jié)約索引空間,提高索引效率,我們只選擇了fund_transfer_order_no字段的前20位作為索引值。

因為fund_transfer_order_no只是普通索引,而非唯一性索引。又因為在一種特殊情況下,會有同一個用戶的兩個fund_transfer_order_no的前20位相同,這就導(dǎo)致兩條不同的記錄的索引值一樣(因為seller_id 和fund_transfer_order_no(20)都相同 )。

就如本文中的例子,發(fā)生死鎖的兩條記錄的fund_transfer_order_no字段的值:99010015000805619031958363857和99010015000805619031957477256 這兩個就是前20位相同的。 

 

 

 

那么為什么fund_transfer_order_no的前20位相同會導(dǎo)致死鎖呢?

5、加鎖原理

我們就拿本次的案例來看一下MySql數(shù)據(jù)庫加鎖的原理是怎樣的,本文的死鎖背后又發(fā)生了什么。

我們在數(shù)據(jù)庫上模擬死鎖場景,執(zhí)行順序如下: 

 

 

 

我們知道,在MySQL中,行級鎖并不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,MySQL就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關(guān)的主鍵索引。

主鍵索引的葉子節(jié)點存的是整行數(shù)據(jù)。在InnoDB中,主鍵索引也被稱為聚簇索引(clustered index)

非主鍵索引的葉子節(jié)點的內(nèi)容是主鍵的值,在InnoDB中,非主鍵索引也被稱為非聚簇索引(secondary index)

所以,本文的示例中涉及到的索引結(jié)構(gòu)(索引是B+樹,簡化成表格了)如圖: 

 

 

死鎖的發(fā)生與否,并不在于事務(wù)中有多少條SQL語句,死鎖的關(guān)鍵在于:兩個(或以上)的Session加鎖的順序不一致。那么接下來就看下上面的例子中兩個事務(wù)的加鎖順序是怎樣的: 

 

 

 

下圖是分解圖,每一條SQL執(zhí)行的時候加鎖情況: 

 

 

 

結(jié)合以上兩張圖,我們發(fā)現(xiàn)了導(dǎo)致死鎖的原因:

事務(wù)1執(zhí)行update1占用PRIMARY = 1的鎖 ——> 事務(wù)2執(zhí)行update1 占有PRIMARY = 2的鎖;

事務(wù)1執(zhí)行update2占有idx_seller_transNo = (3111095611,99010015000805619031)的鎖,嘗試占有PRIMARY = 2鎖失敗(阻塞);

事務(wù)2執(zhí)行update2嘗試占有idx_seller_transNo = (3111095611,99010015000805619031)的鎖失敗(死鎖);

事務(wù)在以非主鍵索引為where條件進(jìn)行Update的時候,會先對該非主鍵索引加鎖,然后再查詢該非主鍵索引對應(yīng)的主鍵索引都有哪些,再對這些主鍵索引進(jìn)行加鎖。)

6、解決方法

至此,我們分析清楚了導(dǎo)致死鎖的根本原理以及其背后的原理。那么這個問題解決起來就不難了。

可以從兩方面入手,分別是修改索引和修改代碼(包含SQL語句)。

修改索引:只要我們把前綴索引 idx_seller_transNo中fund_transfer_order_no的前綴長度修改下就可以了。比如改成50。即可避免死鎖。

但是,改了idx_seller_transNo的前綴長度后,可以解決死鎖的前提條件是update語句真正執(zhí)行的時候,會用到fund_transfer_order_no索引。如果MySQL查詢優(yōu)化器在代價分析之后,決定使用索引 KEY idx_seller(seller_id),那么還是會存在死鎖問題。原理和本文類似。

所以,根本解決辦法就是改代碼:

  • 所有update都通過主鍵ID進(jìn)行。
  • 在同一個事務(wù)中,避免出現(xiàn)多條update語句修改同一條記錄。

7、總結(jié)與思考

在死鎖發(fā)生之后的一周內(nèi),我?guī)缀趺刻於紩榭昭芯恳粫?,問題早早的就定位到了,修改方案也有了,但是其中原理一直沒搞清楚。

前前后后做過很多中種推斷及假設(shè),又都被自己一次次推翻。最終還是要靠實踐來驗證自己的想法。于是我自己在本地安裝了數(shù)據(jù)庫,實戰(zhàn)的做了些測試,并實時查看數(shù)據(jù)庫鎖情況。show engine innodb status ;可以查看鎖情況。最終才搞清楚原理。

簡單說幾點思考:

  1. 遇到問題,不要猜!!!親手復(fù)現(xiàn)下問題,然后再來分析。
  2. 不要忽略上下文!!!我剛開始就是只關(guān)注死鎖日志,一直忽略了代碼中的事務(wù)其實還執(zhí)行了另外一條SQL語句(updateFundStreamId)。
  3. 理論知識再充足,關(guān)鍵時刻不一定想的起來!!!
  4. 坑都是自己埋的!!!

參考資料:

  • http://hedengcheng.com/?p=771
  • https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
  • 《MySql實戰(zhàn)45講》
  • https://www.hollischuang.com/archives/914 
責(zé)任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2021-11-23 21:21:07

線上排查服務(wù)

2018-07-20 08:44:21

Redis內(nèi)存排查

2017-12-19 14:00:16

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

2024-06-24 09:29:15

2019-06-19 08:59:52

數(shù)據(jù)庫死鎖堆棧

2018-11-13 10:44:23

Linux服務(wù)器雙網(wǎng)卡網(wǎng)絡(luò)

2019-03-15 16:20:45

MySQL死鎖排查命令

2019-06-10 15:20:18

2023-01-04 18:32:31

線上服務(wù)代碼

2022-07-13 08:31:18

React問題排查

2021-05-13 08:51:20

GC問題排查

2024-03-18 09:10:00

死鎖日志binlog

2020-01-18 14:11:13

數(shù)據(jù)庫線程技術(shù)

2022-11-03 16:10:29

groovyfullGC

2019-09-10 10:31:10

JVM排查解決

2023-04-06 07:53:56

Redis連接問題K8s

2023-10-11 22:24:00

DubboRedis服務(wù)器

2020-11-16 07:19:17

線上函數(shù)性能

2021-12-12 18:12:13

Hbase線上問題

2021-03-31 13:45:59

CPU運維命令
點贊
收藏

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

久草在线免费福利资源| 免费中文字幕在线观看| 吞精囗交69激情欧美| 久久九九久久九九| 成人久久一区二区| 日本一级淫片免费放| 五月天亚洲一区| 欧美视频日韩视频在线观看| 91成人在线视频观看| 六月婷婷综合网| 噜噜爱69成人精品| 久久色精品视频| 手机在线成人av| 国产成人免费精品| 亚洲大尺度视频在线观看| 欧美日韩综合网| 国产免费久久久| 亚洲欧美视频| 久久综合久久88| 最新中文字幕视频| 日本少妇精品亚洲第一区| 欧美色另类天堂2015| 一级二级三级欧美| 欧美套图亚洲一区| 高清国产一区二区三区| 国产盗摄xxxx视频xxx69| 国产一级生活片| 日韩av久操| 精品亚洲一区二区三区| 色欲无码人妻久久精品| 黄色综合网址| 亚洲成人777| 手机在线视频你懂的| 久久视频www| 成人网页在线观看| 成人国产精品久久久| 亚洲天堂一区在线| 亚洲高清激情| 美女撒尿一区二区三区| 亚洲色图 激情小说| 日韩黄色网络| 亚洲大胆人体在线| av地址在线观看| 婷婷久久免费视频| 欧美三级蜜桃2在线观看| 日本免费黄视频| av在线加勒比| 亚洲v日本v欧美v久久精品| 伊人情人网综合| 97在线观看免费观看高清| 99久久精品国产网站| 电影午夜精品一区二区三区| 99在线小视频| 国产一区二区伦理片| 成人精品久久久| 中文字幕精品无码亚| 天堂在线亚洲视频| 国产91精品高潮白浆喷水| 国产手机在线视频| 西西人体一区二区| 日本高清久久天堂| 色老头在线视频| 日韩黄色免费电影| 国产精品高精视频免费| 一级一片免费看| 久久精品中文| 国产精品美女主播在线观看纯欲| 国产一级片一区二区| 免费在线成人网| 国产日本欧美一区| 国产精品伦理一区| 国产不卡在线播放| 国产高清自拍一区| 四虎影视2018在线播放alocalhost| 91色婷婷久久久久合中文| 欧美lavv| 亚洲1卡2卡3卡4卡乱码精品| 最新国产精品久久精品| 色综合视频网站| 日本裸体美女视频| 一区二区三区在线电影| 欧美第一页在线| 三级黄色在线视频| 视频一区二区中文字幕| 国产日本欧美一区二区三区在线 | 狠狠色狠狠色综合婷婷tag| 亚洲区中文字幕| 国产jizz18女人高潮| 在线观看日韩| 欧美一级淫片aaaaaaa视频| 国产免费a视频| 国产自产视频一区二区三区| 国产精品久久精品视| 国产中文字幕在线视频| 亚洲色图欧美激情| 精品国产免费av| 九九热这里有精品| 亚洲成人亚洲激情| 超碰人人干人人| 精品成人免费| 国产在线观看一区二区三区| 欧美视频一二区| 国产精品少妇自拍| 99在线精品免费视频| 不卡亚洲精品| 亚洲精品国产综合区久久久久久久| 九色porny自拍视频| 亚洲精品成人| 日韩av不卡电影| 性一交一乱一色一视频麻豆| 日本一区二区三区免费乱视频| 欧美精品一区二区性色a+v| 一区一区三区| 日韩欧美一区二区三区在线| jizz中文字幕| 亚洲精品美女| 92国产精品视频| 九色在线免费| 亚洲444eee在线观看| 在线观看国产中文字幕| 午夜精品福利影院| 欧美国产精品va在线观看| 国产成人av免费| av中文字幕不卡| 一级黄色录像免费看| 成人午夜精品| 亚洲国产精品国自产拍av秋霞| 精品国产视频在线观看| 视频一区在线播放| 久久综合九九| 精品精品导航| 日韩一级片在线播放| 久久久久久九九九九九| 亚洲经典三级| 成人欧美一区二区三区在线观看| 欧美精品日韩少妇| 欧美日韩视频在线第一区 | 国产福利资源一区| 精品自在线视频| 一级特黄aaa| 欧美国产精品一区二区| 粗暴91大变态调教| 国产不卡一二三区| 国产成人精品久久| 三级在线视频| 一本大道久久a久久精二百| 午夜视频在线观看国产| 欧美亚韩一区| 成人黄视频免费| 亚洲91av| 精品国产免费一区二区三区四区| 欧产日产国产v| 国产成人在线电影| 欧美日韩中文字幕在线播放| 日韩在线电影| 久久高清视频免费| 亚洲第一第二区| 亚洲一区二区视频| 无码人妻aⅴ一区二区三区玉蒲团| 欧美日韩国产一区精品一区| 成人在线播放av| 国产人成网在线播放va免费| 91精品国产入口| 欧美丰满艳妇bbwbbw| 国产成人高清视频| 男女激情免费视频| 欧美精品密入口播放| 57pao精品| av免费观看一区二区| 在线精品亚洲一区二区不卡| 国产日韩精品中文字无码| 久久99久久99小草精品免视看| 中文精品视频一区二区在线观看| 精品国产不卡一区二区| 欧美国产日本在线| 手机福利小视频在线播放| 91久久精品午夜一区二区| 91在线无精精品白丝| 久久91精品国产91久久小草| 一区二区精品国产| av综合网址| 日本人成精品视频在线| 日本综合在线| 日韩精品一区二区三区在线| 亚洲欧美在线视频免费| 久久精品免费在线观看| 久久婷婷国产91天堂综合精品| 成人免费在线观看av| 99爱精品视频| 裤袜国产欧美精品一区| 色婷婷成人综合| 日本精品一区二区在线观看| 欧美色图一区二区三区| 国产日韩欧美在线观看视频| 99r国产精品| 麻豆三级在线观看| 91久久亚洲| 亚洲欧美综合一区| 精品国产18久久久久久洗澡| 国产精品视频免费在线观看| 精品众筹模特私拍视频| 亚洲欧洲美洲在线综合| 亚洲AV无码精品国产| 色婷婷亚洲精品| 久久精品99国产精| 亚洲国产经典视频| 日韩av手机在线播放| 国产一区二区三区四区五区美女| 日韩中文字幕在线免费| 一区二区免费不卡在线| 免费不卡亚洲欧美| 日本少妇精品亚洲第一区| 清纯唯美日韩制服另类| 免费影视亚洲| 色av中文字幕一区| 日本福利片在线| 欧美电影免费提供在线观看| 久久久久久亚洲av无码专区| 亚洲成人免费在线观看| 午夜成人亚洲理伦片在线观看| 91在线porny国产在线看| 中文字幕第10页| 日本不卡视频在线观看| 国产不卡一区二区视频| 一区二区三区在线观看免费| 日韩精品一线二线三线| 日韩av午夜| 99电影网电视剧在线观看| 日本成人一区二区| 国产欧美一区二区色老头| 欧美一级大片在线免费观看| 色呦呦呦在线观看| 日韩在线精品一区| 黄色av免费在线观看| 亚洲成人网久久久| 国内精品久久久久久久久久| 在线观看三级视频欧美| 亚洲 欧美 日韩 综合| 亚洲国产综合色| 欧美色图亚洲天堂| 综合自拍亚洲综合图不卡区| 亚洲毛片亚洲毛片亚洲毛片| 久久久久国产精品麻豆ai换脸 | 国产91精品一区| 亚洲成人在线观看视频| 欧美片一区二区| 亚洲激情一二三区| 国产精品白嫩白嫩大学美女| 自拍偷拍亚洲激情| 唐朝av高清盛宴| 亚洲精品菠萝久久久久久久| 18岁成人毛片| 亚洲自拍偷拍图区| 国产乡下妇女做爰视频| 亚洲高清视频中文字幕| 久久久久久欧美精品se一二三四| 亚洲激情在线激情| 久久久久久久久久久网| 亚洲狠狠爱一区二区三区| 国产精品6666| 欧美小视频在线| 久操视频在线免费观看| 在线观看成人免费视频| 中文字幕一区二区三区免费看| 欧美性猛片xxxx免费看久爱| 91theporn国产在线观看| 欧美区一区二区三区| 国产乱淫片视频| 精品卡一卡二卡三卡四在线| 欧性猛交ⅹxxx乱大交| 日韩电影免费在线观看中文字幕 | 色悠悠久久88| 99福利在线| 97精品国产97久久久久久免费| av男人的天堂在线观看| 国产999在线观看| 日本一区二区电影| 91久久精品美女高潮| 香蕉成人app| 欧美精品一区二区视频| 成人一区二区| 成人一区二区av| 国产日韩欧美一区二区三区在线观看 | 亚洲大胆人体视频| 人妻妺妺窝人体色www聚色窝| 亚洲第一国产精品| 国产高清免费av在线| 深夜福利日韩在线看| 91亚洲天堂| 国产97免费视| 免费一区二区三区在线视频| 好吊色欧美一区二区三区| 成人免费在线播放| 日韩精品一区二区免费| 丝袜脚交一区二区| 台湾佬美性中文| 久久精品一区四区| 一区二区视频免费看| 欧美午夜精品久久久久久久| 亚洲网站免费观看| 日韩精品极品在线观看| 日本中文字幕在线视频| 国模私拍视频一区| www 久久久| 日本公妇乱淫免费视频一区三区| 欧美91大片| 天堂网在线免费观看| aaa国产一区| 开心激情五月网| 欧美日韩免费区域视频在线观看| 91成人国产综合久久精品| 日韩电视剧免费观看网站| 超碰在线无需免费| 国产精品第七十二页| 国产 日韩 欧美 综合 一区| 一区二区三区免费看| 欧美在线综合| 亚洲一区二区在线免费| 亚洲青青青在线视频| 免费黄色一级大片| 亚洲国产精品99| 性xxxfreexxxx性欧美| 国产欧美日韩中文字幕| 神马香蕉久久| av高清在线免费观看| 国产一区二区在线免费观看| 亚洲精品国产一区黑色丝袜 | 色网站在线播放| 日韩一区二区电影在线| av在线天堂播放| 日产精品99久久久久久| 欧美福利在线播放网址导航| 欧美日韩中文字幕在线播放| 男女男精品网站| 97在线观看免费视频| 黑人与娇小精品av专区| 国精品人妻无码一区二区三区喝尿| 久久久av电影| 色综合久久久| 伊人久久大香线蕉精品| 日本欧美在线看| 少妇av片在线观看| 日本韩国欧美三级| 黄网站在线观看| 日韩av免费一区| 最新国产一区| 欧美日韩国产精品激情在线播放| 97国产一区二区| 欧美一级视频免费观看| 亚洲精品第一国产综合精品| 成人国产电影在线观看| 国产欧美日韩一区| 国产亚洲在线| 爱爱的免费视频| 色偷偷久久人人79超碰人人澡| 青青草手机在线| 日韩av片永久免费网站| 久久综合欧美| 性欧美videossex精品| 欧美激情一区二区在线| 一二区在线观看| 久久精品亚洲一区| 日韩视频1区| 拔插拔插海外华人免费| 99久久久久久| 国产精品久久久久久人| 最近2019中文字幕第三页视频| 欧美性www| 欧美日韩午夜爽爽| 成人福利视频网站| 国产亚洲欧美在线精品| 一区二区三区四区视频| 亚洲三级电影| 日韩一级性生活片| 91麻豆国产福利精品| 亚洲综合免费视频| 九九热99久久久国产盗摄| 动漫3d精品一区二区三区乱码| 青青草原成人网| 国产日产精品一区| 国产男女无套免费网站| 久久久亚洲成人| 精品国产不卡| 午夜精品免费看| 午夜精品福利在线| 搞黄视频免费在线观看| **亚洲第一综合导航网站| 香蕉成人久久| 欧美激情精品久久久久久免费| 日韩视频在线一区二区| 在线人成日本视频| 中文字幕av导航| 99久久婷婷国产| 91精品视频免费在线观看 | 色狠狠久久av五月综合| 国产精品资源在线观看| 伊人手机在线视频| 久久久精品欧美| 九九综合在线| 风韵丰满熟妇啪啪区老熟熟女|