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

日韩精品视频免费| 亚洲第一av色| 亚洲最大av网站| 精品91久久久| 久久美女视频| 精品动漫一区二区三区在线观看| 超碰网在线观看| 国产超级va在线视频| 97久久精品人人做人人爽| 国产精自产拍久久久久久| 国产精彩视频在线| 91久久电影| 亚洲男人7777| 永久免费未满蜜桃| 日韩一区二区三免费高清在线观看| 亚洲国产一区在线观看| 亚洲一区bb| 三级国产在线观看| 国产成人精品免费视频网站| 国产精品网红直播| 亚洲中文字幕无码爆乳av| 黄色成人91| 久久中文久久字幕| 黄色裸体一级片| 香蕉久久夜色精品国产使用方法| 日韩欧美国产一区二区在线播放 | 亚洲福利电影| 精品国产一区二区三区久久久狼| 日韩人妻无码一区二区三区| 成人盗摄视频| 日韩免费成人网| 国产免费中文字幕| 国产情侣一区二区三区| 日韩欧美国产高清91| 黄色成人在线看| 欧美日韩经典丝袜| 亚洲精品乱码久久久久久黑人| 日韩欧美一区二区三区久久婷婷| 日本不卡视频一区二区| av亚洲精华国产精华精华 | 亚洲成人精品女人久久久| 免费高清成人在线| 国产精品视频导航| 中文字幕一二区| 日韩不卡一二三区| 国产精品福利网站| 日韩乱码一区二区三区| 日韩国产精品久久久久久亚洲| 欧美亚洲午夜视频在线观看| 午夜影院在线看| 亚洲巨乳在线| 97香蕉久久超级碰碰高清版| 可以免费看的av毛片| 国产一区导航| 欧美在线观看一区二区三区| 久久久精品99| 99精品福利视频| 国产69精品久久久久9| 日韩三级小视频| 国产欧美一区二区三区国产幕精品| 午夜精品美女自拍福到在线| 中文字幕在线观看视频网站| 日韩国产精品大片| 91色p视频在线| 国产成人手机在线| 91免费在线视频观看| 欧美日韩另类综合| 91xxx在线观看| 亚洲精品成人悠悠色影视| 日本阿v视频在线观看| 黑人巨大亚洲一区二区久 | 欧美一级裸体视频| 宅男噜噜噜66国产精品免费| 欧美成人精品1314www| 97香蕉碰碰人妻国产欧美| 一区二区三区日本久久久 | 秋霞在线观看一区二区三区| 永久免费在线观看视频| 亚洲蜜桃精久久久久久久| 欧美精品自拍视频| 欧美色网在线| 日韩欧美一级二级| 中文字幕一区二区三区人妻| 97精品视频| 久久久久久91| 国产三级理论片| 国产成人av电影免费在线观看| 久久久久久a亚洲欧洲aⅴ| 美女免费久久| 精品成人国产在线观看男人呻吟| 热久久精品免费视频| 日韩最新av| 国产亚洲精品久久| 国产亚洲精品av| 日本不卡免费在线视频| 国产精品视频500部| 国产福利片在线| 亚洲高清视频中文字幕| 美女网站视频黄色| 在线播放一区二区精品视频| 国产亚洲欧美日韩美女| 免费一级片视频| 久久国产夜色精品鲁鲁99| 国产在线一区二区三区欧美 | 久久久在线视频| 中文字字幕在线中文乱码| www.亚洲国产| a级网站在线观看| 忘忧草在线www成人影院| 精品久久五月天| 美女福利视频网| 视频一区视频二区中文| 国产一区视频观看| caoporn免费在线| 欧美日韩一级黄| 一区二区三区少妇| 欧美午夜久久| 成人网在线免费观看| 风间由美一区| 日韩欧美999| 国产a级黄色片| 欧美激情性爽国产精品17p| 国产日韩精品视频| 丁香在线视频| 色婷婷激情久久| 三上悠亚ssⅰn939无码播放 | 欧美三级理论片| 伊人久久大香线蕉av不卡| 久久久久久欧美| www.天天干.com| 亚洲色图一区二区| 日本77777| 91精品啪在线观看国产18| 国产精品高潮呻吟久久av野狼| 天堂a√在线| 激情成人在线视频| 永久免费未满蜜桃| 伊人精品成人久久综合软件| 国产精品三区www17con| 99re6在线精品视频免费播放| 亚洲成人黄色网| 日本一区二区三区四区五区| 成人免费高清在线观看| 国产精品久久久久久久乖乖| 澳门精品久久国产| 久久久噜噜噜久久中文字免| 国模私拍视频在线| 亚洲成a人片在线不卡一二三区| 日本美女视频网站| 亚洲一区观看| 色综合电影网| 欧美aaaaaa| 欧美xxxx18性欧美| 丰满人妻妇伦又伦精品国产| 亚洲伊人色欲综合网| 成熟妇人a片免费看网站| 亚洲三级影院| 区一区二区三区中文字幕| 日韩三级一区| 欧美劲爆第一页| 特黄aaaaaaaaa真人毛片| 欧美性20hd另类| 摸摸摸bbb毛毛毛片| 久久精品免费观看| 成人在线免费高清视频| 成人在线视频你懂的| 91av在线播放视频| youjizz在线播放| 欧美高清hd18日本| 免费在线一级片| 91视频www| 高清av免费看| 精品av久久久久电影| 欧美在线视频一区二区三区| 国产欧美在线观看免费| 欧美激情亚洲激情| 黄色影院在线播放| 欧美一区二区女人| 日韩黄色在线播放| 亚洲欧美在线aaa| 少妇精品无码一区二区三区| 久久精品二区三区| 天天做天天爱天天高潮| 牛牛视频精品一区二区不卡| 国产精品美女在线观看| 欧美videossex| 这里只有精品丝袜| 开心激情综合网| 欧美日韩国产高清一区二区三区 | 成人日韩欧美| 日韩激情在线视频| 国产精品久久久久久免费播放| 亚洲成a人片在线不卡一二三区| 少妇一级黄色片| 成人午夜av电影| 亚洲 国产 图片| 免费国产自线拍一欧美视频| 大片在线观看网站免费收看| 精品久久久中文字幕| 国产欧美欧洲| 精品视频91| 国产精品午夜一区二区欲梦| 国产在线看片免费视频在线观看| 久久精品中文字幕| 国产精品影院在线| 日韩成人中文字幕| 成人午夜免费福利| 欧美老肥妇做.爰bbww| 成人在线免费看视频| 一区二区在线观看av| 少妇一级黄色片| 久久天堂av综合合色蜜桃网| 精品久久久久一区二区| 国内成+人亚洲+欧美+综合在线 | 国产a精品视频| 三级av免费观看| 久久久久久穴| 中文字幕无码精品亚洲35| 女人色偷偷aa久久天堂| 亚洲午夜激情| 欧美色爱综合| 欧美在线激情| 欧美日韩xxxx| 蜜桃成人免费视频| 天天躁日日躁成人字幕aⅴ| 成人免费在线看片| 久久69av| 91欧美精品午夜性色福利在线| 精品福利在线| 国产精品久久久久久搜索| 范冰冰一级做a爰片久久毛片| 久久久久久中文字幕| 色www永久免费视频首页在线| 久久精品在线视频| 福利视频在线| 欧美成人精品影院| 欧美黑人猛交的在线视频| 久久影视电视剧免费网站| 老司机在线看片网av| 精品国产依人香蕉在线精品| 久久五月精品| 九九热精品在线| 欧洲性视频在线播放| 九九九久久久久久| 99久久精品免费看国产小宝寻花| 久久免费福利视频| 黄色在线网站噜噜噜| 欧美在线不卡区| 校园春色亚洲色图| 国产精品丝袜视频| 99热这里有精品| av资源一区二区| 激情小说一区| 欧美国产综合视频| 日韩精品不卡一区二区| 91免费网站视频| 欧美午夜不卡| 国产视频九色蝌蚪| 丝袜美腿亚洲色图| www,av在线| 成人av在线看| 一色道久久88加勒比一| 国产精品久久久久久户外露出 | 九七电影韩国女主播在线观看| 久久影视电视剧免费网站清宫辞电视| 日韩av官网| 青青草精品毛片| av成人在线网站| 国产欧美日韩亚洲| 国产欧美日韩| 中文字幕人成一区| 亚洲大片在线| 欧美日韩大尺度| 国产美女精品一区二区三区| 亚洲一区二区在线免费| 日本一区免费视频| 青青草原免费观看| 色欧美88888久久久久久影院| 一区二区日韩在线观看| 精品国产一区二区精华| 九九九伊在人线综合| 久久精视频免费在线久久完整在线看| 欧美黑人xx片| 国产精品久久久久久av| 亚洲日本视频在线| 欧美一区少妇| 国内精品久久久久久久影视麻豆| 欧美精品第三页| 国产成人精品免费看| av永久免费观看| 亚洲国产综合91精品麻豆| 国产精品成人久久久| 日韩欧美亚洲国产另类| 国产小视频在线| 九九热精品视频国产| 99蜜月精品久久91| 国产一级精品aaaaa看| 久久国产成人午夜av影院宅| 国产一区二区网| 国产精品1区2区3区在线观看| 亚洲一区二区观看| 亚洲综合一区二区精品导航| 中文亚洲av片在线观看| 日韩成人黄色av| 亚洲91av| 成人国产精品免费视频| 亚洲调教一区| 久久久99精品视频| 日韩精品视频网| 波多野结衣影院| 一区二区三区在线视频免费观看 | 成人免费小视频| www在线观看免费视频| 亚洲国产一区二区a毛片| 国产精品无码白浆高潮| 一本色道久久综合亚洲精品小说| 7777kkk亚洲综合欧美网站| 91精品久久久久久久久青青| 国产精品免费不| 国产一区二区三区精彩视频| 成人国产精品免费观看动漫| 乱h高h女3p含苞待放| 欧美日韩高清一区二区三区| 国产中文字幕在线看| 97av在线播放| 久久亚洲道色| 99久久国产综合精品五月天喷水| 国产麻豆成人精品| 亚洲二区在线播放| 欧美日韩一区久久| 97超碰国产一区二区三区| 日韩免费在线看| 一区二区美女| 国产精品无码av无码| wwwwww.欧美系列| 天天综合网入口| 亚洲国产精品女人久久久| 国产精品蜜臀| 国产伦精品一区二区三区高清| 亚洲一级电影| 五月天激情小说| 欧美日韩人人澡狠狠躁视频| 天天干在线观看| 欧美在线激情视频| 精品中文字幕一区二区三区av| 国产aaa免费视频| 北条麻妃国产九九精品视频| 日本妇女毛茸茸| 精品成人一区二区三区| 中文字幕在线三区| 国产成人精品免费视频大全最热 | 一区二区三区免费在线视频| www.日韩系列| 亚洲网一区二区三区| 久久综合久久网| 26uuu国产电影一区二区| 最近中文字幕在线观看| 日韩最新av在线| 精品一区二区三区亚洲| 国产免费裸体视频| 97se亚洲国产综合自在线不卡| 91在线视频在线观看| 亚洲视频视频在线| 亚洲老司机网| 大陆av在线播放| 久久久久久电影| 国产又粗又猛又色又| 欧美激情第1页| 在线一级成人| 午夜精品久久久久久久99热影院| 一区二区三区精品在线观看| 手机福利在线| 91精品久久久久久久| 最新成人av网站| 极品人妻videosss人妻| 日韩精品中文字幕在线不卡尤物| 欧美aaaaa性bbbbb小妇| 亚洲一区综合| 99久久er热在这里只有精品15| 中文字幕 国产精品| 欧美激情欧美狂野欧美精品| 欧美禁忌电影| 国产精品二区视频| 欧美在线视频不卡| 色黄网站在线观看| 亚洲v国产v在线观看| 粉嫩13p一区二区三区| 少妇无套内谢久久久久| 国自在线精品视频| 色喇叭免费久久综合网| 亚洲av成人无码一二三在线观看| 欧美日韩一区二区在线视频| bl在线肉h视频大尺度| 亚洲成人第一| 99久久国产综合精品女不卡| 国产伦理吴梦梦伦理| 国产91九色视频| 一区在线免费观看| 糖心vlog免费在线观看| 亚洲男人天堂2023|