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

項目再也不怕異常!Spring Boot 3 帶你優(yōu)雅實現(xiàn)事務(wù)回滾 + 自動重試機制!

開發(fā) 前端
如果你掌握了?Spring Boot 3 的事務(wù)回滾 + 重試一體化實踐,這一切都能優(yōu)雅解決。?本文將帶你一步步實現(xiàn)這種高可用機制——讓系統(tǒng)在失敗后自動“自愈”,事務(wù)回滾、自動重試、失敗補償一氣呵成。

在復雜的分布式業(yè)務(wù)中,事務(wù)異常與短暫性失敗是不可避免的: 網(wǎng)絡(luò)閃斷、鎖沖突、樂觀鎖更新失敗、數(shù)據(jù)庫連接暫時不可用……這些“小意外”往往導致整個操作失敗,甚至引發(fā)數(shù)據(jù)不一致。

但如果你掌握了 Spring Boot 3 的事務(wù)回滾 + 重試一體化實踐,這一切都能優(yōu)雅解決。 本文將帶你一步步實現(xiàn)這種高可用機制——讓系統(tǒng)在失敗后自動“自愈”,事務(wù)回滾、自動重試、失敗補償一氣呵成。

一體化核心思想:Transactional × Retryable

在 Spring 體系中:

  • @Transactional 管理數(shù)據(jù)庫事務(wù),保障原子性,出現(xiàn)異常時回滾;
  • @Retryable 提供自動重試機制,針對臨時性錯誤(如鎖沖突、超時、瞬時失聯(lián))進行重試;
  • 當兩者組合時,每次重試都會創(chuàng)建一個全新的事務(wù)環(huán)境。

核心思想一句話概括:

@Retryable 在外,@Transactional 在內(nèi)。 每次重試都是全新的事務(wù),失敗即回滾,直到成功或觸發(fā) @Recover 補償。

Maven 依賴配置

<dependencies>
    <!-- Spring Boot 數(shù)據(jù)層支持(包含事務(wù)管理) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>


    <!-- Spring Retry:自動重試支持 -->
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>2.0.12</version>
    </dependency>


    <!-- AOP 切面支持(Retry 基于 AOP 實現(xiàn)) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

啟用重試與應用啟動類

路徑:/src/main/java/com/icoderoad/Application.java

package com.icoderoad;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;


@SpringBootApplication
@EnableRetry  // 啟用 Spring Retry 功能
public class TransactionalRetryApplication {
    public static void main(String[] args) {
        SpringApplication.run(TransactionalRetryApplication.class, args);
    }
}

切面執(zhí)行順序:

@Retryable → 捕獲異常并觸發(fā)重試
@Transactional → 每次嘗試都在新事務(wù)內(nèi)

也就是說:重試的不是 SQL,而是整個事務(wù)方法。

領(lǐng)域模型定義

路徑:/src/main/java/com/icoderoad/domain/Order.java

package com.icoderoad.domain;


import jakarta.persistence.*;
import lombok.Data;
import java.math.BigDecimal;


@Data
@Entity
@Table(name = "t_order", uniqueConstraints = {
    @UniqueConstraint(name = "uk_order_req_id", columnNames = {"client_request_id"})
})
public class Order {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(name = "client_request_id", nullable = false, updatable = false)
    private String clientRequestId; // 冪等請求ID


    private Long productId;
    private Integer quantity;
    private BigDecimal amount;


    @Version
    private Long version; // 樂觀鎖版本號


    private String status;
}

核心服務(wù)層:事務(wù) + 自動重試 + 失敗補償

路徑:/src/main/java/com/icoderoad/service/OrderService.java

package com.icoderoad.service;


import com.icoderoad.domain.Order;
import com.icoderoad.repository.OrderRepository;
import com.icoderoad.request.OrderRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.*;
import org.springframework.retry.annotation.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Slf4j
@Service
@RequiredArgsConstructor
public class OrderService {


