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

慎用,Mybatis-Plus這個方法可能導致死鎖

開發 前端
雖然Mybatis-Plus提供的這個方法可能會造成死鎖,但是依然不可否認它是一款非常優秀的增強框架,其提供的lambda寫法在日常工作中極大的提高了我們的開發效率,所以凡事都有兩面性,我們應該秉承辯證的態度,熟悉的方法嘗試用,陌生的方法謹慎用。

1 場景還原

1.1 版本信息

MySQL版本:5.6.36-82.1-log 
Mybatis-Plus的starter版本:3.3.2
存儲引擎:InnoDB

1.2 死鎖現象

A同學在生產環境使用了Mybatis-Plus提供的 com.baomidou.mybatisplus.extension.service.IService#saveOrUpdate(T, com.baomidou.mybatisplus.core.conditions.Wrapper) 方法(以下簡稱B方法),并發場景下,數據庫報了如下錯誤

圖片


2 為什么是間隙鎖死鎖?

如上圖示,數據庫報了死鎖,那死鎖場景千萬種,為什么確定B方法是由于間隙鎖導致的死鎖?

2.1 什么是死鎖?

兩個事務互相等待對方持有的鎖,導致互相阻塞,從而導致死鎖。

2.2 什么是間隙鎖?

  • 間隙鎖是MySQL行鎖的一種,與Record lock不同的是間隙鎖鎖定的是一個間隙。
  • 鎖定規則如下:

MySQL會向左找第一個比當前索引值小的值,向右找第一個比當前索引值大 的值(沒有則為正無窮),將此區間鎖住,從而阻止其他事務在此區間插入數據。

2.3 MySQL為什么要引入間隙鎖?

與Record lock組合成Next-key lock,在可重復讀這種隔離級別下一起工作避免幻讀。

2.4 間隙鎖死鎖分析

理論上一款開源的框架,經過了多年打磨,提供的方法不應該造成如此嚴重的錯誤,但理論僅僅是理論上,事實就是發生了死鎖,于是我們開始了一輪深度排查。首先我們從這個方法的源碼入手,源碼如下:

default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
        return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
    }

從源碼上看此方法就沒有按套路出牌,正常邏輯應該是首先執行查詢,存在則修改,不存在則新增,但此方法上來就執行了修改。我們就猜想是不是MySQL在修改時增加了什么鎖導致了死鎖,于是我們找到了DBA獲取了最新的死鎖日志,即執行show engine innodb status,我們發現了兩項關鍵信息如下:

*** (1) TRANSACTION:
...省略日志
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 347 n bits 80 index `PRIMARY` of table `database_name`.`table_name` trx id 71C lock_mode X locks gap before rec insert intention waiting
  
*** (2) TRANSACTION:
...省略日志
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 347 n bits 80 index `PRIMARY` of table `database_name`.`table_name` trx id 71D lock_mode X locks gap before rec insert intention waiting

簡單翻譯一下,就是事務一在獲取插入意向鎖時,需要等待間隙鎖(事務二添加)釋放,同時事務二在獲取插入意向鎖時,也在等待間隙鎖釋放(事務一添加),(本文不討論MySQL在修改與插入時添加的鎖,我們把修改時添加間隙鎖,插入時獲取插入意向鎖為已知條件)那我們回到B方法,并發場景下,是不是就很大幾率會滿足事務一和事務二相互等待對方持有的間隙鎖,從而導致死鎖。

現在我們理論有了,我們現在用真實數據來驗證此場景。

2.5 驗證間隙鎖死鎖

  • 準備如下表結構(以下簡稱驗證一)
create table t_gap_lock(
id int auto_increment primary key comment '主鍵ID',
name varchar(64) not null comment '名稱',
age int not null comment '年齡'
) comment '間隙鎖測試表';
  • 準備如下表數據
mysql> select * from t_gap_lock;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | 張三 |  18 |
|  5 | 李四 |  19 |
|  6 | 王五 |  20 |
|  9 | 趙六 |  21 |
| 12 | 孫七 |  22 |
+----+------+-----+
  • 我們開啟事務一,并執行如下語句,注意這個時候我們還沒有提交事務
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 4;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
  • 同時我們開啟事務二,并執行如下語句,事務二我們同樣不提交事務
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 7;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
  • 接下來我們在事務一中執行如下語句
