日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库事务的概念及其实现原理

發布時間:2024/7/23 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库事务的概念及其实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1. 認識事務
    • 1.1 為什么需要數據庫事務
    • 1.2 什么是數據庫事務
    • 1.3 事務如何解決問題
    • 1.4 事務的ACID特性以及實現原理概述
  • 2.并發異常與并發控制技術
    • 2.1 常見的并發異常
    • 2.2 事務的隔離級別
    • 2.3 事務隔離性的實現——常見的并發控制技術
      • 2.3.1 基于封鎖的并發控制
      • 2.3.2 基于時間戳的并發控制
      • 2.3.3 基于有效性檢查的并發控制
      • 2.3.4 基于快照隔離的并發控制
      • 2.3.5 關于并發控制技術的總結
  • 3. 故障與故障恢復技術
    • 3.1 為什么需要故障恢復技術
    • 3.2 事務的執行過程以及可能產生的問題
    • 3.3 日志的種類和格式
    • 3.4 日志恢復的核心思想
    • 3.5 事務故障中止/正常回滾的恢復流程
    • 3.6 系統崩潰時的恢復過程(帶檢查點)
      • 3.6.1 一個系統崩潰恢復的例子
  • 4. 總結
  • 5. 參考資料


事務是數據庫系統中的重要概念,了解這一概念是以正確的方式開發和數據庫交互的應用程序的前提。但是很多開發者對于事務的認識相對片面和膚淺,僅僅把它等同于ACID,不了解數據庫系統引入事務的真正動機,ACID對于事務意味著什么以及最重要的:數據庫系統是如何保證事務的ACID特性的?
因為最近在導師手下做一個微服務和分布式事務相關的課題項目,作為必要的前置準備,需要加深下對單機事務的認識并理解其實現原理。這篇文章是在我給組內的小伙伴分享的PPT的基礎上改動而成,旨在幫助大家建立關于事務的相對體系的認識。由于當時正好趕上考試周,所以寫的比較倉促,里面肯定有理解不到位甚至出錯的地方,希望看到的小伙伴能夠我指出來。同時還需強調幾點:

  • 以下所有內容都是針對單機事務而言,不涉及分布式事務相關的東西!
  • 關于事務原理的講解不針對具體的某個數據庫實現,所以某些地方可能和你的實踐經驗不符。

1. 認識事務

1.1 為什么需要數據庫事務

轉賬是生活中常見的操作,比如從A賬戶轉賬100元到B賬號。站在用戶角度而言,這是一個邏輯上的單一操作,然而在數據庫系統中,至少會分成兩個步驟來完成:

  • 1.將A賬戶的金額減少100元
  • 2.將B賬戶的金額增加100元。

在這個過程中可能會出現以下問題:

  • 1.轉賬操作的第一步執行成功,A賬戶上的錢減少了100元,但是第二步執行失敗或者未執行便發生系統崩潰,導致B賬戶并沒有相應增加100元。
  • 2.轉賬操作剛完成就發生系統崩潰,系統重啟恢復時丟失了崩潰前的轉賬記錄。
  • 3.同時又另一個用戶轉賬給B賬戶,由于同時對B賬戶進行操作,導致B賬戶金額出現異常。

為了便于解決這些問題,需要引入數據庫事務的概念。

1.2 什么是數據庫事務

定義:數據庫事務是構成單一邏輯工作單元的操作集合
一個典型的數據庫事務如下所示

BEGIN TRANSACTION //事務開始 SQL1 SQL2 COMMIT/ROLLBACK //事務提交或回滾

關于事務的定義有幾點需要解釋下:

  • 1.數據庫事務可以包含一個或多個數據庫操作,但這些操作構成一個邏輯上的整體。
  • 2.構成邏輯整體的這些數據庫操作,要么全部執行成功,要么全部不執行。
  • 3.構成事務的所有操作,要么全都對數據庫產生影響,要么全都不產生影響,即不管事務是否執行成功,數據庫總能保持一致性狀態。
  • 4.以上即使在數據庫出現故障以及并發事務存在的情況下依然成立。

1.3 事務如何解決問題

對于上面的轉賬例子,可以將轉賬相關的所有操作包含在一個事務中

