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

高并發(fā)場(chǎng)景下Spring事務(wù)與JPA樂(lè)觀鎖重試機(jī)制導(dǎo)致的死鎖

開(kāi)發(fā) 前端
在高并發(fā)場(chǎng)景中,庫(kù)存扣減是最典型的業(yè)務(wù)挑戰(zhàn)之一。當(dāng)多個(gè)線程同時(shí)爭(zhēng)奪同一商品的庫(kù)存資源時(shí),稍有不慎就會(huì)引發(fā)超賣(mài)(庫(kù)存扣減為負(fù)值)或死鎖(線程相互阻塞無(wú)法推進(jìn))等嚴(yán)重問(wèn)題。

環(huán)境:SpringBoot3.4.0

1. 簡(jiǎn)介

在高并發(fā)場(chǎng)景中,庫(kù)存扣減是最典型的業(yè)務(wù)挑戰(zhàn)之一。當(dāng)多個(gè)線程同時(shí)爭(zhēng)奪同一商品的庫(kù)存資源時(shí),稍有不慎就會(huì)引發(fā)超賣(mài)(庫(kù)存扣減為負(fù)值)或死鎖(線程相互阻塞無(wú)法推進(jìn))等嚴(yán)重問(wèn)題。為解決超賣(mài),開(kāi)發(fā)者常采用JPA樂(lè)觀鎖(基于版本號(hào)機(jī)制)配合重試策略,然而這一方案在實(shí)際應(yīng)用中暗藏陷阱——若事務(wù)管理與重試邏輯設(shè)計(jì)不當(dāng),反而會(huì)觸發(fā)更隱蔽的死鎖問(wèn)題。

以一段典型的Spring Data JPA代碼為例:當(dāng)多個(gè)線程同時(shí)扣減庫(kù)存時(shí),樂(lè)觀鎖沖突會(huì)觸發(fā)ObjectOptimisticLockingFailureException,而開(kāi)發(fā)者試圖通過(guò)遞歸重試恢復(fù)操作。然而,這種設(shè)計(jì)可能因以下原因?qū)е孪到y(tǒng)崩潰:

  • 事務(wù)傳播機(jī)制缺陷
    重試未開(kāi)啟獨(dú)立事務(wù),導(dǎo)致行鎖長(zhǎng)期未釋放,線程相互阻塞。
  • JPA一級(jí)緩存干擾
    未清理的緩存使重試讀取到臟數(shù)據(jù),與數(shù)據(jù)庫(kù)真實(shí)狀態(tài)不一致。
  • 無(wú)限遞歸風(fēng)險(xiǎn)
    持續(xù)沖突引發(fā)棧溢出或資源耗盡。

本文將以代碼實(shí)踐為切入點(diǎn),逐步分析在高并發(fā)場(chǎng)景下樂(lè)觀鎖引發(fā)的各種問(wèn)題。

2. 實(shí)戰(zhàn)案例

2.1 準(zhǔn)備環(huán)境

準(zhǔn)備JPA對(duì)應(yīng)的實(shí)體類

@Entity
@Table(name = "c_product")
@DynamicUpdate
public class Product {
  @Id
  private Long id;
  private String name;
  private Integer stock;
  @Version
  private Integer version;
  // getters, setters
}

c_product表準(zhǔn)備如下數(shù)據(jù)

INSERT INTO `mall`.`c_product` (`id`, `name`, `stock`, `version`) 
  VALUES (1, 'Spring Boot3實(shí)戰(zhàn)案例100例', 2, 1);

圖片圖片

準(zhǔn)備Repository接口

public interface ProductRepository extends 
  JpaRepository<Product, Long> {
}

扣減庫(kù)存Service初始方法

@Transactional
public void deductStock(Long productId, int quantity) {
  this.productRepository.findById(productId).ifPresentOrElse(p -> {
    if (p.getStock() >= quantity) {
      p.setStock(p.getStock() - quantity);
      productRepository.save(p);
    } else {
      throw new RuntimeException("庫(kù)存不足");
    }
  }, () -> {
    throw new RuntimeException("商品不存在");
  });
}

在這初始扣減庫(kù)存中我們還并沒(méi)有加入重試的邏輯。

單元測(cè)試用例