mysql> insert into t_gap_lock(id, name, age) value (7,'間隙鎖7',27);
  • 我們會發現事務一被阻塞了,然后我們執行以下語句看下當前正在鎖的事務。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS \G;
*************************** 1. row ***************************
    lock_id: 749:0:360:3
lock_trx_id: 749
  lock_mode: X,GAP
  lock_type: RECORD
 lock_table: `test`.`t_gap_lock`
 lock_index: `PRIMARY`
 lock_space: 0
  lock_page: 360
   lock_rec: 3
  lock_data: 5
*************************** 2. row ***************************
    lock_id: 74A:0:360:3
lock_trx_id: 74A
  lock_mode: X,GAP
  lock_type: RECORD
 lock_table: `test`.`t_gap_lock`
 lock_index: `PRIMARY`
 lock_space: 0
  lock_page: 360
   lock_rec: 3
  lock_data: 5
2 rows in set (0.00 sec)

根據lock_type和lock_mode我們可以很清晰的看到鎖類型是行鎖,鎖模式是間隙鎖。

  • 與此同時我們在事務二中執行如下語句
insert into t_gap_lock(id, name, age) value (4,'間隙鎖4',24);
  • 一執行以上語句,數據庫就立馬報了死鎖,并且回滾了事務二(可以在死鎖日志中看到*** WE ROLL BACK TRANSACTION (2))
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

到這里,細心的同學就會發現,誒,你這上面故意造了一個間隙,并且讓兩個事務分別在對方的間隙中插入數據,太刻意了,生產環境基本上不會有這種場景,是的,生產環境怎么會有這種場景呢,上面的數據只是為了讓大家直觀的看到間隙鎖的死鎖過程,接下來那我們再來一組數據,我們簡稱驗證二。

  • 我們還是以驗證一的表結構與數據,我們來執行這樣一個操作。首先我們開始開啟事務一并且執行如下操作,依然不提交事務
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 4;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
  • 同時我們開啟事務二,執行與事務一一樣的操作,我們會驚奇的發現,竟然也成功了。
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 4;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
  • 于是乎我們在事務一執行如下操作,我們又驚奇的發現事務一被阻塞了。
insert into t_gap_lock(id, name, age) value (4,'間隙鎖4',24);
  • 在事務一被阻塞的同時,我們在事務二執行同樣的語句,我們發現數據庫立馬就報了死鎖。
insert into t_gap_lock(id, name, age) value (4,'間隙鎖4',24);    
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

驗證二完整的復現了線上死鎖的過程,也就是事務一先執行了更新語句,事務二在同一時刻也執行了更新語句,然后事務一發現沒有更新到就去執行主鍵查詢語句,發現確實沒有,所以執行了插入語句,但是插入要先獲取插入意向鎖,在獲取插入意向鎖的時候發現這個間隙已經被事務二加鎖了,所以事務一開始等待事務二釋放間隙鎖,同理,事務二也執行上述操作,最終導致事務一與事務二互相等待對方釋放間隙鎖,最終導致死鎖。

驗證二還說明了一個問題,就是間隙鎖加鎖是非互斥的,也就是事務一對間隙A加鎖后,事務二依然可以給間隙A加鎖。

3 如何解決?

3.1 關閉間隙鎖(不推薦)

  • 降低隔離級別,例如降為提交讀。
  • 直接修改my.cnf,將開關,innodb_locks_unsafe_for_binlog改為1,默認為0即開啟

PS:以上方法僅適用于當前業務場景確實不關心幻讀的問題。

3.2 自定義saveOrUpdate方法(推薦)

建議自己編寫一個saveOrUpdate方法,當然也可以直接采用Mybatis-Plus提供的saveOrUpdate方法,但是根據源碼發現,會有很多額外的反射操作,并且還添加了事務,大家都知道,MySQL單表操作完全不需要開事務,會增加額外的開銷。

