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

国产婷婷一区二区三区久久| 亚洲一二三区av| 国产视频一区二区三| 亚洲成人最新网站| 日韩欧美一级特黄在线播放| 日韩在线视频在线| 99久久精品日本一区二区免费| 亚洲视频免费| 亚洲男人天堂2023| 亚洲精品视频导航| av网址在线免费观看| 丰满白嫩尤物一区二区| 欧美最猛性xxxx| 操她视频在线观看| 91成人噜噜噜在线播放| 色狠狠综合天天综合综合| 手机福利在线视频| 日韩一级在线播放| 美国一区二区三区在线播放| 久久久久久久久中文字幕| 精品国产成人亚洲午夜福利| 久久久91麻豆精品国产一区| 日韩欧美黄色动漫| 最新欧美日韩亚洲| 色资源在线观看| 激情欧美一区二区三区在线观看| 久久久久在线观看| 人成免费在线视频| 免费成人蒂法| 欧美午夜精品一区二区蜜桃| 国产一区二区四区| eeuss影院在线观看| 成人国产精品免费网站| 成人久久久久久久| 中文字幕免费高清网站| 亚洲视频免费| 麻豆国产va免费精品高清在线| 国产高清自拍视频| 99久久人爽人人添人人澡| 欧美三级午夜理伦三级中视频| 僵尸世界大战2 在线播放| 黄色av电影在线观看| 国产亚洲成年网址在线观看| 国产伦精品一区二区三区四区视频 | 一区二区三区四区不卡视频| 日韩欧美精品一区二区三区经典| 人妻视频一区二区三区| 国产一区二区三区四区五区美女| 国产成人精彩在线视频九色| 亚州国产精品视频| 韩日视频一区| 不卡毛片在线看| 国产欧美小视频| 国精产品一区一区三区mba桃花 | 亚洲成人av综合| 日韩av高清在线观看| 2025国产精品视频| 国产极品在线播放| 欧美日韩中文| 久久躁狠狠躁夜夜爽| 99久久久无码国产精品不卡| 国产一区二区在线| 亚洲跨种族黑人xxx| 国产亚洲精品久| 成人天堂噜噜噜| 中文字幕理论片| 日韩影院在线观看| 国产精品第一视频| 五月天婷婷导航| 亚洲女人av| 欧美一区二区三区免费视| 欧美三级一区二区三区| 一区二区三区四区五区精品视频 | 91av在线播放| 色网站在线播放| 一本久道久久综合狠狠爱| 午夜精品一区二区三区视频免费看| 久久国产精品二区| 亚洲毛片网站| 国产91免费看片| 99re这里只有精品在线| 日韩vs国产vs欧美| 国产日产久久高清欧美一区| 亚洲综合免费视频| 国产一区二区调教| 国产精品免费看一区二区三区| 亚洲黄色在线观看视频| 99精品国产热久久91蜜凸| 久久综合九色综合网站| 国产精品四虎| 国产精品久久精品日日| 国产精品jizz在线观看老狼| 丝袜美腿av在线| 婷婷六月综合网| 丰满少妇被猛烈进入高清播放| 性欧美超级视频| 欧美日韩美女一区二区| 日韩av影视大全| 精品欧美午夜寂寞影院| 日韩精品欧美国产精品忘忧草| 日韩av在线看免费观看| 91成人精品视频| 久久久这里只有精品视频| 欧美a视频在线观看| 久久国产精品色| 99国内精品久久久久久久软件| 色呦呦中文字幕| 国产精品色婷婷| a天堂资源在线观看| 伊人久久高清| 日韩欧美一区在线| 91精品人妻一区二区三区蜜桃欧美 | 欧美va天堂在线| 国产91精品高潮白浆喷水| 国产精品第6页| 国产精品18久久久久久久久 | av一级黄色片| 久久综合久久鬼色中文字| 亚洲免费av网| 欧美精品日日操| 日韩一级精品视频在线观看| 中日韩精品一区二区三区| 在线成人激情| 国产精品91一区| 亚洲黄色在线观看视频| 中文字幕一区二区三区视频| 好吊妞无缓冲视频观看| 国产精品日本一区二区三区在线| 亚洲乱码国产乱码精品精| 成年人av电影| 久久精品99久久久| 欧美下载看逼逼| 国产无遮挡裸体视频在线观看| 欧美精品自拍偷拍动漫精品| b站大片免费直播| 亚洲精品1234| 92裸体在线视频网站| 黄色网址在线播放| 欧美日韩色婷婷| 黑人巨大猛交丰满少妇| 久久在线播放| 国产成人亚洲综合| 日韩私人影院| 亚洲福利视频三区| 色婷婷综合在线观看| 久久中文亚洲字幕| 国产精品美女视频网站| 男女av在线| 亚洲一区成人在线| 亚洲女人在线观看| 91精品久久久久久久蜜月| 国产精品高潮呻吟久久av野狼| 无码精品一区二区三区在线 | xxxx 国产| 国产麻豆精品视频| 黄色a级在线观看| 欧美美女被草| 日韩在线观看高清| 一级特黄aaaaaa大片| 中文字幕不卡一区| 中文字幕永久视频| 成人黄色av| 国产精品久久久久久久久久久久久| 免费国产在线视频| 一本大道久久a久久综合婷婷| a级一a一级在线观看| 国内视频精品| 精品久久久久久中文字幕动漫 | 在线视频精品一| 国产区精品视频在线观看豆花| 国产色播av在线| 色8久久精品久久久久久蜜| 动漫精品一区二区三区| 亚洲综合精品| 欧美在线视频一区二区三区| 一级毛片久久久| 亚洲欧美在线一区二区| 艳妇乳肉豪妇荡乳av无码福利 | 成人毛片在线免费观看| 夜夜嗨av一区二区三区中文字幕| 一本一道久久a久久精品综合蜜臀| 久久天堂国产精品| 亚洲欧美se| 亚洲人成免费电影| 一级二级三级视频| 亚洲乱码国产乱码精品精可以看| 能看毛片的网站| 亚洲高清毛片| 欧美大陆一区二区| 91九色综合| 欧美成人免费视频| 免费国产精品视频| 色婷婷av一区二区| 欧美性生交大片| 国产美女一区二区| 人妻夜夜添夜夜无码av| 成人在线国产| 91精品免费| 免费成人动漫| 日韩在线观看免费高清完整版| 午夜精品久久久久久久96蜜桃| 欧美日韩激情视频| 女教师淫辱の教室蜜臀av软件| 国产精品一二三区在线| av黄色在线网站| 欧美超碰在线| 国产免费高清一区| 欧美一级二级视频| 色综合天天综合网国产成人网| 亚洲人视频在线观看| 在线播放一区二区三区| 国产视频91在线| 国产精品国产自产拍高清av王其| 精品视频站长推荐| 久久99精品久久久久久动态图| 精品久久久久久无码中文野结衣| 色综合久久网| 免费影院在线观看一区| 国产一区二区三区| 国产成人精品视频| 高h视频在线播放| 中文字幕免费精品一区高清| 婷婷色在线视频| 制服丝袜亚洲色图| 国产一区免费看| 亚洲一区二区三区视频在线播放| 日本精品久久久久中文| 99国产精品视频免费观看| 91亚洲一区二区| 免费在线成人网| 欧美老熟妇喷水| 欧美va天堂在线| 亚洲精品一区二区三区四区五区| 欧美黄色网视频| 亚洲最大的成人网| 久久精品嫩草影院| 国产999在线| 交100部在线观看| 九色精品免费永久在线| 在线观看黄av| 在线看国产精品| 国产午夜精品一区理论片| 日韩成人网免费视频| 国产噜噜噜噜噜久久久久久久久| 四虎在线视频| 精品三级av在线| 国产av无码专区亚洲av麻豆| 欧美吻胸吃奶大尺度电影| 国产精品久久久久久久久久精爆| 亚洲一区在线观看免费 | 日韩精品免费在线视频观看| 亚洲精品国产av| 日韩三级中文字幕| 国产精品爽爽久久| 欧美日韩亚洲综合一区| 91青青草视频| 在线免费不卡电影| 波多野结衣一二区| 色久综合一二码| 欧美性猛交xxxx乱大交hd| 日本乱人伦aⅴ精品| 黄色av网站免费观看| 色成人在线视频| 波多野结衣绝顶大高潮| 在线免费一区三区| 中文av免费观看| 欧美日本在线播放| 国产乱码精品一区二三区蜜臂 | 久久99精品久久久久婷婷| 福利片一区二区三区| 国产自产高清不卡| 三上悠亚 电影| 成人免费视频一区| 手机在线看片日韩| 国产亚洲一区二区三区| 久久久视频6r| 国产精品日韩精品欧美在线| 亚洲精品卡一卡二| 亚洲一区免费观看| 亚洲欧美综合另类| 欧美无砖砖区免费| 97精品人妻一区二区三区| 日韩无一区二区| 欧美 日韩 国产 在线| 亚洲老司机av| 日本中文在线| 欧美日韩福利电影| 在线观看涩涩| 国产精品自产拍在线观看| 精品国模一区二区三区欧美| 成人片在线免费看| 亚洲电影男人天堂| 日韩影视精品| 亚洲综合色网| 免费成人午夜视频| 蜜臀va亚洲va欧美va天堂| 国产性生活一级片| 不卡的av电影| 黄色国产在线播放| 亚洲国产欧美在线| 日韩欧美一级大片| 日韩精品一区二区三区四区| 牛牛热在线视频| 精品国产一区二区三区四区在线观看| 好吊日av在线| 国产精品久久不能| 久久99国产精品久久99大师| 亚洲 日韩 国产第一区| 精品999日本| 黄色手机在线视频| k8久久久一区二区三区| 国产成人免费在线观看视频| 精品久久久久久中文字幕一区奶水 | av一区二区在线播放| 日韩专区第三页| 日韩电影在线观看电影| 亚洲av无码专区在线播放中文| 中文字幕欧美日韩一区| www.国产高清| 欧美一区二区在线免费播放| 国产色在线 com| 久久久久久久久久久av| 亚洲精品毛片| 欧美激情导航| 一道本一区二区| 中文字幕乱妇无码av在线| 国产欧美日韩不卡| 97超碰人人干| 欧美一级高清大全免费观看| jizzjizz在线观看| 日本一区二区在线播放| 久久香蕉精品香蕉| 欧美美女黄色网| 久久激情五月激情| 亚洲精品成人无码| 精品久久久久久久久久国产| 亚洲欧美另类视频| 久久伊人精品视频| 亚州精品国产| 午夜欧美性电影| 天堂精品中文字幕在线| 中文字幕一区三区久久女搜查官| 一区二区三区在线视频免费观看 | 色老头视频在线观看| 日本亚洲欧洲色α| 久久爱www成人| 玩弄中年熟妇正在播放| 成人美女视频在线看| 精品无码久久久久久久久| 欧美一区二区久久| 久久国产精品一区| 成人免费网站在线观看| 99久久九九| 天天久久综合网| 亚洲欧美精品午睡沙发| 91高潮大合集爽到抽搐| 日韩视频免费大全中文字幕| 久久精品黄色| 资源网第一页久久久| 久久精品国产久精国产| 岛国片在线免费观看| 欧美日韩一区二区三区高清| 91社区在线观看| 国产裸体写真av一区二区 | 成人bbav| 明星裸体视频一区二区| 视频一区视频二区中文字幕| 真实乱视频国产免费观看| 欧美视频中文一区二区三区在线观看| av在线免费观看网站| 国产久一一精品| 91精品久久久久久久久久不卡| ass极品水嫩小美女ass| 午夜久久久影院| 男人久久精品| 国产精品最新在线观看| 一区二区三区四区电影| 久久久久久婷婷| 日韩欧美一区二区三区| www.亚洲.com| 92裸体在线视频网站| 亚洲小说欧美另类社区| 加勒比一区二区| 欧美人狂配大交3d怪物一区| 亚洲妇熟xxxx妇色黄| 精品免费一区二区三区蜜桃| 葵司免费一区二区三区四区五区| 中文字幕第二区| 日韩三级中文字幕| 性感女国产在线| 亚洲日本无吗高清不卡| 国产一区二区精品久久91| 久久久久久久黄色片| 中文字幕欧美视频在线| 日韩高清在线观看一区二区| 欧美日韩亚洲一| 成人欧美一区二区三区白人 | 国产精品一区二区在线观看网站| 日本一区二区不卡在线| 中文字幕亚洲一区在线观看|