@Test
public void testDeductStock() throws Exception {
  final int MAX = 10 ;
  CountDownLatch cdl = new CountDownLatch(MAX) ;
  CyclicBarrier cb = new CyclicBarrier(MAX) ;
  for (int i = 0; i < MAX; i++) {
    new Thread(() -> {
      try {
        cb.await() ;
        this.productService.deductStock(1L, 1) ;
      } catch(Exception e) {
      } finally {
        cdl.countDown() ;
      }
    }, "T" + i).start() ;
  }
  cdl.await() ; 
  System.err.println("執(zhí)行完成...") ;
}

測(cè)試用例中模擬了10個(gè)線程進(jìn)行并發(fā)庫(kù)存扣減操作。

2.2 初始代碼測(cè)試

首先,我們測(cè)試初始代碼結(jié)果如下:

圖片圖片

執(zhí)行更新動(dòng)作時(shí)自動(dòng)加入了version版本字段;數(shù)據(jù)庫(kù)中的數(shù)據(jù)如下:

圖片圖片

也就是只有一個(gè)線程扣減庫(kù)存成功,其它10個(gè)線程都發(fā)生了樂(lè)觀鎖異常。可是控制臺(tái)并沒(méi)有輸出異常啊,這是因?yàn)槲覀冊(cè)趩卧獪y(cè)試中將異常吞了,修改測(cè)試用例代碼在catch中輸出異常,如下:

圖片圖片

控制臺(tái)輸出。

圖片圖片

9個(gè)線程都發(fā)生了并發(fā)修改樂(lè)觀鎖異常。

思考:我們?cè)跍y(cè)試用例中進(jìn)行了異常捕獲,那么我們能否在ProductService#deductStock方法中進(jìn)行捕獲呢?以當(dāng)前的代碼來(lái)看是不行的,也就是你想通過(guò)如下方式捕獲是不行的:

圖片圖片

或者是你將deductStock方法都進(jìn)行try...catch也是不能捕獲的。因?yàn)闃?lè)觀鎖是在事務(wù)提交的時(shí)候進(jìn)行檢查的。

接下來(lái),我們要加入樂(lè)觀鎖異常后重試機(jī)制。

2.3 樂(lè)觀鎖重試版本1

我們將代碼修改如下:

圖片圖片

首先,我將原來(lái)的save方法修改為saveAndFlush;其次,catch捕獲了樂(lè)觀鎖異常并在其中自調(diào)用進(jìn)行重試。

將方法修改為saveAndFlush會(huì)立即將update語(yǔ)句發(fā)送給db進(jìn)行執(zhí)行,這樣就能捕獲到樂(lè)觀鎖異常了。

如上代碼是否能改進(jìn)行正確的庫(kù)存扣減呢?執(zhí)行測(cè)試用例輸出如下:

圖片圖片

庫(kù)存不足,那么是不是數(shù)據(jù)庫(kù)中已經(jīng)都扣減完了?

圖片圖片

查看數(shù)據(jù)庫(kù),庫(kù)存還有,但控制臺(tái)確輸出的庫(kù)存不足,這又是為什么呢?我們?cè)诖a中加入如下輸出:

圖片圖片

再次運(yùn)行,輸出結(jié)果。

圖片圖片

這里我們以T5線程來(lái)說(shuō):

  • T5線程首次查詢stock=2,versinotallow=1;
  • 當(dāng)update時(shí)由于其它線程已經(jīng)修改了數(shù)據(jù),版本發(fā)生了變化,所以T5線程拋出了樂(lè)觀鎖異常;
  • 接著,再次調(diào)用deductStock方法,但是并沒(méi)有執(zhí)行select語(yǔ)句,這是由于JPA一級(jí)緩存導(dǎo)致(同一個(gè)線程EntityManager使用的同一個(gè)),但是輸出的stock=1,versinotallow=1,這是因?yàn)閡pdate雖然沒(méi)有成功,但是我們的代碼中在上一步中確對(duì)stock進(jìn)行了減1操作。
  • 繼續(xù)執(zhí)行update語(yǔ)句,由于已經(jīng)有線程執(zhí)行成功將version變成了2,所以這次還是拋出了樂(lè)觀鎖異常(此時(shí),緩存中的stock進(jìn)行了2次減1操作,已經(jīng)變成了0)。
  • 最后,第三次調(diào)用的時(shí)候一級(jí)緩存中的stock已經(jīng)變?yōu)?了,所以最終拋出了庫(kù)存不足;這時(shí)候的庫(kù)存不足是內(nèi)存中沒(méi)有了,可數(shù)據(jù)庫(kù)真實(shí)的數(shù)據(jù)還是有的。
     