BEGIN TRANSACTION A賬戶減少100元 B賬戶增加100元 COMMIT
  • 1.當數據庫操作失敗或者系統出現崩潰,系統能夠以事務為邊界進行恢復,不會出現A賬戶金額減少而B賬戶未增加的情況。
  • 2.當有多個用戶同時操作數據庫時,數據庫能夠以事務為單位進行并發控制,使多個用戶對B賬戶的轉賬操作相互隔離。

事務使系統能夠更方便的進行故障恢復以及并發控制,從而保證數據庫狀態的一致性。

1.4 事務的ACID特性以及實現原理概述

原子性(Atomicity):事務中的所有操作作為一個整體像原子一樣不可分割,要么全部成功,要么全部失敗。

一致性(Consistency):事務的執行結果必須使數據庫從一個一致性狀態到另一個一致性狀態。一致性狀態是指:1.系統的狀態滿足數據的完整性約束(主碼,參照完整性,check約束等) 2.系統的狀態反應數據庫本應描述的現實世界的真實狀態,比如轉賬前后兩個賬戶的金額總和應該保持不變。

隔離性(Isolation):并發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時一樣。比如多個用戶同時往一個賬戶轉賬,最后賬戶的結果應該和他們按先后次序轉賬的結果一樣。

持久性(Durability):事務一旦提交,其對數據庫的更新就是持久的。任何事務或系統故障都不會導致數據丟失。

在事務的ACID特性中,C即一致性是事務的根本追求,而對數據一致性的破壞主要來自兩個方面

  • 1.事務的并發執行
  • 2.事務故障或系統故障

數據庫系統是通過并發控制技術和日志恢復技術來避免這種情況發生的。

并發控制技術保證了事務的隔離性,使數據庫的一致性狀態不會因為并發執行的操作被破壞。
日志恢復技術保證了事務的原子性,使一致性狀態不會因事務或系統故障被破壞。同時使已提交的對數據庫的修改不會因系統崩潰而丟失,保證了事務的持久性。

2.并發異常與并發控制技術

2.1 常見的并發異常

在講解并發控制技術前,先簡單介紹下數據庫常見的并發異常。

  • 臟寫
    臟寫是指事務回滾了其他事務對數據項的已提交修改,比如下面這種情況

在事務1對數據A的回滾,導致事務2對A的已提交修改也被回滾了。

  • 丟失更新
    丟失更新是指事務覆蓋了其他事務對數據的已提交修改,導致這些修改好像丟失了一樣。

事務1和事務2讀取A的值都為10,事務2先將A加上10并提交修改,之后事務2將A減少10并提交修改,A的值最后為,導致事務2對A的修改好像丟失了一樣

  • 臟讀
    臟讀是指一個事務讀取了另一個事務未提交的數據

在事務1對A的處理過程中,事務2讀取了A的值,但之后事務1回滾,導致事務2讀取的A是未提交的臟數據。

  • 不可重復讀
    不可重復讀是指一個事務對同一數據的讀取結果前后不一致。臟讀和不可重復讀的區別在于:前者讀取的是事務未提交的臟數據,后者讀取的是事務已經提交的數據,只不過因為數據被其他事務修改過導致前后兩次讀取的結果不一樣,比如下面這種情況

由于事務2對A的已提交修改,事務1前后兩次讀取的結果不一致。

  • 幻讀
    幻讀是指事務讀取某個范圍的數據時,因為其他事務的操作導致前后兩次讀取的結果不一致。幻讀和不可重復讀的區別在于,不可重復讀是針對確定的某一行數據而言,而幻讀是針對不確定的多行數據。因而幻讀通常出現在帶有查詢條件的范圍查詢中,比如下面這種情況:

事務1查詢A<5的數據,由于事務2插入了一條A=4的數據,導致事務1兩次查詢得到的結果不一樣

