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

狠狠热免费视频| **国产精品| 日韩精品成人| 久久一夜天堂av一区二区三区| 在线精品高清中文字幕| 国产一区二区不卡视频在线观看| xxxxx在线观看| av网址在线播放| 国产调教一区二区三区| 国产精品午夜免费| 久久久久久久97| 天天综合网日韩| 欧美日韩在线精品一区二区三区激情综| 天天做天天爱天天爽综合网| 色88888久久久久久影院按摩| 国产精品xxxx| 国产极品国产极品| 久久精品国产福利| 国产日产欧产精品推荐色| 555www成人网| 久久久久亚洲无码| 2024最新电影在线免费观看| 91日韩在线专区| 久久久久国产精品一区| 中文天堂资源在线| 美脚恋feet久草欧美| 久久综合九色综合97_久久久| 国产精品一区二区三区免费视频| 日韩片在线观看| 77thz桃花论族在线观看| 国产大片一区二区| 九九久久国产精品| 在线观看免费看片| caopo在线| 粉嫩高潮美女一区二区三区| 欧美另类99xxxxx| 99精品欧美一区二区| 国产综合色在线观看| 欧美国产一区视频在线观看| 国产女人精品视频| 中文字幕高清在线免费播放| 国产一区二区三区不卡视频网站 | 91久久国产综合久久91| 香蕉久久精品日日躁夜夜躁| 午夜精品久久久久久久蜜桃app| 国产麻豆乱码精品一区二区三区| 97人人澡人人爽人人模亚洲| 首页亚洲中字| 精品国精品国产| 国产乱子伦农村叉叉叉| 精品三级久久久久久久电影聊斋| 日韩精品电影在线观看| 三级精品视频久久久久| 久久久久久久高清| 欧美人与禽猛交乱配| www.欧美色图| 国产精品成人v| 三级黄色录像视频| 91蜜桃臀久久一区二区| 色一情一伦一子一伦一区| 亚洲午夜在线观看| 成人福利小视频| 亚洲综合电影一区二区三区| 最新中文字幕亚洲| 成年人在线免费看片| 成人av国产| 亚洲精品一区二区三区影院 | 国产精品久久久久久成人| 成人永久在线| 午夜精品久久久久久久久久| 激情小视频网站| 邻居大乳一区二区三区| 久久免费看少妇高潮| 免费看成人午夜电影| 国产精品一区二区免费视频| 亚洲黑丝一区二区| 一区二区三区黄色| 久久久久亚洲AV成人无在| 视频在线不卡免费观看| 亚洲精品久久久一区二区三区 | 中文字幕精品视频在线| 91av一区| 午夜精品123| 欧美不卡在线播放| 免费人成在线观看播放视频 | 欧洲av在线精品| 人妻激情另类乱人伦人妻| 国产乱理伦片a级在线观看| 国产成人综合在线观看| 国产精品大全| 毛片在线播放网址| ㊣最新国产の精品bt伙计久久| 久久精品午夜一区二区福利| 国产又粗又黄又爽| 三级欧美韩日大片在线看| 欧美日韩成人黄色| 天堂网av手机版| 黄色日韩精品| 精品国产一区二区三区四区在线观看 | 日韩在线观看视频一区二区| 亚洲一区国产| 国产+成+人+亚洲欧洲| 亚洲怡红院在线观看| 国内精品久久久久久久影视蜜臀| 欧洲日韩成人av| 国产成人无码精品亚洲| 日韩电影在线一区二区| 97视频热人人精品| 91麻豆视频在线观看| 成人黄色a**站在线观看| 粉嫩av一区二区三区免费观看| 四虎精品成人影院观看地址| av不卡免费电影| 在线观看免费91| av在线电影观看| 久久精品这里都是精品| 久久综合九色99| 伊人在我在线看导航| 日本道色综合久久| 美女伦理水蜜桃4| 久久1电影院| 亚洲成人黄色在线观看| 国产精品成人无码专区| 999国产精品999久久久久久| 欧美亚州一区二区三区| www.久久久久久| 国产精品免费网站在线观看| 懂色av一区二区三区四区五区| 日本韩国在线视频爽| 中文字幕永久在线不卡| 午夜在线视频免费观看| 666av成人影院在线观看| 欧美亚洲动漫精品| 黄色一级免费大片| 激情久久一区二区| 国产网站欧美日韩免费精品在线观看 | 懂色av一区二区在线播放| 一本一本久久a久久精品综合妖精| 成人福利视频| 亚洲黄页视频免费观看| 国产真人真事毛片| 在线亚洲欧美| 国产精品99久久久久久人 | 国产91丝袜美女在线播放| 亚洲激情专区| 国产精品久久久久久免费观看| 黄网站在线播放| 亚洲一区二区在线播放相泽| 国产女大学生av| 国产精品jk白丝蜜臀av小说| 亚洲视频免费一区| 天天看天天摸天天操| 一区二区亚洲| 日本久久中文字幕| 一级片免费网站| 国产精品久久久久久久久免费丝袜| 手机在线免费观看毛片| 成人情趣视频网站| 国产精品久久一区主播| 亚洲成人黄色片| 久久精品一区二区三区不卡牛牛| 国产免费黄色av| 国产激情综合| 欧美国产精品va在线观看| 五月天激情四射| 成人国产精品免费观看视频| 国产精品一区二区免费在线观看| 免费看成人人体视频| 色妞色视频一区二区三区四区| 在线免费观看一级片| 成人黄色大片在线观看 | 麻豆高清免费国产一区| 97人人模人人爽人人喊38tv| 欧洲一区二区三区| 亚洲黄色片网站| 无码一区二区三区在线观看| 国产精品久久午夜| av天堂一区二区| 午夜在线视频一区二区区别| 三区精品视频| av电影一区| 国产午夜精品一区二区三区| 久一区二区三区| 久久99精品国产麻豆婷婷| 精品视频在线观看| 色婷婷av在线| 51精品视频一区二区三区| 亚洲欧洲久久久| 精品一区二区在线看| 国产精品久久国产| 在线看成人短视频| 久久久久久国产精品美女| 亚洲欧美日韩免费| 亚洲一二三四区| 国产精品成人一区二区三区电影毛片| 国产精品av一区二区| 成人精品视频99在线观看免费| 国产综合视频一区二区三区免费| 精品视频999| 久久久精品成人| 国产成人综合网| 成年人小视频网站| 亚洲欧美tv| 91沈先生在线观看| 欧美成人三区| 亚洲伦理中文字幕| www.av麻豆| 国产精品久久一级| 变态另类丨国产精品| 国产在线精品视频| 91制片厂免费观看| 国产精品欧美日韩一区| 91国产丝袜在线放| 欧美高清影院| 日韩免费中文字幕| 牛牛精品视频在线| 日韩色av导航| 成人午夜在线观看视频| 亚洲黄页视频免费观看| 超碰免费在线97| 欧美人xxxx| 在线免费看av网站| 国产亚洲综合在线| 99re久久精品国产| 日韩精品午夜视频| 国产精品久久..4399| 网红女主播少妇精品视频| 91热福利电影| 久久人体av| 国产精品久久91| 黄色亚洲网站| 2019亚洲日韩新视频| 国产探花视频在线观看| 亚洲成人中文字幕| av网站免费大全| 亚洲妇女屁股眼交7| 欧美黑人欧美精品刺激| 国产黄色精品视频| 熟妇无码乱子成人精品| 亚洲人成高清| 999一区二区三区| 午夜性色一区二区三区免费视频| 国产一区二区三区四区五区在线| 精品精品视频| 91精品国产成人| 1769在线观看| 欧美成人性战久久| 99久久国产热无码精品免费| 亚洲超碰精品一区二区| 久久久精品国产sm调教网站| 一区二区三区中文字幕在线观看| 三级黄色片网站| 波多野结衣在线一区| 美女久久久久久久久| 成人av网站在线观看免费| 永久免费未满蜜桃| caoporen国产精品视频| 中文字幕影片免费在线观看| 91麻豆精品秘密| 欧美 日韩 国产 成人 在线观看| 日本一区二区三区四区| 欧美88888| 91麻豆免费看| 熟女俱乐部一区二区| 久久精品亚洲精品国产欧美| 日本一卡二卡在线播放| 国产精品久久久久久久久免费丝袜 | 美女国内精品自产拍在线播放| 天堂网www中文在线| 亚洲老头老太hd| av小片在线| 不卡av在线播放| 粉嫩av在线播放| 视频直播国产精品| 伊人福利在线| 91精品国产成人| 国产精品黄色片| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美三级网址| 久久久久久久久中文字幕| 成人三级小说| 日本91av在线播放| 中文字幕综合| 久久国产手机看片| 欧美电影三区| 国产美女在线一区| 日韩精品视频网站| 国产精品91av| 国产麻豆精品95视频| 欧美特黄aaa| 男女男精品视频| 午夜精品在线免费观看| 国产一区二区三区不卡在线观看| 在线免费观看污视频| 国产精品美女久久久久aⅴ| 久久久精品91| 欧美男同性恋视频网站| 中文字幕日本人妻久久久免费 | 中文字幕av在线一区二区三区| 激情五月婷婷在线| 亚洲美女视频在线| 免费中文字幕日韩| 欧美日韩在线视频首页| 黄视频网站免费看| 亚洲成a人v欧美综合天堂下载| 91丨九色丨海角社区| 欧美中文一区二区三区| 成人高潮片免费视频| 色综合亚洲精品激情狠狠| 77thz桃花论族在线观看| 成人激情视频在线| 国内精品久久久久久久影视简单 | 校园春色亚洲色图| 国产精品美女黄网| 亚洲国产精品日韩专区av有中文| 亚洲一区二区三区精品动漫| 日韩午夜电影| 亚洲视频在线不卡| 国产精品三级视频| 色av性av丰满av| 亚洲国产成人精品一区二区| 91一区二区三区在线| 国产精品网站入口| 久操成人av| 亚洲视频sss| 乱码第一页成人| 国产区二区三区| 26uuu精品一区二区| 国产又大又黑又粗免费视频| 日韩欧美卡一卡二| 亚洲av激情无码专区在线播放| 麻豆乱码国产一区二区三区| 成人在线视频免费看| 欧美一区二区三区精美影视| 99久久.com| 天天色综合天天色| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品白浆一区二小说| 日韩欧美在线1卡| 乱人伦中文视频在线| 国产在线精品一区免费香蕉 | 神马午夜精品91| 欧美午夜电影网| 福利成人在线观看| 国产精品国内视频| 成人亚洲一区| 国产一区二区在线免费播放| 国产欧美日韩三级| 中文字幕一区2区3区| 色婷婷综合久久久久中文字幕1| 深夜视频一区二区| 亚洲精品一区二| 18成人免费观看视频| 中文字幕一区二区三区乱码不卡| 亚洲综合av网| 日韩精选在线观看| 尤物yw午夜国产精品视频明星| 高清在线一区| 99精品一区二区三区的区别| 亚洲欧美日韩国产一区| 成人午夜精品无码区| 精品久久久久久亚洲国产300| 在线视频你懂得| 日韩亚洲欧美成人| 亚洲天堂网站| 亚洲色成人www永久在线观看| 91在线观看高清| 日本中文字幕免费在线观看| 日韩免费视频线观看| 国产三级电影在线播放| 91色精品视频在线| 午夜国产精品视频| a天堂视频在线观看| 在线精品亚洲一区二区不卡| 免费在线看黄网站| 国产经典一区二区三区 | 亚洲在线视频网站| 天堂在线中文资源| 国产日韩在线视频| 在线不卡亚洲| 亚洲av毛片基地| 日韩欧美色综合网站| 激情开心成人网| 日本三级福利片| 久久综合九色综合97_久久久| 在线观看中文字幕码| 性欧美亚洲xxxx乳在线观看| 精品一区二区三区中文字幕在线 | 亚洲一区电影在线观看| 精品国产sm最大网站免费看| 都市激情综合| wwwjizzjizzcom| 精品中文字幕一区二区| 精品无码久久久久久久久| 伊人av综合网| 911亚洲精品| 91大学生片黄在线观看| 91麻豆成人久久精品二区三区| 国产老女人乱淫免费| 日本欧美国产在线|