以上是當(dāng)前版本1中出現(xiàn)的問(wèn)題。接下來(lái),我們將繼續(xù)修改代碼。

2.4 樂(lè)觀鎖重試版本2

通過(guò)上面的說(shuō)明,我們知道了在同一個(gè)線程中查詢相同的數(shù)據(jù)第二次將會(huì)從緩存中直接返回,那是不是我們將緩存清理了就可以再次從數(shù)據(jù)庫(kù)中查詢最新的數(shù)據(jù)呢?修改代碼如下:

圖片

首先,我們注入了EntityManager對(duì)象;接著,在catch中進(jìn)行了clear清理一級(jí)緩存。

測(cè)試結(jié)果如下:

圖片圖片

所有的線程無(wú)限循環(huán)(死循環(huán)了),并且通過(guò)輸出日志也確實(shí)每次都執(zhí)行了SQL語(yǔ)句,那為什么輸出的stock=1,versinotallow=1呢?先來(lái)查看數(shù)據(jù)真實(shí)數(shù)據(jù):

圖片

程序中查詢的與數(shù)據(jù)庫(kù)為什么不符?

原因很簡(jiǎn)單,因?yàn)槲覀儺?dāng)前事務(wù)的隔離級(jí)別是可重復(fù)讀(REPEATABLE_READ),那么每次查詢的數(shù)據(jù)都將是快照讀(事務(wù)第一次查詢到的數(shù)據(jù))。

接下來(lái),我們將繼續(xù)修改代碼進(jìn)行第三個(gè)版本的嘗試。

2.5 樂(lè)觀鎖重試版本3

既然知道了原因,那么我們是不是修改事務(wù)的隔離級(jí)別就可以了呢?代碼修改如下:

圖片圖片

在事務(wù)注解上將事務(wù)的隔離級(jí)別設(shè)置為讀已提交(默認(rèn)是你當(dāng)前數(shù)據(jù)庫(kù)中默認(rèn)的隔離級(jí)別)。如上修改后再次運(yùn)行測(cè)試用例:

圖片圖片

這次程序正常結(jié)束并且每次都從數(shù)據(jù)庫(kù)中查詢了最新的數(shù)據(jù),但是又多了一個(gè)異常,意思是:"事務(wù)已被標(biāo)記為僅回滾,因此已靜默回滾"。為什么?

這里我們以T3線程為例進(jìn)行分析:

  • 首次執(zhí)行由于已經(jīng)被其它線程更新,所以拋出樂(lè)觀鎖異常。
  • 進(jìn)入重試,重新查詢數(shù)據(jù)得到最新的stock=1,versinotallow=2,庫(kù)存大于0,進(jìn)行扣減并執(zhí)行update操作。
  • T3線程進(jìn)行方法結(jié)束開(kāi)始提交事務(wù),這個(gè)異常就是在提交事務(wù)時(shí)拋出的。當(dāng)?shù)谝淮伟l(fā)生樂(lè)觀鎖異常的時(shí)候JPA內(nèi)部就已經(jīng)將當(dāng)前的事務(wù)狀態(tài)設(shè)置為回滾,所以最終提交的時(shí)候當(dāng)然執(zhí)行回滾操作。
     

這時(shí)候又該如何解決呢?接下來(lái),我們繼續(xù)修改代碼。

2.6 樂(lè)觀鎖重試版本4

既然知道了原因,那么我們是不是在每次重試的時(shí)候只要開(kāi)啟一個(gè)新的事務(wù)就可以了呢?修改代碼如下:

圖片圖片