    private final OrderRepository orderRepository;
    private final InventoryService inventoryService;


    /**
     * 下單事務(wù)方法:支持自動重試與事務(wù)回滾
     */
    @Retryable(
        retryFor = {
            ObjectOptimisticLockingFailureException.class,
            DeadlockLoserDataAccessException.class,
            CannotAcquireLockException.class,
            TransientDataAccessResourceException.class
        },
        noRetryFor = { IllegalArgumentException.class },
        maxAttempts = 3,
        backoff = @Backoff(delay = 2000, multiplier = 2.0, maxDelay = 10000)
    )
    @Transactional
    public Order placeOrder(OrderRequest request) {
        log.info("執(zhí)行下單事務(wù),reqId={}", request.getClientRequestId());


        // 冪等性防重復
        return orderRepository.findByClientRequestId(request.getClientRequestId())
            .orElseGet(() -> {
                Order order = new Order();
                order.setClientRequestId(request.getClientRequestId());
                order.setProductId(request.getProductId());
                order.setQuantity(request.getQuantity());
                order.setStatus("CREATED");


                Order saved = orderRepository.save(order);
                inventoryService.reduceStock(request.getProductId(), request.getQuantity());
                return saved;
            });
    }


    /**
     * 當所有重試失敗后執(zhí)行的兜底邏輯
     */
    @Recover
    public Order placeOrderFallback(Exception e, OrderRequest request) {
        log.error("下單失敗,reqId={},錯誤={}", request.getClientRequestId(), e.getMessage(), e);
        throw new RuntimeException("系統(tǒng)繁忙,請稍后再試", e);
    }
}

 每次失敗都會觸發(fā)事務(wù)回滾,每次重試重新開啟事務(wù),最終進入 @Recover 執(zhí)行補償邏輯。

冪等性與安全性設(shè)計

要讓重試機制安全有效,必須防止數(shù)據(jù)重復寫入。常見策略包括:

策略

說明

唯一約束

通過數(shù)據(jù)庫唯一鍵防止重復插入,如 client_request_id

狀態(tài)機控制

限制狀態(tài)流轉(zhuǎn),避免重復更新

請求去重表

記錄請求 ID,攔截重復提交

令牌機制

客戶端發(fā)起請求時生成唯一 token

實踐注意事項

  • 冪等性是前提:否則重試會導致重復下單。
  • 只重試瞬時異常:業(yè)務(wù)邏輯錯誤(如庫存不足)不應重試。
  • 方法必須 public:否則切面不生效。
  • AOP 自調(diào)用無效:必須由外部 Bean 調(diào)用觸發(fā)。
  • @Recover 參數(shù)規(guī)則:第一個為異常類型,其余與原方法一致。

并發(fā)測試驗證

路徑:/src/test/java/com/icoderoad/service/OrderServiceIT.java

package com.icoderoad.service;


import com.icoderoad.domain.Order;
import com.icoderoad.request.OrderRequest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


import java.util.concurrent.*;


import static org.junit.jupiter.api.Assertions.assertEquals;


@SpringBootTest
class OrderServiceIT {


    @Autowired
    OrderService orderService;


    @Test
    void should_retry_and_return_same_order_when_conflict() throws Exception {
        String reqId = "REQ-" + System.nanoTime();
        ExecutorService pool = Executors.newFixedThreadPool(2);


        Callable<Order> task = () -> orderService.placeOrder(new OrderRequest(reqId, 1001L, 1));
        Order o1 = pool.submit(task).get();
        Order o2 = pool.submit(task).get();


        assertEquals(o1.getId(), o2.getId());
    }
}

測試模擬樂觀鎖沖突,通過并發(fā)觸發(fā)重試邏輯,驗證事務(wù)一致性與冪等性。

完整可運行示例:事務(wù) + 重試 + 補償

(1) 主應用類