@Transactional(
        rollbackFor = {Exception.class}
    )
    public boolean saveOrUpdate(T entity) {
        if (null == entity) {
            return false;
        } else {
            Class<?> cls = entity.getClass();
            TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
            Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!", new Object[0]);
            String keyProperty = tableInfo.getKeyProperty();
            Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!", new Object[0]);
            Object idVal = ReflectionKit.getFieldValue(entity, tableInfo.getKeyProperty());
            return !StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity);
        }
    }

4 拓展

4.1 如果兩個事務同時修改存在的行會發生什么?

在驗證二中兩個事務修改的都是不存在的行,都能加間隙鎖成功,那如果兩個事務修改的是存在的行,MySQL還會加間隙鎖嗎?或者說把間隙鎖從鎖間隙降為鎖一行?帶著疑問,我們執行以下數據驗證,我們還是使用驗證一的表和數據。

  • 首先我們開啟事務一執行以下語句
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
  • 我們再開啟事務二,執行同樣的語句,發現事務二已經被阻塞
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_gap_lock t set t.age = 25 where t.id = 1;
  • 這個時候我們執行以下語句看下當前正在鎖的事務。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS \G;
*************************** 1. row ***************************
    lock_id: 75C:0:360:2
lock_trx_id: 75C
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`t_gap_lock`
 lock_index: `PRIMARY`
 lock_space: 0
  lock_page: 360
   lock_rec: 2
  lock_data: 1
*************************** 2. row ***************************
    lock_id: 75B:0:360:2
lock_trx_id: 75B
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`t_gap_lock`
 lock_index: `PRIMARY`
 lock_space: 0
  lock_page: 360
   lock_rec: 2
  lock_data: 1
2 rows in set (0.00 sec)

根據lock_type和lock_mode我們看到事務一和二加的鎖變成了Record Lock,并沒有再添加間隙鎖,根據以上數據驗證MySQL在修改存在的數據時會給行加上Record Lock,與間隙鎖不同的是該鎖是互斥的,即不同的事務不能同時對同一行記錄添加Record Lock。

5 結語

雖然Mybatis-Plus提供的這個方法可能會造成死鎖,但是依然不可否認它是一款非常優秀的增強框架,其提供的lambda寫法在日常工作中極大的提高了我們的開發效率,所以凡事都有兩面性,我們應該秉承辯證的態度,熟悉的方法嘗試用,陌生的方法謹慎用。

以上就是我們在生產環境間隙鎖死鎖分析的全過程,如果大家覺得本文讓你對間隙鎖,以及間隙鎖死鎖有一點的了解,別忘記一鍵三連,多多支持轉轉技術,轉轉技術在未來將會給大家帶來更多的生產實踐與探索。

作者簡介

謝星,轉轉金融技術部后端工程師。熱愛編程,熱愛分享,擁抱開源。

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2024-12-20 16:49:15

MyBatis開發代碼

2024-08-27 22:04:37

2024-11-20 08:00:00

死鎖多線程編程

2025-02-27 09:45:47

2023-06-07 08:08:37

MybatisSpringBoot

2023-07-29 22:02:06

MyBatis數據庫配置

2023-10-31 08:01:48

Mybatis參數jdbcurl?

2023-06-07 08:00:00

MySQL批量插入

2024-01-04 08:38:21

Vue3API慎用

2025-10-28 01:15:00

2025-05-26 03:20:00

SpringMyBatis數據權限

2025-07-10 09:32:23

2024-07-31 09:56:20

2024-11-28 19:03:56

2024-02-28 09:35:52

2025-02-13 07:59:13

2023-01-12 09:13:49

Mybatis數據庫

2023-01-17 09:13:08

Mybatis后端框架

2025-06-24 09:36:04

2022-08-04 15:31:45

MySQL加鎖機制死鎖
點贊
收藏

51CTO技術棧公眾號