在上面的代碼中,我們修改了下面3點(diǎn):

  • 將事務(wù)的傳播屬性設(shè)置REQUIRES_NEW,每次都開(kāi)始一個(gè)新的;并且刪除了事務(wù)的隔離級(jí)別,每次都是新的也就沒(méi)有必要了。
  • 刪除了clear清理緩存的操作。
  • 自己注入自己調(diào)用deductStock方法,這是為了防止事務(wù)失效。
     

測(cè)試結(jié)果如下:

圖片圖片

死鎖了,等待默認(rèn)的超時(shí)時(shí)間后結(jié)束,為什么?

這是因?yàn)楫?dāng)我們?nèi)魏我粋€(gè)線程發(fā)生樂(lè)觀鎖異常進(jìn)入重試階段時(shí),雖然重試時(shí)開(kāi)啟的是一個(gè)新的事務(wù),但是之前的事務(wù)update操作還沒(méi)有結(jié)束(已經(jīng)將id為1的記錄鎖定了,行鎖),當(dāng)你再次開(kāi)啟一個(gè)新事務(wù)執(zhí)行update操作時(shí)那必須等待前一個(gè)事務(wù)結(jié)束,前一個(gè)事務(wù)肯定結(jié)束不了,因?yàn)槲覀兪莾?nèi)部自己調(diào)用自己(遞歸調(diào)用),所以這里就產(chǎn)生了死鎖現(xiàn)象。

這該如何解決呢?接下來(lái),我們將介紹幾種解決辦法。

2.7 樂(lè)觀鎖重試版本5

我們將代碼修改如下:

public void deductStock(Long productId, int quantity) {
  this.productRepository.findById(productId).ifPresentOrElse(p -> {
    if (p.getStock() >= quantity) {
      p.setStock(p.getStock() - quantity);
      try {
        this.productRepository.saveAndFlush(p) ;
      } catch (ObjectOptimisticLockingFailureException e) {
        System.err.println(Thread.currentThread().getName() + " - 樂(lè)觀鎖異常, " + e.getMessage()) ;
        deductStock(productId, quantity) ;
      }
    } else {
      throw new RuntimeException("庫(kù)存不足");
    }
  }, () -> {
    throw new RuntimeException("商品不存在");
  }) ;
}

注意觀察上面的代碼,我們做了如下的修改:

  • 方法上的事務(wù)注解刪除了。
  • 樂(lè)觀鎖異常處理中,我們直接調(diào)用了當(dāng)前的方法。(因?yàn)楫?dāng)前的方法一級(jí)不是事務(wù)方法,不需要自己注入自己進(jìn)行調(diào)用)

執(zhí)行結(jié)果如下:

圖片圖片

數(shù)據(jù)庫(kù)庫(kù)存及版本變化:

圖片圖片

數(shù)據(jù)也正確了。