/src/main/java/com/icoderoad/TransactionalRetryDemoApplication.java
package com.icoderoad;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;


@SpringBootApplication
@EnableRetry
public class TransactionalRetryDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(TransactionalRetryDemoApplication.class, args);
    }
}

(2) DTO 類

/src/main/java/com/icoderoad/dto/OrderDTO.java
package com.icoderoad.dto;


public record OrderRequest(String productId, int quantity, double price) {}
public record OrderResponse(String orderId, String status, String message) {}

(3) 控制層

/src/main/java/com/icoderoad/controller/OrderController.java
package com.icoderoad.controller;


import com.icoderoad.dto.*;
import com.icoderoad.service.OrderService;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/orders")
public class OrderController {


    private final OrderService orderService;
    public OrderController(OrderService orderService) { this.orderService = orderService; }


    @PostMapping
    public OrderResponse createOrder(@RequestBody OrderRequest request) {
        try {
            String orderId = orderService.placeOrder(request);
            return new OrderResponse(orderId, "SUCCESS", "Order created successfully");
        } catch (Exception e) {
            return new OrderResponse(null, "FAILED", "Failed to create order: " + e.getMessage());
        }
    }
}

(4) Service 層(事務(wù) + 重試 + 補償)

路徑:/src/main/java/com/icoderoad/service/OrderService.java

package com.icoderoad.service;


import org.springframework.dao.DataAccessException;
import org.springframework.retry.annotation.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import javax.sql.DataSource;
import java.sql.*;
import java.util.Random;
import java.util.UUID;


@Service
public class OrderService {


    private final DataSource dataSource;
    private final Random random = new Random();


    public OrderService(DataSource dataSource) {
        this.dataSource = dataSource;
    }