正在播放一区二区三区| 国产精品第一视频| 91九色蝌蚪porny| 在线看的毛片| 国产精品久久久久永久免费观看 | 色吧亚洲日本| 国产视频一区在线播放| 欧洲国产伦久久久久久久| 四虎影院一区二区三区 | 欧美日韩综合视频网址| 日韩高清三级| 日韩av在线播放观看| 疯狂欧洲av久久成人av电影| 一区二区三区欧美视频| 久久偷看各类wc女厕嘘嘘偷窃| 国产美女高潮视频| 欧亚一区二区| 一区二区三区四区视频精品免费| 久久综合九色欧美狠狠| 精品人妻aV中文字幕乱码色欲 | 亚洲国产精品系列| 亚洲一区日韩精品| 松下纱荣子在线观看| 亚洲天堂2014| 亚洲精品乱码久久久久久蜜桃91 | 国产精品免费看久久久无码| 欧美捆绑视频| 丁香婷婷深情五月亚洲| 成人性生交大片免费看小说| aaaaaa毛片| 欧美日韩亚洲一区在线观看| 夜夜嗨av色综合久久久综合网 | www.豆豆成人网.com| 欧美色图第一页| 成人黄色av片| 欧美日韩经典丝袜| 亚洲欧美日韩中文播放| 亚洲人一区二区| 毛片免费在线观看| 成人久久视频在线观看| 91亚洲午夜在线| 中文有码在线播放| 日韩和欧美一区二区三区| 91成人性视频| 色播视频在线播放| 黄色成人av网站| 日韩最新免费不卡| www成人啪啪18软件| 精品在线播放| 精品magnet| 岛国大片在线播放| 欧美日韩经典丝袜| 亚洲成人免费影院| 亚洲色成人www永久在线观看| 2024最新电影在线免费观看| 亚洲少妇中出一区| 日本美女爱爱视频| 最近中文字幕免费mv2018在线 | 久久精品国产亚洲AV无码男同| **女人18毛片一区二区| 久久天堂电影网| 中文字幕在线2021| 欧美在线国产| 欧美疯狂xxxx大交乱88av| 日韩视频中文字幕在线观看| 欧美不卡视频| 欧美激情综合亚洲一二区| 久久久精品视频在线| 伊人久久婷婷| 8090成年在线看片午夜| 99久久久久久久久| 美女免费视频一区二区| 国产欧美精品在线播放| 99在线观看免费| 粉嫩蜜臀av国产精品网站| 国产日韩欧美亚洲一区| 免费在线国产| 国产精品三级电影| 国产手机视频在线观看| 成人女同在线观看| www国产成人免费观看视频 深夜成人网| 精品在线视频一区二区| 国产色a在线| 亚洲视频综合在线| www.在线观看av| 五月天国产在线| 欧美日韩国产一区| 久久国产免费视频| 西瓜成人精品人成网站| 日韩一区二区在线视频| 真实国产乱子伦对白在线| 亚洲国产精品一区| 国产精品久久一| www.97av| 国产情人综合久久777777| 国产精品污www一区二区三区| 中文字幕在线观看精品| 国产乱国产乱300精品| 国产日韩久久| 欧美精品日韩少妇| 精品免费在线视频| 亚洲欧美影院| 少妇视频在线| 欧美在线视频不卡| 野战少妇38p| 欧美第十八页| 97精品国产97久久久久久| 欧美色图亚洲天堂| 久久久久综合| 国产精品二区在线| 成人欧美一区| 午夜欧美在线一二页| 国产欧美激情视频| 国产一区不卡| 亚洲欧洲黄色网| 久久亚洲无码视频| 亚洲小说欧美另类婷婷| 国产精品美女网站| 天堂在线视频免费观看| 日韩毛片精品高清免费| 青青青国产在线视频| 亚洲一区二区三区免费| 日韩视频在线免费| 亚洲 日本 欧美 中文幕| 高清国产一区二区| 在线观看欧美一区| 欧美xxxx做受欧美护士| 亚洲第一男人天堂| 久久久久久福利| 久久精品国产在热久久| 欧美日韩精品中文字幕一区二区| 无码国产伦一区二区三区视频 | 9999热视频| 男女性色大片免费观看一区二区| 久久国产欧美精品| 黑人另类精品××××性爽| 欧美乱妇15p| 国产探花视频在线播放| 午夜亚洲视频| 久久久99国产精品免费| av在线网页| 日韩精品专区在线影院重磅| 成人免费精品动漫网站| 精品一区中文字幕| 天天综合色天天综合色hd| 日韩免费电影| 亚洲欧美日韩区| 69国产精品视频免费观看| 99久久精品免费看| 韩国无码av片在线观看网站| 日韩成人在线观看视频| 欧美成人久久久| av中文字幕观看| 一区二区三区四区不卡视频| av在线天堂网| 91久久午夜| 九色91视频| se01亚洲视频| 色青青草原桃花久久综合| 在线免费观看av片| 国产精品一区二区黑丝| 2021狠狠干| 91精品入口| 97在线视频免费| 欧美在线一卡| 欧美日韩在线亚洲一区蜜芽| 国产一区在线观看免费| 国产在线精品一区二区三区不卡 | 欧美成人乱码一二三四区免费| 日本欧美肥老太交大片| 成人美女免费网站视频| 18+激情视频在线| 亚洲国模精品私拍| 无码人妻精品一区二区三区9厂 | 狠狠色丁香久久婷婷综合_中| 国产免费色视频| 福利电影一区| 欧洲亚洲免费视频| 日本美女在线中文版| 日韩视频永久免费| 激情五月色婷婷| 久久精品亚洲乱码伦伦中文| 午夜国产福利在线观看| 黄色日韩在线| 神马欧美一区二区| 久久综合给合| 国产亚洲精品一区二555| 中文字幕在线播出| 亚洲国产精品一区二区www| 国产精品jizz| 国产精品一区二区免费不卡 | 国产精品一区2区| 国产精品999视频| 日本久久一二三四| 国产日韩精品久久| 亚洲伊人av| 中文字幕在线亚洲| 免费看日韩av| 欧美卡1卡2卡| 国产视频1区2区| 一区二区三区在线视频观看| 国精品无码人妻一区二区三区| 欧美一区=区| 欧美一级特黄aaaaaa在线看片| 欧美高清视频看片在线观看| 欧美国产激情18| 免费av在线电影| 日韩美一区二区三区| 欧美三级网站在线观看| 久久久影院官网| 99视频在线观看视频| 三级精品在线观看| 国产无限制自拍| 91精品国产调教在线观看| 久久五月天婷婷| www.豆豆成人网.com| 91久久国产精品| 99亚洲伊人久久精品影院| 欧美亚洲视频在线看网址| 天天爽夜夜爽夜夜爽| 欧美一区二区视频在线观看 | 亚洲成av人乱码色午夜| 一区二区三区亚洲视频| 91国偷自产一区二区三区观看| 久久精品美女视频| 亚洲乱码一区二区三区在线观看| 我不卡一区二区| www国产亚洲精品久久麻豆| 美女扒开腿免费视频| 国产一区二区三区在线观看精品 | 9i看片成人免费看片| 99国产精品国产精品毛片| 亚洲高清av一区二区三区| 蜜臀av亚洲一区中文字幕| 免费裸体美女网站| 国产一区二区精品| 日日碰狠狠添天天爽超碰97| 亚洲性感美女99在线| www.日本三级| 韩国在线一区| 福利视频一区二区三区四区| 好看的av在线不卡观看| 成人午夜免费在线视频| 狠狠爱成人网| av在线播放亚洲| 99国产精品久久久久久久成人热| 精品丰满人妻无套内射| 在线国产日韩| 国产精品999视频| 国产一区二区三区久久久久久久久| 人妻少妇精品无码专区二区| 一本色道久久综合| 欧美一区二区三区爽大粗免费| 国产精品毛片在线| 欧美三级一级片| 久久激情久久| 婷婷免费在线观看| 国产在线精品不卡| 特黄特色免费视频| 成人av一区二区三区| 欧美熟妇精品黑人巨大一二三区| 97se狠狠狠综合亚洲狠狠| 无码国产69精品久久久久同性| 国产午夜精品在线观看| 亚洲国产精品一区二区久久hs| 中文字幕一区日韩精品欧美| 欧美三根一起进三p| 亚洲高清在线精品| www.久久久久久久| 欧美日韩在线观看一区二区| 国产人妖一区二区三区| 亚洲成色999久久网站| 四虎精品在永久在线观看| 一本大道亚洲视频| 99热国产在线中文| 26uuu亚洲国产精品| 中文字幕系列一区| 91在线国产电影| 色婷婷久久久| 亚洲国产精品一区二区第四页av | 国产天堂亚洲国产碰碰| 黄色精品视频在线观看| 亚洲第一成人在线| 黄色av一区二区| 日韩三级高清在线| 免费动漫网站在线观看| 欧美成人精品在线| 成人影院入口| 91九色在线观看| 欧美亚洲高清| 黄网站欧美内射| 激情综合色丁香一区二区| 亚洲一区二区三区黄色| 亚洲国产精品激情在线观看| 久久久久久久久久久网 | 国产精品丝袜久久久久久app| 丁香花五月激情| 色婷婷一区二区三区四区| 国产成人免费看一级大黄| 亚洲欧洲第一视频| 欧洲在线视频| 国产精品一区二区3区| 黄色成人美女网站| 日本久久高清视频| 久久这里有精品15一区二区三区| 男人添女人下部视频免费| 久久婷婷影院| 国产午夜在线一区二区三区| 中文字幕一区二区三区在线观看| 在线观看免费国产视频| 欧美一区在线视频| 福利视频在线导航| 欧美精品18videos性欧| 91麻豆精品| 日韩一二三区不卡在线视频| 亚洲精品在线二区| 超碰91在线播放| 亚洲欧洲日产国码二区| 日本高清不卡码| 亚洲国产女人aaa毛片在线| 超碰最新在线| 国产噜噜噜噜噜久久久久久久久| 一本色道久久综合狠狠躁的番外| 国产青草视频在线观看| 黄色小说综合网站| 美国美女黄色片| 欧美性开放视频| 无套内谢的新婚少妇国语播放| 九九热精品视频| gogo大尺度成人免费视频| 亚洲国产日韩欧美| 久久婷婷一区| 免费一级做a爰片久久毛片潮| 中文字幕精品一区二区精品绿巨人 | 国产成人精品电影久久久| 日本va欧美va国产激情| 久久精品在线| 一本色道久久综合亚洲精品图片| 亚洲国产成人高清精品| 亚洲国产www| 九九精品视频在线| 日本精品视频| 成人毛片100部免费看| 国产激情一区二区三区| 加勒比婷婷色综合久久| 日韩一级片网站| 蜜臀av在线播放| 国产一区免费在线| 一区二区三区导航| 亚洲第一页av| 欧洲生活片亚洲生活在线观看| 国产理论电影在线观看| 国产精品视频永久免费播放| 日韩一区电影| 成人小视频在线观看免费| 国产毛片精品一区| 欧美人妻一区二区| 亚洲高清不卡av| 成人影院网站| 亚洲最新在线| 国产精品一区专区| 日韩成人在线免费视频| 日韩精品在线观看一区| 免费在线看a| 91麻豆国产语对白在线观看| 午夜激情一区| 小毛片在线观看| 色偷偷久久人人79超碰人人澡| 波多野结衣在线影院| 国产日韩欧美黄色| 欧美日韩一区自拍| 日本一区二区在线免费观看| 日本韩国一区二区三区视频| 日本在线观看| 国产亚洲一区二区三区在线播放| 免费永久网站黄欧美| 黄色一级片一级片| 日韩欧美国产精品| hd国产人妖ts另类视频| 欧美大陆一区二区| 久久精品99久久久| 久草视频免费在线| 亚洲欧美精品伊人久久| 亚洲免费资源| 国产精品裸体瑜伽视频| 国产精品天天看| www香蕉视频| 国产精品久久久久999| 中文在线播放一区二区| 色噜噜在线观看| 69p69国产精品| 中文在线8资源库| 永久免费网站视频在线观看| 97久久精品人人做人人爽50路| 亚洲影视一区二区| 国内外成人免费激情在线视频| 不卡av一区二区| 性色av蜜臀av浪潮av老女人| 欧美丝袜丝交足nylons| 888av在线视频|