上面的代碼中不管你用save還是saveAndFlush都是可以的。因?yàn)槊恳淮蔚闹卦囌{(diào)用都是開(kāi)啟的一個(gè)新事務(wù)。

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-01-04 18:01:55

高并發(fā)SpringBoot

2021-02-20 10:02:22

Spring重試機(jī)制Java

2022-11-14 08:19:59

重試機(jī)制Kafka

2017-07-02 16:50:21

2017-06-16 15:16:15

2023-07-18 09:24:04

MySQL線程

2024-09-25 08:32:05

2020-07-06 08:03:32

Java悲觀鎖樂(lè)觀鎖

2025-05-28 01:15:00

Golang重試機(jī)制

2020-07-19 15:39:37

Python開(kāi)發(fā)工具

2025-02-26 10:49:14

2025-09-30 01:55:00

SpringWebClientHTTP

2022-05-06 07:44:10

微服務(wù)系統(tǒng)設(shè)計(jì)重試機(jī)制

2024-01-05 18:01:17

高并發(fā)策略程序

2023-10-27 08:20:12

springboot微服務(wù)

2025-01-03 08:44:37

kafka消息發(fā)送策略

2023-07-05 08:18:54

Atomic類樂(lè)觀鎖悲觀鎖

2025-06-05 01:22:00

SpringGateway高并發(fā)

2024-01-05 16:43:30

數(shù)據(jù)庫(kù)線程

2023-12-26 08:59:52

分布式場(chǎng)景事務(wù)機(jī)制
點(diǎn)贊
收藏

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

一区二区三区中文字幕精品精品 | av毛片在线免费看| 国产精品自拍网站| 97福利一区二区| www.黄色在线| 日韩视频一二区| 欧美性色xo影院| 欧美亚洲视频一区| 香蕉视频免费在线看| 日本午夜一本久久久综合| 欧美丰满少妇xxxx| 日本性高潮视频| 91成人精品在线| 欧美三级韩国三级日本一级| 日韩精品一区二区在线视频| 成人免费在线电影| 粉嫩一区二区三区在线看| 国产精品白嫩美女在线观看| 久久久国产精华液| 日本午夜一区| 精品视频在线播放免| 四虎1515hh.com| 久久久成人av毛片免费观看| 午夜影院久久久| 在线免费观看一区二区三区| 日本一二三区在线视频| 国产乱子伦一区二区三区国色天香| 欧美最猛性xxxxx(亚洲精品)| 国产精品三区在线观看| 精品成人影院| 日韩精品在线视频美女| 成年人看片网站| 日韩精品一区二区三区av| 香蕉乱码成人久久天堂爱免费| 国产成年人在线观看| 高清中文字幕一区二区三区| 91免费在线看| 国产欧美日韩在线播放| 国产哺乳奶水91在线播放| 日本伊人色综合网| 国产98色在线| 国产精品21p| 国产精品毛片| 久久久欧美一区二区| 四虎永久免费在线| 911久久香蕉国产线看观看| 亚洲夜晚福利在线观看| 日本xxx在线播放| 国产96在线亚洲| 日韩精品资源二区在线| 亚洲精品乱码久久久久久动漫| 国产91精品在线| 亚洲天堂网视频| 激情小说一区| 日韩一区二区视频| 91热视频在线观看| 99久久99九九99九九九| 欧美美女黄视频| 日韩欧美国产片| 亚洲毛片在线免费| 欧美男人的天堂一二区| 一级黄色录像在线观看| 中文成人在线| 欧美一区二区三区四区高清| 亚洲在线观看网站| 深夜福利一区| 精品久久久久久久久久久院品网| 色婷婷狠狠18禁久久| 一区二区三区四区视频免费观看| 日韩精品一区二区三区视频在线观看| 久久发布国产伦子伦精品| 一本一道久久a久久| 精品国产电影一区二区| 午夜一区二区三区免费| 色棕色天天综合网| www.日韩视频| 欧美人妻一区二区| 中文亚洲字幕| 国产精品福利在线观看| 一级做a爱片性色毛片| 国产精品一卡二卡| 九九九久久久| 国产精品久久久久久久龚玥菲 | 欧美亚洲一区二区在线观看| 色乱码一区二区三区在线| 伊人久久一区| 亚洲高清久久久久久| 精品少妇一区二区三区免费观| av在线不卡免费观看| 久久精品电影网站| 国产午夜精品无码一区二区| 久久综合导航| 91在线观看免费网站| 日韩有码第一页| 国产欧美日韩一区二区三区在线观看| 免费观看黄色大片| 免费高潮视频95在线观看网站| 欧美中文字幕不卡| 亚洲性图第一页| 国产一区二区电影在线观看| 久久6免费高清热精品| 西西44rtwww国产精品| 美国三级日本三级久久99| 草莓视频一区| 超碰国产在线观看| 亚洲午夜影视影院在线观看| 不卡av免费在线| 这里视频有精品| 亚洲色图第一页| 毛片a片免费观看| 日韩精品一级中文字幕精品视频免费观看| 91亚洲精品在线观看| 四虎影视在线观看2413| 亚洲视频免费看| 少妇高清精品毛片在线视频 | 黑人巨大精品欧美一区二区小视频| 好男人免费精品视频| 亚洲一区二区美女| 五月天中文字幕在线| 天堂综合网久久| 欧美美最猛性xxxxxx| 中文字幕观看在线| 99国产精品一区| 人妻无码一区二区三区四区| 国产精品久久乐| 亚洲精品自拍偷拍| 久久免费黄色网址| 激情欧美日韩一区二区| 日本不卡在线播放| 性欧美xxx69hd高清| 亚洲精品在线观看网站| 一区二区国产精品精华液| 丝袜a∨在线一区二区三区不卡| 国产精品传媒毛片三区| 成年人黄视频在线观看| 欧美日韩免费观看一区二区三区| ass精品国模裸体欣赏pics| 午夜精品久久久久99热蜜桃导演| 国产欧美在线视频| 在线激情免费视频| 欧美午夜精品一区二区蜜桃| 青青草福利视频| 免费欧美在线| 欧美成人蜜桃| 少妇视频一区| 国产午夜精品久久久 | 欧美伊人久久大香线蕉综合69| 日本黄色录像片| 在线免费观看欧美| 国产在线播放一区二区| av电影在线地址| 精品福利一二区| 在线看成人av| 91色在线porny| 亚洲精品无码久久久久久| 欧美一级色片| 日本最新高清不卡中文字幕| 黄色美女网站在线观看| 色婷婷久久久综合中文字幕| 亚洲一区视频在线播放| 欧美aⅴ一区二区三区视频| 日韩欧美视频一区二区三区四区| 日韩精品三区| 自拍偷拍亚洲一区| 国产精品无码免费播放 | 亚洲精品一区二区三| 懂色aⅴ精品一区二区三区| x99av成人免费| av中文在线观看| 亚洲大片免费看| 国产精品一区二区入口九绯色| 国产一区二区精品| 日韩国产在线一区| 日本免费成人| 久久久爽爽爽美女图片| 无码h黄肉3d动漫在线观看| 日韩欧美精品免费在线| 99久久99久久精品免费| 国产一区二区三区在线观看免费| 妞干网视频在线观看| 亚洲a级精品| 国产精品尤物福利片在线观看| 韩国中文字幕在线| 亚洲国产精品99| 激情网站在线观看| 亚洲欧美日韩在线播放| 国产a级黄色片| 日韩福利电影在线观看| 中文字幕第一页亚洲| 极品一区美女高清| 国产精品老牛影院在线观看| 午夜dj在线观看高清视频完整版| 亚洲精品国产品国语在线| 天天操天天干天天摸| 亚洲精品视频在线看| 五月开心播播网| 久久99久久99小草精品免视看| 日韩精品一区二区三区四| 久久综合亚洲| 99超碰麻豆| 91大神在线观看线路一区| 久久久久久久999| 91se在线| 精品视频久久久久久| 国产乱码精品一区二区三区精东| 欧美视频在线观看免费网址| 超碰手机在线观看| 国产日韩精品视频一区| 日本一级大毛片a一| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产日本在线播放| 围产精品久久久久久久| 蜜桃欧美视频| 极品国产人妖chinesets亚洲人妖| 91精品国产综合久久香蕉922 | 午夜激情一区二区三区| 国产中文av在线| 国产三级三级三级精品8ⅰ区| 日韩大尺度视频| 久久丁香综合五月国产三级网站| 91黄色小网站| 伊人成人在线| 99久re热视频精品98| 国产伦精品一区二区三区千人斩| 国产精品av一区| 国产精品一区二区精品| 国产精品网址在线| yw.尤物在线精品视频| 91sa在线看| 51漫画成人app入口| 欧美成人午夜激情在线| 欧美精品hd| 中文字幕日韩在线视频| 国产精品秘入口| 亚洲欧洲成视频免费观看| 无码国产精品高潮久久99| 日韩欧美一级精品久久| 国产伦精品一区二区三区免.费| 欧美午夜影院一区| 自拍偷拍第八页| 在线观看日韩国产| 亚洲欧美一区二区三区在线观看| 偷拍日韩校园综合在线| www.天天色| 亚洲成av人片在线| 久久精品无码人妻| 亚洲一区二区三区国产| 精品在线视频观看| 一区av在线播放| 免费又黄又爽又色的视频| 亚洲精选免费视频| 情侣偷拍对白清晰饥渴难耐| 中文字幕一区在线| 暗呦丨小u女国产精品| 综合久久久久综合| 在线免费观看亚洲视频| 亚洲综合视频在线观看| 国产乱码久久久久久| 亚洲成国产人片在线观看| 日本一区二区免费在线观看| 精品久久久香蕉免费精品视频| 日韩av一区二区在线播放| 欧美日韩中文在线| 国产一卡二卡三卡| 777色狠狠一区二区三区| 99久久99久久久精品棕色圆| 日韩欧美国产不卡| 手机看片1024国产| 亚洲视频在线播放| 日本高清在线观看wwwww色| 久久九九国产精品怡红院| 羞羞的视频在线看| 午夜精品久久久久久久99黑人| 一根才成人网| 国产综合久久久久| 福利在线一区| 日韩国产美国| 艳女tv在线观看国产一区| 国产精品视频网站在线观看| 亚洲综合国产| 日韩中文字幕a| 国产成人午夜电影网| 三叶草欧洲码在线| 中文字幕在线不卡一区| 国产第一页第二页| 欧洲一区二区三区在线| 国产婷婷在线视频| 日韩hd视频在线观看| 成人免费高清在线播放| 欧美美女15p| av在线日韩| 高清不卡一区二区三区| 女厕嘘嘘一区二区在线播放| 亚洲乱码一区二区三区三上悠亚| 午夜欧美精品| 国产日韩成人内射视频| 成人性生交大合| 久久久久久久毛片| 亚洲综合色噜噜狠狠| 亚洲色成人www永久网站| 日韩一级在线观看| 黄色av网站在线| 欧美成人一二三| 99亚洲伊人久久精品影院| 国产精品v欧美精品v日韩精品| 国产一区二区三区四区五区传媒| www.18av.com| 毛片av一区二区| 中文人妻一区二区三区| 亚洲精品国产精华液| 免费看污视频的网站| 亚洲第五色综合网| 国产三区视频在线观看| 国产精品草莓在线免费观看| 国产成人在线中文字幕| 黄色一级片网址| 视频一区二区三区中文字幕| 久久久老熟女一区二区三区91| 国产精品久久久久久久岛一牛影视| 亚洲精品午夜国产va久久成人| 欧美一区二区在线视频| av播放在线观看| 日本一区二区在线播放| 麻豆一区一区三区四区| 男人日女人的bb| 精品一区二区在线播放| 中文字幕黄色网址| 色噜噜狠狠成人中文综合| 深夜福利视频网站| 久久久伊人日本| 99re6热只有精品免费观看| 一区二区三区四区五区精品| 日韩成人av影视| 亚洲一区视频在线播放| 日韩欧美在线国产| 飘雪影院手机免费高清版在线观看| 欧美黑人性生活视频| 久久精品一级| 亚洲五码在线观看视频| 国产一区二区三区四| 中日韩一级黄色片| 91精品久久久久久久99蜜桃| 麻豆视频网站在线观看| 91精品视频在线看| 亚洲男女av一区二区| 日韩成人av免费| 最新热久久免费视频| 中文字幕在线2019| 中文字幕欧美视频在线| 粉嫩av一区二区三区四区五区| 亚洲高清资源综合久久精品| 免费看精品久久片| 日本少妇aaa| 日韩精品自拍偷拍| 国产99re66在线视频| 国产精品国产三级欧美二区| 亚洲国产专区| aa一级黄色片| 欧美又粗又大又爽| 日本电影在线观看网站| 亚洲xxxx18| 亚洲先锋成人| 加勒比精品视频| 在线免费不卡电影| 色欧美激情视频在线| 99se婷婷在线视频观看| 国产人成精品一区二区三| 亚洲第一成人网站| 欧美人妇做爰xxxⅹ性高电影| a毛片在线看免费观看| 国产伦精品一区二区三区视频黑人| 99精品热6080yy久久| 黄色三级生活片| 欧美一区国产二区| 国产在线精彩视频| 五月天亚洲综合| 国产精品888| 好看的av在线| 最近2019免费中文字幕视频三| 久久在线观看| 欧美一级在线看| 亚洲欧洲日韩综合一区二区| www.蜜臀av.com| 日韩av毛片网| 久久久久免费av| 亚洲第一黄色网址| 欧美喷水一区二区| 888av在线视频| 亚洲一区二区三区加勒比| 国产福利91精品| 波多野结衣视频网站| 久久综合电影一区| 少妇高潮一区二区三区| 波多野结衣国产精品| 欧美日韩精品二区| 成人在线免费看片| 美女被啪啪一区二区| 国产风韵犹存在线视精品| 69视频免费看| 欧美激情在线观看视频|