2.2 事務的隔離級別

  • 事務具有隔離性,理論上來說事務之間的執行不應該相互產生影響,其對數據庫的影響應該和它們串行執行時一樣。

  • 然而完全的隔離性會導致系統并發性能很低,降低對資源的利用率,因而實際上對隔離性的要求會有所放寬,這也會一定程度造成對數據庫一致性要求降低

  • SQL標準為事務定義了不同的隔離級別,從低到高依次是

    • 讀未提交(READ UNCOMMITTED)
    • 讀已提交(READ COMMITTED)
    • 可重復讀(REPEATABLE READ)
    • 串行化(SERIALIZABLE)

    事務的隔離級別越低,可能出現的并發異常越多,但是通常而言系統能提供的并發能力越強。

    不同的隔離級別與可能的并發異常的對應情況如下表所示,有一點需要強調,這種對應關系只是理論上的,對于特定的數據庫實現不一定準確,比如mysql
    的Innodb存儲引擎通過Next-Key Locking技術在可重復讀級別就消除了幻讀的可能。

    所有事務隔離級別都不允許出現臟寫,而串行化可以避免所有可能出現的并發異常,但是會極大的降低系統的并發處理能力。

    2.3 事務隔離性的實現——常見的并發控制技術

    并發控制技術是實現事務隔離性以及不同隔離級別的關鍵,實現方式有很多,按照其對可能沖突的操作采取的不同策略可以分為樂觀并發控制和悲觀并發控制兩大類。

    • 樂觀并發控制:對于并發執行可能沖突的操作,假定其不會真的沖突,允許并發執行,直到真正發生沖突時才去解決沖突,比如讓事務回滾。

    • 悲觀并發控制:對于并發執行可能沖突的操作,假定其必定發生沖突,通過讓事務等待(鎖)或者中止(時間戳排序)的方式使并行的操作串行執行。

    2.3.1 基于封鎖的并發控制

    核心思想:對于并發可能沖突的操作,比如讀-寫,寫-讀,寫-寫,通過鎖使它們互斥執行。
    鎖通常分為共享鎖和排他鎖兩種類型

    • 1.共享鎖(S):事務T對數據A加共享鎖,其他事務只能對A加共享鎖但不能加排他鎖。
    • 2.排他鎖(X):事務T對數據A加排他鎖,其他事務對A既不能加共享鎖也不能加排他鎖

    基于鎖的并發控制流程:

  • 事務根據自己對數據項進行的操作類型申請相應的鎖(讀申請共享鎖,寫申請排他鎖)

  • 申請鎖的請求被發送給鎖管理器。鎖管理器根據當前數據項是否已經有鎖以及申請的和持有的鎖是否沖突決定是否為該請求授予鎖。

  • 若鎖被授予,則申請鎖的事務可以繼續執行;若被拒絕,則申請鎖的事務將進行等待,直到鎖被其他事務釋放。

  • 可能出現的問題:

    • 死鎖:多個事務持有鎖并互相循環等待其他事務的鎖導致所有事務都無法繼續執行。

    • 饑餓:數據項A一直被加共享鎖,導致事務一直無法獲取A的排他鎖。

    對于可能發生沖突的并發操作,鎖使它們由并行變為串行執行,是一種悲觀的并發控制。

    2.3.2 基于時間戳的并發控制

    核心思想:對于并發可能沖突的操作,基于時間戳排序規則選定某事務繼續執行,其他事務回滾。

    系統會在每個事務開始時賦予其一個時間戳,這個時間戳可以是系統時鐘也可以是一個不斷累加的計數器值,當事務回滾時會為其賦予一個新的時間戳,先開始的事務時間戳小于后開始事務的時間戳。

    每一個數據項Q有兩個時間戳相關的字段:
    W-timestamp(Q):成功執行write(Q)的所有事務的最大時間戳
    R-timestamp(Q):成功執行read(Q)的所有事務的最大時間戳

    時間戳排序規則如下:

  • 假設事務T發出read(Q),T的時間戳為TS
    a.若TS(T)<W-timestamp(Q),則T需要讀入的Q已被覆蓋。此
    read操作將被拒絕,T回滾。
    b.若TS(T)>=W-timestamp(Q),則執行read操作,同時把
    R-timestamp(Q)設置為TS(T)與R-timestamp(Q)中的最大值

  • 假設事務T發出write(Q)
    a.若TS(T)<R-timestamp(Q),write操作被拒絕,T回滾。
    b.若TS(T)<W-timestamp(Q),則write操作被拒絕,T回滾。
    c.其他情況:系統執行write操作,將W-timestamp(Q)設置
    為TS(T)。

  • 基于時間戳排序和基于鎖實現的本質一樣:對于可能沖突的并發操作,以串行的方式取代并發執行,因而它也是一種悲觀并發控制。它們的區別主要有兩點:

    • 基于鎖是讓沖突的事務進行等待,而基于時間戳排序是讓沖突的事務回滾。
    • 基于鎖沖突事務的執行次序是根據它們申請鎖的順序,先申請的先執行;而基于時間戳排序是根據特定的時間戳排序規則。

    2.3.3 基于有效性檢查的并發控制

    核心思想:事務對數據的更新首先在自己的工作空間進行,等到要寫回數據庫時才進行有效性檢查,對不符合要求的事務進行回滾。

    基于有效性檢查的事務執行過程會被分為三個階段:

  • 讀階段:數據項被讀入并保存在事務的局部變量中。所有write操作都是對局部變量進行,并不對數據庫進行真正的更新。

  • 有效性檢查階段:對事務進行有效性檢查,判斷是否可以執行write操作而不違反可串行性。如果失敗,則回滾該事務。

  • 寫階段:事務已通過有效性檢查,則將臨時變量中的結果更新到數據庫中。

  • 有效性檢查通常也是通過對事務的時間戳進行比較完成的,不過和基于時間戳排序的規則不一樣。

    該方法允許可能沖突的操作并發執行,因為每個事務操作的都是自己工作空間的局部變量,直到有效性檢查階段發現了沖突才回滾。因而這是一種樂觀的并發策略。

    2.3.4 基于快照隔離的并發控制

    快照隔離是多版本并發控制(mvcc)的一種實現方式。

    其核心思想是:數據庫為每個數據項維護多個版本(快照),每個事務只對屬于自己的私有快照進行更新,在事務真正提交前進行有效性檢查,使得事務正常提交更新或者失敗回滾。

    由于快照隔離導致事務看不到其他事務對數據項的更新,為了避免出現丟失更新問題,可以采用以下兩種方案避免:

    • 先提交者獲勝:對于執行該檢查的事務T,判斷是否有其他事務已經將更新寫入數據庫,是則T回滾否則T正常提交。

    • 先更新者獲勝:通過鎖機制保證第一個獲得鎖的事務提交其更新,之后試圖更新的事務中止。

    事務間可能沖突的操作通過數據項的不同版本的快照相互隔離,到真正要寫入數據庫時才進行沖突檢測。因而這也是一種樂觀并發控制。

    2.3.5 關于并發控制技術的總結

    以上只是對常見的幾種并發控制技術進行了介紹,不涉及特別復雜的原理的講解。之所以這么做一是要真的把原理和實現細節講清楚需要涉及的東西太多,篇幅太長,從作者和讀者角度而言都不是一件輕松的事,所以只對其實現的核心思想和實現要點進行了簡單的介紹,其他部分就一筆帶過了。二是并發控制的實現的方式太過多樣,基于封鎖的實現就有很多變體,mvcc多版本并發控制的實現方式就更是多樣,而且很多時候會和其他并發控制方式比如封鎖的方式結合起來使用。

    3. 故障與故障恢復技術

    3.1 為什么需要故障恢復技術

    數據庫運行過程中可能會出現故障,這些故障包括事務故障和系統故障兩大類

    • 事務故障:比如非法輸入,系統出現死鎖,導致事務無法繼續執行。
    • 系統故障:比如由于軟件漏洞或硬件錯誤導致系統崩潰或中止。

    這些故障可能會對事務和數據庫狀態造成破壞,因而必須提供一種技術來對各種故障進行恢復,保證數據庫一致性,事務的原子性以及持久性。數據庫通常以日志的方式記錄數據庫的操作從而在故障時進行恢復,因而可以稱之為日志恢復技術。

    3.2 事務的執行過程以及可能產生的問題

    事務的執行過程可以簡化如下:

  • 系統會為每個事務開辟一個私有工作區

  • 事務讀操作將從磁盤中拷貝數據項到工作區中,在執行寫操作前所有的更新都作用于工作區中的拷貝.

  • 事務的寫操作將把數據輸出到內存的緩沖區中,等到合適的時間再由緩沖區管理器將數據寫入到磁盤。

  • 由于數據庫存在立即修改和延遲修改,所以在事務執行過程中可能存在以下情況:

    • 在事務提交前出現故障,但是事務對數據庫的部分修改已經寫入磁盤數據庫中。這導致了事務的原子性被破壞。
    • 在系統崩潰前事務已經提交,但數據還在內存緩沖區中,沒有寫入磁盤。系統恢復時將丟失此次已提交的修改。這是對事務持久性的破壞。

    3.3 日志的種類和格式

    • <T,X,V1,V2>:描述一次數據庫寫操作,T是執行寫操作的事務的唯一標識,X是要寫的數據項,V1是數據項的舊值,V2是數據項的新值。

    • <T,X,V1>:對數據庫寫操作的撤銷操作,將事務T的X數據項恢復為舊值V1。在事務恢復階段插入。

    • <T start>: 事務T開始

    • <T commit>: 事務T提交

    • <T abort>: 事務T中止

    關于日志,有以下兩條規則

    • 1.系統在對數據庫進行修改前會在日志文件末尾追加相應的日志記錄。
    • 2.當一個事務的commit日志記錄寫入到磁盤成功后,稱這個事務已提交,但事務所做的修改可能并未寫入磁盤

    3.4 日志恢復的核心思想

    • 撤銷事務undo:將事務更新的所有數據項恢復為日志中的舊值,事務撤銷完畢時將插入一條<T abort>記錄。

    • 重做事務redo:將事務更新的所有數據項恢復為日志中的新值。

    事務正常回滾/因事務故障中止將進行redo
    系統從崩潰中恢復時將先進行redo再進行undo。

    以下事務將進行undo:日志中只包括<T start>記錄,但既不包括<T commit>記錄也不包括<T abort>記錄.

    以下事務將進行redo:日志中包括<T start>記錄,也包括<T commit>記錄或<T abort>記錄。

    假設系統從崩潰中恢復時日志記錄如下

    <T0 start> <T0,A,1000,950> <T0,B,2000,2050> <T0 commit> <T1 start> <T1,C,700,600>

    由于T0既有start記錄又有commit記錄,將會對事務T0進行重做,執行相應的redo操作。
    由于T1只有start記錄,將會對T1進行撤銷,執行相應的undo操作,撤銷完畢將寫入一條abort記錄。

    3.5 事務故障中止/正常回滾的恢復流程

  • 從后往前掃描日志,對于事務T的每個形如<T,X,V1,V2>的記錄,將舊值V1寫入數據項X中。

  • 往日志中寫一個特殊的只讀記錄<T,X,V1>,表示將數據項恢復成舊值V1,
    這是一個只讀的補償記錄,不需要根據它進行undo。

  • 一旦發現了<T start>日志記錄,就停止繼續掃描,并往日志中寫一個
    <T abort>日志記錄。

  • 3.6 系統崩潰時的恢復過程(帶檢查點)

    檢查點是形如<checkpoint L>的特殊的日志記錄,L是寫入檢查點記錄時還未提交的事務的集合,系統保證在檢查點之前已經提交的事務對數據庫的修改已經寫入磁盤,不需要進行redo。檢查點可以加快恢復的過程。

    系統奔潰時的恢復過程分為兩個階段:重做階段和撤銷階段。

    重做階段:

  • 系統從最后一個檢查點開始正向的掃描日志,將要重做的事務的列表undo-list設置為檢查點日志記錄中的L列表。

  • 發現<T,X,V1,V2>的更新記錄或<T,X,V>的補償撤銷記錄,就重做該操作。

  • 發現<T start>記錄,就把T加入到undo-list中。

  • 發現<T abort>或<T commit>記錄,就把T從undo-list中去除。

  • 撤銷階段:

  • 系統從尾部開始反向掃描日志

  • 發現屬于undo-list中的事務的日志記錄,就執行undo操作

  • 發現undo-list中事務的T的<T start>記錄,就寫入一條<T abort>記錄,
    并把T從undo-list中去除。

  • 4.undo-list為空,則撤銷階段結束

    總結:先將日志記錄中所有事務的更新按順序重做一遍,在針對需要撤銷的事務按相反的順序執行其更新操作的撤銷操作。

    3.6.1 一個系統崩潰恢復的例子

    恢復前的日志如下,寫入最后一條日志記錄后系統崩潰

    <T0 start> <T0,B,2000,2050> <T2 commit> <T1 start> <checkpoint {T0,T1}> //之前T2已經commit,故不用重做 <T1,C,700,600> <T1 commit> <T2 start> <T2,A,500,400> <T0,B,2000> <T0 abort> //T0回滾完成,插入該記錄后系統崩潰

    4. 總結

    事務是數據庫系統進行并發控制的基本單位,是數據庫系統進行故障恢復的基本單位,從而也是保持數據庫狀態一致性的基本單位。ACID是事務的基本特性,數據庫系統是通過并發控制技術和日志恢復技術來對事務的ACID進行保證的,從而可以得到如下的關于數據庫事務的概念體系結構。

    5. 參考資料

    《數據庫系統概論》
    《數據庫系統概念》

    總結

    以上是生活随笔為你收集整理的数据库事务的概念及其实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 丝袜诱惑一区二区 | 波多野结衣大片 | 特大巨交吊性xxxx | 少妇毛片一区二区三区粉嫩av | 综合色av | 四虎av网站| 在线爱情大片免费观看大全 | 国产高清精品在线观看 | 日韩av一级片 | 欧美字幕 | 高h喷水荡肉少妇爽多p视频 | 成人日韩视频 | 97精品熟女少妇一区二区三区 | 精品国产96亚洲一区二区三区 | 亚洲视频导航 | 久久一线 | 中国人妖和人妖做爰 | www.youjizz.com日本| 香蕉中文网| 国产成人精品a视频一区 | 三级黄网站 | 成人久久久 | 久久这里只有精品6 | 日韩成人免费在线 | 日本寂寞少妇 | 久久午夜精品 | 亚洲区av| 91视频免费| 91se在线| 欧美日韩免费高清 | 99精品欧美一区二区三区综合在线 | 日本三区视频 | www,xxx69 japan | 2018自拍偷拍 | 夜夜摸夜夜爽 | 丝袜脚交国产在线观看 | 黄色日b片| 一卡二卡三卡四卡在线 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 人妻无码一区二区三区久久 | 99久久久国产精品无码免费 | 在线观看免费观看在线 | 亚洲第8页| 精品欧美日韩 | 国产91九色 | 亚洲第一国产 | 国产中文字幕在线 | 视频一区日韩 | 亚洲精品免费在线视频 | 中出在线视频 | 国产麻豆免费观看 | 免费看欧美一级片 | 欧美高清二区 | 久久亚洲精品视频 | 国产高清免费观看 | av片毛片| 三级免费网址 | 精品一区二区在线免费观看 | 99热超碰在线 | 五月天一区二区三区 | 高清三区| av影库| 亚洲综合自拍偷拍 | 亚洲精品不卡 | 四虎网站| 精品亚洲一区二区三区四区五区高 | 成人午夜影片 | 粉嫩av一区二区三区免费观看 | 亚洲欧美日韩另类 | 成人一区二区三区仙踪林 | 国产aaa毛片 | 亚洲综合射 | 天天弄天天操 | 久久久久久免费视频 | 成年午夜视频 | 日本福利片在线观看 | 免费黄色美女网站 | 亚洲第一综合网站 | 亚洲高清视频网站 | 亚洲精品乱码久久久久久久久久久久 | a∨色狠狠一区二区三区 | 国产睡熟迷奷系列精品视频 | 欧洲中文字幕日韩精品成人 | 国产福利视频一区 | 国产永久毛片 | 精品黑人一区二区三区国语馆 | 91蝌蚪91密月 | 麻豆视频在线 | 91久久影院 | 狠狠干人人干 | 激情开心站 | 杨幂一区二区三区免费看视频 | 欧美一区二区三区电影 | 亚洲精品一区二三区 | 一区二区三区免费在线观看 | 欧美成人精品一区二区男人小说 | 欧美三级韩国三级日本三斤 | 黄色一大片 | 91人人看|