    @Retryable(
        value = {SQLException.class, DataAccessException.class},
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2.0)
    )
    @Transactional(rollbackFor = Exception.class)
    public String placeOrder(com.icoderoad.dto.OrderRequest request) throws SQLException {
        System.out.println("Processing order for product: " + request.productId());


        // 模擬臨時性數(shù)據(jù)庫故障
        if (random.nextDouble() < 0.3) {
            throw new SQLException("Database temporarily unavailable");
        }


        String orderId = UUID.randomUUID().toString();
        try (Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement(
                     "INSERT INTO orders (id, product_id, quantity, price) VALUES (?, ?, ?, ?)")) {


            stmt.setString(1, orderId);
            stmt.setString(2, request.productId());
            stmt.setInt(3, request.quantity());
            stmt.setDouble(4, request.price());
            stmt.executeUpdate();


            updateInventory(request.productId(), request.quantity());
            return orderId;
        }
    }


    private void updateInventory(String productId, int quantity) throws SQLException {
        try (Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement(
                     "UPDATE inventory SET stock = stock - ? WHERE product_id = ?")) {
            stmt.setInt(1, quantity);
            stmt.setString(2, productId);
            int rows = stmt.executeUpdate();
            if (rows == 0) throw new SQLException("Product not found: " + productId);


            // 模擬庫存鎖沖突
            if (random.nextDouble() < 0.1) {
                throw new SQLException("Inventory lock timeout");
            }
        }
    }


    @Recover
    public String recover(Exception e, com.icoderoad.dto.OrderRequest request) {
        System.err.println("All retries failed for order: " + request);
        System.err.println("Cause: " + e.getMessage());
        try (Connection conn = dataSource.getConnection();
             PreparedStatement stmt = conn.prepareStatement(
                     "INSERT INTO failed_orders (product_id, quantity, price, reason) VALUES (?, ?, ?, ?)")) {
            stmt.setString(1, request.productId());
            stmt.setInt(2, request.quantity());
            stmt.setDouble(3, request.price());
            stmt.setString(4, e.getMessage());
            stmt.executeUpdate();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

(5) 配置文件

/src/main/resources/application.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.mode=embedded
spring.jpa.show-sql=true
spring.h2.console.enabled=true

(6) 數(shù)據(jù)庫初始化腳本

/src/main/resources/schema.sql
CREATE TABLE IF NOT EXISTS orders (
    id VARCHAR(255) PRIMARY KEY,
    product_id VARCHAR(255),
    quantity INT,
    price DOUBLE
);


CREATE TABLE IF NOT EXISTS inventory (
    product_id VARCHAR(255) PRIMARY KEY,
    stock INT
);


CREATE TABLE IF NOT EXISTS failed_orders (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id VARCHAR(255),
    quantity INT,
    price DOUBLE,
    reason VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


INSERT INTO inventory (product_id, stock) VALUES ('prod-001', 100);
INSERT INTO inventory (product_id, stock) VALUES ('prod-002', 50);

API 測試示例

curl -X POST http://localhost:8080/orders \
 -H "Content-Type: application/json" \
 -d '{"productId":"prod-001","quantity":2,"price":29.99}'

控制臺將打印重試與回滾日志,全過程可觀測。

結(jié)語:讓系統(tǒng)具備「自我修復」能力

在高并發(fā)與分布式系統(tǒng)中,瞬時性失敗不可避免。 通過 @Transactional + @Retryable + @Recover 的組合, 我們?yōu)閼脴?gòu)建了一套自愈型事務(wù)機制:

  • 每次重試都在獨立事務(wù)中執(zhí)行;
  • 失敗即回滾,無副作用;
  • 重試窮盡后進入兜底邏輯;
  • 冪等保障防止重復寫入。

這種一體化模式讓你的 Spring Boot 項目在面對異常時更加穩(wěn)健, 不只是“報錯重來”,而是真正實現(xiàn)——優(yōu)雅回滾、智能重試、可恢復的事務(wù)執(zhí)行機制。

責任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2023-10-27 08:20:12

springboot微服務(wù)

2025-02-28 09:47:36

2009-07-20 18:11:52

iBATIS事務(wù)Spring

2024-01-04 18:01:55

高并發(fā)SpringBoot

2025-09-30 01:55:00

SpringWebClientHTTP

2021-02-20 10:02:22

Spring重試機制Java

2025-04-18 03:00:00

2021-04-22 07:49:51

Vue3Vue2.xVue3.x

2022-11-14 08:19:59

重試機制Kafka

2024-09-25 08:32:05

2020-04-30 10:24:35

Spring循環(huán)依賴Java

2025-10-17 07:33:14

SpringEdgeTTS語音合成

2022-05-06 07:44:10

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

2022-10-26 07:14:25

Spring 6Spring業(yè)務(wù)

2022-10-31 11:10:49

Javavolatile變量

2021-08-12 11:05:07

C++語言內(nèi)存泄露

2020-04-20 15:00:22

DevOps工具代碼

2014-07-18 15:54:04

goTenna:隨身無

2022-04-14 10:22:30

NginxLinux

2020-05-07 09:05:22

電腦Python代碼
點贊
收藏

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

亚洲欧洲国产日本综合| 亚洲一区 二区 三区| 欧美午夜久久久| 玛丽玛丽电影原版免费观看1977| 中文文字幕一区二区三三| 天天精品视频| 日韩精品亚洲视频| xxxx在线免费观看| 97se综合| 亚洲日本青草视频在线怡红院| 好吊色欧美一区二区三区视频| 超碰在线97观看| 黄色国产精品| 中文字幕亚洲综合久久| 国产xxxx视频| 成人短视频软件网站大全app| 黄网站色欧美视频| 国风产精品一区二区| 国产黄色免费在线观看| 成人免费精品视频| 成人高清视频观看www| 免费视频久久久| 黄色在线成人| 久久亚洲精品国产亚洲老地址| 三叶草欧洲码在线| 亚洲精品国产九九九| 欧美日本高清视频在线观看| 成人观看免费完整观看| 97人人在线视频| 怡红院av一区二区三区| 伊人久久大香线蕉成人综合网| 成人免费xxxxx在线观看| 久久久久噜噜噜亚洲熟女综合| 日韩国产专区| 亚洲色图偷窥自拍| 色婷婷免费视频| 风间由美性色一区二区三区四区 | 91论坛在线播放| 7777精品久久久大香线蕉小说| 在线观看一二三区| 日本午夜一本久久久综合| 91精品国产91久久久久久吃药| 国产女人被狂躁到高潮小说| 婷婷中文字幕一区| 色多多国产成人永久免费网站| 在哪里可以看毛片| 色综合综合网| 亚洲视频在线免费看| www.久久av| 免费欧美激情| 亚洲人成在线观看| av黄色在线免费观看| 久久成人av| 亚洲午夜精品久久久久久久久久久久| aa片在线观看视频在线播放| 小说区图片区色综合区| 国产视频一区在线| 国产精品久久久久无码av色戒| 亚洲精品合集| 亚洲视频在线观看| 日本精品久久久久中文| 热久久天天拍国产| www.欧美精品| 亚洲天堂黄色片| 国产精品地址| 97碰在线观看| 免费又黄又爽又猛大片午夜| 男女激情视频一区| 91免费版网站入口| 丰满人妻一区二区三区免费| 99久久精品免费| 日本一区视频在线播放| 五月婷婷在线视频| 一区二区三区在线观看网站| 91精品国产综合久久蜜臀| 日韩精品久久一区| 黄色av电影在线观看| 亚洲国产三级在线| 国产精品99久久免费黑人人妻| 国产成人精品免高潮在线观看 | 国产成人免费| 在线免费一区三区| 九九热精品国产| 超碰精品在线| 亚洲天堂男人的天堂| chinese全程对白| 91久久夜色精品国产按摩| 社区色欧美激情 | 欧美爱爱小视频| 香蕉久久a毛片| 91精品久久久久久久久久久久久| www久久久com| 国产婷婷一区二区| a级片一区二区| 中文字幕在线官网| 6080午夜不卡| 亚洲熟妇无码av| 女同性一区二区三区人了人一| 69影院欧美专区视频| 国产精品久久久久久久一区二区| 成人激情视频网站| 中文字幕精品—区二区日日骚| 黄色成人在线网| 欧美日韩国产综合一区二区三区| 欧美性生交xxxxx| 久久综合电影| 奇米四色中文综合久久| 亚洲经典一区二区三区| 国产精品天干天干在观线| 久久久久久www| 国产一区二区三区四区五区六区| 精品极品在线| 911精品产国品一二三产区| 瑟瑟视频在线观看| 欧美视频官网| 成人黄色生活片| 九九九伊在人线综合| 亚洲国产日韩精品| 亚洲成人手机在线观看| 成人免费电影网址| 777精品视频| 蜜桃在线一区二区| 一区二区三区四区在线| 爱爱爱爱免费视频| 精品理论电影在线| 欧美亚洲国产日本| 懂色av一区二区三区四区| 亚洲九九爱视频| 欧美美女一级片| 成人看的视频| 国产黑人绿帽在线第一区| 色综合视频在线| 亚洲香蕉伊在人在线观| 91网址在线观看精品| 91九色精品| 国产欧美一区二区三区四区| 黄色av网站在线免费观看| 欧美视频第一页| 久久偷拍免费视频| 国产一区导航| 精品免费国产| 密臀av在线播放| 亚洲精品久久久久中文字幕二区 | 欧美成熟视频| 亚洲一区二区三区香蕉| 国产在线二区| 91麻豆精品国产综合久久久久久| 免费成人深夜蜜桃视频| 日本成人超碰在线观看| 婷婷久久五月天| 激情小说亚洲| 日韩一级裸体免费视频| 91女人18毛片水多国产| 亚洲欧美日韩久久| 无码人妻少妇色欲av一区二区| 91精品国产自产拍在线观看蜜| 91精品国产综合久久香蕉的用户体验 | 精品一区二区三区在线播放视频 | 欧美在线视频不卡| 黄色av免费播放| 九色综合狠狠综合久久| 中文字幕中文字幕在线中一区高清| 国产资源一区| 美女999久久久精品视频 | 一本大道亚洲视频| 中文字幕在线观看免费| 亚洲视频在线观看一区| 丰满少妇xbxb毛片日本| 亚洲专区一区二区三区| 亚欧美在线观看| 久久99久久人婷婷精品综合| 国产精品久久久久久久久久ktv| 91caoporn在线| 91精品婷婷国产综合久久竹菊| 久久精品www| 91亚洲精品一区二区乱码| 丁香婷婷激情网| 99欧美视频| 国产精品手机视频| 欧美三级精品| 欧美国产日韩在线| 日本ー区在线视频| 777久久久精品| 日韩精品视频免费播放| 国产欧美精品一区二区色综合朱莉| 自拍偷拍21p| 好看的av在线不卡观看| 欧美美乳视频网站在线观看| 亚洲黑人在线| 欧美中文在线观看国产| 色影视在线观看| 亚洲精品福利在线观看| 97免费观看视频| 欧美日韩国产一区中文午夜| 欧美日韩生活片| 97久久久精品综合88久久| 欧美日韩一区二区三区69堂| 亚洲精品资源| 综合色婷婷一区二区亚洲欧美国产| 国产精品sss在线观看av| 国产精品美乳一区二区免费| 牛牛精品在线| 久久精品电影网站| 久久伊伊香蕉| 亚洲精品一区二区三区99| 亚洲无码精品国产| 亚洲网站在线| 亚洲黄色在线观看| 国产精品毛片一区二区在线看舒淇| 午夜精品久久久久久久久久| 神马午夜精品91| 国产亚洲精品免费| 日本黄色录像片| 国产福利视频一区二区三区| 欧美一级特黄a| 亚洲欧美日韩视频二区| 国产片侵犯亲女视频播放| 97精品视频在线看| 色姑娘综合网| 小说区图片区色综合区| 国产乱码一区| 中文字幕日韩在线| 91欧美精品成人综合在线观看| 91精品影视| 欧美在线激情网| 阿v视频在线| 午夜精品在线视频| 国产黄色大片在线观看| 欧美成人精品xxx| 日本免费在线视频| 日韩中文字幕精品| 91露出在线| 中文字幕久热精品在线视频 | 亚洲欧美国产va在线影院| 欧美亚洲精品在线观看| 精品91自产拍在线观看一区| 性猛交xxxx乱大交孕妇印度| 91精品国产美女浴室洗澡无遮挡| 中文字字幕在线中文乱码| 欧美性三三影院| 国产裸体美女永久免费无遮挡| 日本韩国一区二区三区视频| 丁香社区五月天| 91极品美女在线| 免费看av在线| 欧美精品一二三区| 97免费观看视频| 日韩欧美精品三级| 少妇一级淫片免费看| 亚洲国产精品人久久电影| 色哟哟中文字幕| 亚洲欧美日韩高清| av免费观看一区二区| www日韩欧美| 污污的网站在线免费观看| 欧美丰满片xxx777| 日韩脚交footjobhd| 国产成人精品在线播放| 久久av日韩| 99re在线播放| 欧亚精品一区| 日本午夜一区二区三区| 婷婷久久综合| 成人午夜免费在线视频| 亚洲天堂男人av| 国产区在线观看成人精品| 91狠狠综合久久久久久| 亚洲免费资源在线播放| 四虎成人精品永久免费av| 一本大道久久精品懂色aⅴ | 凹凸国产熟女精品视频| 美日韩精品视频| 欧美在线aaa| 国产成人av福利| 大地资源二中文在线影视观看| 欧美激情一区二区三区在线| 日韩一级片大全| 精品久久久久人成| 一二三四区在线| 日韩午夜av一区| 手机在线观看免费av| 一个人看的www久久| 最新日本在线观看| 青青草原一区二区| 一级欧美视频| 久久久久久久久四区三区| 婷婷亚洲图片| 无码人妻丰满熟妇区毛片18| 国产综合久久久久久久久久久久| xfplay5566色资源网站| 国产精品视频观看| 加勒比婷婷色综合久久| 色婷婷久久综合| 亚洲第一免费视频| 在线日韩第一页| 女海盗2成人h版中文字幕| 成人免费福利在线| 国产a久久精品一区二区三区| avove在线观看| 视频一区在线播放| 人妻 丝袜美腿 中文字幕| 中文文精品字幕一区二区| 国产成人精品亚洲男人的天堂| 欧美精品一卡两卡| 欧美新色视频| 久久久久久久网站| 9999精品视频| 性欧美videosex高清少妇| 影音先锋亚洲精品| 中文字幕视频三区| 国产精品入口麻豆九色| 亚洲第一在线播放| 欧美成人a在线| 91中文在线| 国产原创欧美精品| 欧美中文一区二区| 苍井空浴缸大战猛男120分钟| 成人免费三级在线| 欧美成人一二三区| 日韩一区二区三区在线| 日本不卡不卡| 国产一区红桃视频| 成人影院在线| 91热这里只有精品| 久久嫩草精品久久久精品一| 澳门黄色一级片| 91精品国产全国免费观看| 91sp网站在线观看入口| 99re6这里只有精品视频在线观看| 国产精品久久久久久久av福利| 国产欧美日韩卡一| 国产一区二区视频免费| 亚洲精品视频网上网址在线观看| av在线资源| 黑人巨大精品欧美一区二区小视频 | 欧美精品一区二区三区久久久 | 国产91免费看片| 亚洲天堂日韩在线| av片中文字幕| 国产三区在线成人av| 天码人妻一区二区三区在线看| 日韩av有码在线| 新版的欧美在线视频| 欧美精品一区二区三区在线看午夜| 免费久久99精品国产自在现线| 亚洲av无码国产精品久久| 欧美日韩免费在线| 国产在线色视频| 国产精品啪视频| 国产精品成人a在线观看| 天天干天天色天天干| 亚洲色欲色欲www| 国产区精品在线| 欧美国产日韩二区| 日本欧美三级| 最近免费中文字幕中文高清百度| 国产欧美一区二区精品性色| 伊人网免费视频| 久久久999国产| 99re6热只有精品免费观看| 国产 日韩 欧美在线| 久久夜色精品一区| 国产偷人爽久久久久久老妇app| 日韩亚洲精品电影| 免费欧美网站| 91专区在线观看| 欧美激情综合五月色丁香| 国产精选久久久| 韩国国内大量揄拍精品视频| 欧美猛男同性videos| 午夜天堂在线视频| 性久久久久久久久| 国产露出视频在线观看| 91精品视频免费看| 雨宫琴音一区二区在线| 在哪里可以看毛片| 日韩欧美中文一区| 裤袜国产欧美精品一区| 国产高潮呻吟久久久| www.亚洲精品| 中文无码av一区二区三区| 欧美国产日韩xxxxx| 国产剧情一区| 91精品国产高清91久久久久久 | 亚洲欧美国产毛片在线| 手机看片一区二区| 91精品国产综合久久香蕉| 亚洲精品乱码| 欧美一级特黄高清视频| 亚洲高清一二三区| 国产原创一区| 欧美国产亚洲一区| 亚洲免费在线观看视频| 黄上黄在线观看| 国产精品国产精品国产专区蜜臀ah| av高清一区| 色诱女教师一区二区三区| 五月亚洲婷婷| 在线观看亚洲色图| 欧美日韩精品二区|