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

一文說盡MySQL事務及ACID特性的實現原理

原創
數據庫 MySQL
事務是 MySQL 等關系型數據庫區別于 NoSQL 的重要方面,是保證數據一致性的重要手段。

【51CTO.com原創稿件】事務是 MySQL 等關系型數據庫區別于 NoSQL 的重要方面,是保證數據一致性的重要手段。

本文將首先介紹 MySQL 事務相關的基礎概念,然后介紹事務的 ACID 特性,并分析其實現原理。MySQL 博大精深,文章疏漏之處在所難免,歡迎批評指正。

MySQL 事務基礎概念

事務(Transaction)是訪問和更新數據庫的程序執行單元;事務中可能包含一個或多個 sql 語句,這些語句要么都執行,要么都不執行。

作為一個關系型數據庫,MySQL 支持事務,本文介紹基于 MySQL 5.6。首先回顧一下 MySQL 事務的基礎知識。

邏輯架構和存儲引擎

 

如上圖所示,MySQL 服務器邏輯架構從上往下可以分為三層:

  • 第一層:處理客戶端連接、授權認證等。
  • 第二層:服務器層,負責查詢語句的解析、優化、緩存以及內置函數的實現、存儲過程等。
  • 第三層:存儲引擎,負責 MySQL 中數據的存儲和提取。MySQL 中服務器層不管理事務,事務是由存儲引擎實現的。

MySQL 支持事務的存儲引擎有 InnoDB、NDB Cluster 等,其中 InnoDB 的使用最為廣泛;其他存儲引擎不支持事務,如 MyIsam、Memory 等。

如無特殊說明,后文中描述的內容都是基于 InnoDB。

提交和回滾

典型的 MySQL 事務是如下操作的:

  1. start transaction
  2. ……  #一條或多條sql語句 
  3. commit

其中 start transaction 標識事務開始,commit 提交事務,將執行結果寫入到數據庫。

如果 sql 語句執行出現問題,會調用 rollback,回滾所有已經執行成功的 sql 語句。當然,也可以在事務中直接使用 rollback 語句進行回滾。

自動提交

MySQL 中默認采用的是自動提交(autocommit)模式,如下所示:

 

在自動提交模式下,如果沒有 start transaction 顯式地開始一個事務,那么每個 sql 語句都會被當做一個事務執行提交操作。

通過如下方式,可以關閉 autocommit;需要注意的是,autocommit 參數是針對連接的,在一個連接中修改了參數,不會對其他連接產生影響。

 

如果關閉了 autocommit,則所有的 sql 語句都在一個事務中,直到執行了 commit 或 rollback,該事務結束,同時開始了另外一個事務。

特殊操作

在 MySQL 中,存在一些特殊的命令,如果在事務中執行了這些命令,會馬上強制執行 commit 提交事務;如 DDL 語句(create table/drop table/alter/table)、lock tables 語句等等。

不過,常用的 select、insert、update 和 delete 命令,都不會強制提交事務。

ACID 特性

ACID 是衡量事務的四個特性:

  • 原子性(Atomicity,或稱不可分割性)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

按照嚴格的標準,只有同時滿足 ACID 特性才是事務;但是在各大數據庫廠商的實現中,真正滿足 ACID 的事務少之又少。

例如 MySQL 的 NDB Cluster 事務不滿足持久性和隔離性;InnoDB 默認事務隔離級別是可重復讀,不滿足隔離性;Oracle 默認的事務隔離級別為 READ COMMITTED,不滿足隔離性……

因此與其說 ACID 是事務必須滿足的條件,不如說它們是衡量事務的四個維度。

下面將詳細介紹 ACID 特性及其實現原理,為了便于理解,介紹的順序不是嚴格按照 A-C-I-D。

ACID 特性及其實現原理

原子性

定義

原子性是指一個事務是一個不可分割的工作單位,其中的操作要么都做,要么都不做。

如果事務中一個 sql 語句執行失敗,則已執行的語句也必須回滾,數據庫退回到事務前的狀態。

實現原理:undo log

在說明原子性原理之前,首先介紹一下 MySQL 的事務日志。MySQL 的日志有很多種,如二進制日志、錯誤日志、查詢日志、慢查詢日志等。

此外 InnoDB 存儲引擎還提供了兩種事務日志:

  • redo log(重做日志)
  • undo log(回滾日志)

其中 redo log 用于保證事務持久性;undo log 則是事務原子性和隔離性實現的基礎。

下面說回 undo log。實現原子性的關鍵,是當事務回滾時能夠撤銷所有已經成功執行的 sql 語句。

InnoDB 實現回滾,靠的是 undo log:

  • 當事務對數據庫進行修改時,InnoDB 會生成對應的 undo log。
  • 如果事務執行失敗或調用了 rollback,導致事務需要回滾,便可以利用 undo log 中的信息將數據回滾到修改之前的樣子。

undo log 屬于邏輯日志,它記錄的是 sql 執行相關的信息。當發生回滾時,InnoDB 會根據 undo log 的內容做與之前相反的工作:

  • 對于每個 insert,回滾時會執行 delete。
  • 對于每個 delete,回滾時會執行 insert。
  • 對于每個 update,回滾時會執行一個相反的 update,把數據改回去。

以 update 操作為例:當事務執行 update 時,其生成的 undo log 中會包含被修改行的主鍵(以便知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息,回滾時便可以使用這些信息將數據還原到 update 之前的狀態。

持久性

定義

持久性是指事務一旦提交,它對數據庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

實現原理:redo log

redo log 和 undo log 都屬于 InnoDB 的事務日志。下面先聊一下 redo log 存在的背景。

InnoDB 作為 MySQL 的存儲引擎,數據是存放在磁盤中的,但如果每次讀寫數據都需要磁盤 IO,效率會很低。

為此,InnoDB 提供了緩存(Buffer Pool),Buffer Pool 中包含了磁盤中部分數據頁的映射,作為訪問數據庫的緩沖:

  • 當從數據庫讀取數據時,會首先從 Buffer Pool 中讀取,如果 Buffer Pool 中沒有,則從磁盤讀取后放入 Buffer Pool。
  • 當向數據庫寫入數據時,會首先寫入 Buffer Pool,Buffer Pool 中修改的數據會定期刷新到磁盤中(這一過程稱為刷臟)。

Buffer Pool 的使用大大提高了讀寫數據的效率,但是也帶來了新的問題:如果 MySQL 宕機,而此時 Buffer Pool 中修改的數據還沒有刷新到磁盤,就會導致數據的丟失,事務的持久性無法保證。

于是,redo log 被引入來解決這個問題:當數據修改時,除了修改 Buffer Pool 中的數據,還會在 redo log 記錄這次操作;當事務提交時,會調用 fsync 接口對 redo log 進行刷盤。

如果 MySQL 宕機,重啟時可以讀取 redo log 中的數據,對數據庫進行恢復。

redo log 采用的是 WAL(Write-ahead logging,預寫式日志),所有修改先寫入日志,再更新到 Buffer Pool,保證了數據不會因 MySQL 宕機而丟失,從而滿足了持久性要求。

既然 redo log 也需要在事務提交時將日志寫入磁盤,為什么它比直接將 Buffer Pool 中修改的數據寫入磁盤(即刷臟)要快呢?

主要有以下兩方面的原因:

  • 刷臟是隨機 IO,因為每次修改的數據位置隨機,但寫 redo log 是追加操作,屬于順序 IO。
  • 刷臟是以數據頁(Page)為單位的,MySQL 默認頁大小是 16KB,一個 Page 上一個小修改都要整頁寫入;而 redo log 中只包含真正需要寫入的部分,無效 IO 大大減少。

redo log 與 binlog

我們知道,在 MySQL 中還存在 binlog(二進制日志)也可以記錄寫操作并用于數據的恢復,但二者是有著根本的不同的。

作用不同:

  • redo log 是用于 crash recovery 的,保證 MySQL 宕機也不會影響持久性;
  • binlog 是用于 point-in-time recovery 的,保證服務器可以基于時間點恢復數據,此外 binlog 還用于主從復制。

層次不同:

  • redo log 是 InnoDB 存儲引擎實現的,
  • 而 binlog 是 MySQL 的服務器層(可以參考文章前面對 MySQL 邏輯架構的介紹)實現的,同時支持 InnoDB 和其他存儲引擎。

內容不同:

  • redo log 是物理日志,內容基于磁盤的 Page。
  • binlog 是邏輯日志,內容是一條條 sql。

寫入時機不同:

  • redo log 的寫入時機相對多元。前面曾提到,當事務提交時會調用 fsync 對 redo log 進行刷盤;這是默認情況下的策略,修改 innodb_flush_log_at_trx_commit 參數可以改變該策略,但事務的持久性將無法保證。

除了事務提交時,還有其他刷盤時機:如 master thread 每秒刷盤一次 redo log 等,這樣的好處是不一定要等到 commit 時刷盤,commit 速度大大加快。

  • binlog 在事務提交時寫入。

隔離性

定義

與原子性、持久性側重于研究事務本身不同,隔離性研究的是不同事務之間的相互影響。

隔離性是指事務內部的操作與其他事務是隔離的,并發執行的各個事務之間不能互相干擾。

嚴格的隔離性,對應了事務隔離級別中的 Serializable(可串行化),但實際應用中出于性能方面的考慮很少會使用可串行化。

隔離性追求的是并發情形下事務之間互不干擾。簡單起見,我們僅考慮最簡單的讀操作和寫操作(暫時不考慮帶鎖讀等特殊操作)。

那么隔離性的探討,主要可以分為兩個方面:

  • (一個事務)寫操作對(另一個事務)寫操作的影響:鎖機制保證隔離性。
  • (一個事務)寫操作對(另一個事務)讀操作的影響:MVCC 保證隔離性。

鎖機制

首先來看兩個事務的寫操作之間的相互影響。隔離性要求同一時刻只能有一個事務對數據進行寫操作,InnoDB 通過鎖機制來保證這一點。

鎖機制的基本原理可以概括為:

  • 事務在修改數據之前,需要先獲得相應的鎖。
  • 獲得鎖之后,事務便可以修改數據。
  • 該事務操作期間,這部分數據是鎖定的,其他事務如果需要修改數據,需要等待當前事務提交或回滾后釋放鎖。

行鎖與表鎖:按照粒度,鎖可以分為表鎖、行鎖以及其他位于二者之間的鎖。

表鎖在操作數據時會鎖定整張表,并發性能較差;行鎖則只鎖定需要操作的數據,并發性能好。

但是由于加鎖本身需要消耗資源(獲得鎖、檢查鎖、釋放鎖等都需要消耗資源),因此在鎖定數據較多情況下使用表鎖可以節省大量資源。

MySQL 中不同的存儲引擎支持的鎖是不一樣的,例如 MyIsam 只支持表鎖,而 InnoDB 同時支持表鎖和行鎖,且出于性能考慮,絕大多數情況下使用的都是行鎖。

如何查看鎖信息?有多種方法可以查看 InnoDB 中鎖的情況,例如:

  1. select * from information_schema.innodb_locks; #鎖的概況 
  2. show engine innodb status; #InnoDB整體狀態,其中包括鎖的情況 

下面來看一個例子:

  1. #在事務A中執行: 
  2. start transaction
  3. update account SET balance = 1000 where id = 1; 
  4. 在事務B中執行: 
  5. start transaction
  6. update account SET balance = 2000 where id = 1; 

此時查看鎖的情況:

 

show engine innodb status 查看鎖相關的部分:

 

通過上述命令可以查看事務 24052 和 24053 占用鎖的情況;其中 lock_type 為 RECORD,代表鎖為行鎖(記錄鎖);lock_mode 為 X,代表排它鎖(寫鎖)。

除了排它鎖(寫鎖)之外,MySQL 中還有共享鎖(讀鎖)的概念。由于本文重點是 MySQL 事務的實現原理,因此對鎖的介紹到此為止。

介紹完寫操作之間的相互影響,下面討論寫操作對讀操作的影響。

臟讀、不可重復讀和幻讀

首先來看并發情況下,讀操作可能存在的三類問題。

①臟讀:當前事務(A)中可以讀到其他事務(B)未提交的數據(臟數據),這種現象是臟讀。

舉例如下(以賬戶余額表為例):

 

②不可重復讀:在事務 A 中先后兩次讀取同一個數據,兩次讀取的結果不一樣,這種現象稱為不可重復讀。

臟讀與不可重復讀的區別在于:前者讀到的是其他事務未提交的數據,后者讀到的是其他事務已提交的數據。

舉例如下:

 

③幻讀:在事務 A 中按照某個條件先后兩次查詢數據庫,兩次查詢結果的條數不同,這種現象稱為幻讀。

不可重復讀與幻讀的區別可以通俗的理解為:前者是數據變了,后者是數據的行數變了。

舉例如下:

 

事務隔離級別

sql 標準中定義了四種隔離級別,并規定了每種隔離級別下上述幾個問題是否存在。

一般來說,隔離級別越低,系統開銷越低,可支持的并發越高,但隔離性也越差。

隔離級別與讀問題的關系如下:

 

在實際應用中,讀未提交在并發時會導致很多問題,而性能相對于其他隔離級別提高卻很有限,因此使用較少。

可串行化強制事務串行,并發效率很低,只有當對數據一致性要求極高且可以接受沒有并發時使用,因此使用也較少。

因此在大多數數據庫系統中,默認的隔離級別是讀已提交(如 Oracle)或可重復讀(后文簡稱 RR)。

可以通過如下兩個命令分別查看全局隔離級別和本次會話的隔離級別:

 

InnoDB 默認的隔離級別是 RR,后文會重點介紹 RR。需要注意的是,在 SQL 標準中,RR 是無法避免幻讀問題的,但是 InnoDB 實現的 RR 避免了幻讀問題。

MVCC

RR 解決臟讀、不可重復讀、幻讀等問題,使用的是 MVCC:MVCC 全稱 Multi-Version Concurrency Control,即多版本的并發控制協議。

下面的例子很好的體現了 MVCC 的特點:在同一時刻,不同的事務讀取到的數據可能是不同的(即多版本)——在 T5 時刻,事務 A 和事務 C 可以讀取到不同版本的數據。

 

MVCC 最大的優點是讀不加鎖,因此讀寫不沖突,并發性能好。InnoDB 實現 MVCC,多個版本的數據可以共存,主要是依靠數據的隱藏列(也可以稱之為標記位)和 undo log。

其中數據的隱藏列包括了該行數據的版本號、刪除時間、指向 undo log 的指針等等。

當讀取數據時,MySQL 可以通過隱藏列判斷是否需要回滾并找到回滾需要的 undo log,從而實現 MVCC;隱藏列的詳細格式不再展開。

下面結合前文提到的幾個問題分別說明。

①臟讀

 

當事務 A 在 T3 時間節點讀取 zhangsan 的余額時,會發現數據已被其他事務修改,且狀態為未提交。

此時事務 A 讀取最新數據后,根據數據的 undo log 執行回滾操作,得到事務 B 修改前的數據,從而避免了臟讀。

②不可重復讀

 

當事務 A 在 T2 節點第一次讀取數據時,會記錄該數據的版本號(數據的版本號是以 row 為單位記錄的),假設版本號為 1;當事務 B 提交時,該行記錄的版本號增加,假設版本號為 2。

當事務 A 在 T5 再一次讀取數據時,發現數據的版本號(2)大于第一次讀取時記錄的版本號(1),因此會根據 undo log 執行回滾操作,得到版本號為 1 時的數據,從而實現了可重復讀。

③幻讀

InnoDB 實現的 RR 通過 next-keylock 機制避免了幻讀現象。

next-keylock 是行鎖的一種,實現相當于 record lock(記錄鎖) + gap lock(間隙鎖);其特點是不僅會鎖住記錄本身(record lock 的功能),還會鎖定一個范圍(gap lock 的功能)。

當然,這里我們討論的是不加鎖讀:此時的 next-key lock 并不是真的加鎖,只是為讀取的數據增加了標記(標記內容包括數據的版本號等);準確起見姑且稱之為類 next-key lock 機制。

還是以前面的例子來說明:

 

當事務 A 在 T2 節點第一次讀取 0

這樣當 T5 時刻再次讀取 0

小結:概括來說,InnoDB 實現的 RR,通過鎖機制、數據的隱藏列、undo log 和類 next-key lock,實現了一定程度的隔離性,可以滿足大多數場景的需要。

不過需要說明的是,RR 雖然避免了幻讀問題,但是畢竟不是 Serializable,不能保證完全的隔離。

下面是一個例子,大家可以自己驗證一下:

 

一致性

基本概念

一致性是指事務執行結束后,數據庫的完整性約束沒有被破壞,事務執行的前后都是合法的數據狀態。

數據庫的完整性約束包括但不限于:

  • 實體完整性(如行的主鍵存在且唯一)
  • 列完整性(如字段的類型、大小、長度要符合要求)
  • 外鍵約束
  • 用戶自定義完整性(如轉賬前后,兩個賬戶余額的和應該不變)

實現

可以說,一致性是事務追求的最終目標:前面提到的原子性、持久性和隔離性,都是為了保證數據庫狀態的一致性。此外,除了數據庫層面的保障,一致性的實現也需要應用層面進行保障。

實現一致性的措施包括:

  • 保證原子性、持久性和隔離性,如果這些特性無法保證,事務的一致性也無法保證。
  • 數據庫本身提供保障,例如不允許向整形列插入字符串值、字符串長度不能超過列的限制等。
  • 應用層面進行保障,例如如果轉賬操作只扣除轉賬者的余額,而沒有增加接收者的余額,無論數據庫實現的多么完美,也無法保證狀態的一致。

總結

下面總結一下 ACID 特性及其實現原理:

  • 原子性:語句要么全執行,要么全不執行,是事務最核心的特性。事務本身就是以原子性來定義的;實現主要基于 undo log。
  • 持久性:保證事務提交后不會因為宕機等原因導致數據丟失;實現主要基于 redo log。
  • 隔離性:保證事務執行盡可能不受其他事務影響;InnoDB 默認的隔離級別是 RR,RR 的實現主要基于鎖機制、數據的隱藏列、undo log 和類 next-key lock 機制。
  • 一致性:事務追求的最終目標,一致性的實現既需要數據庫層面的保障,也需要應用層面的保障。

參考文獻:

  • 《MySQL 技術內幕:InnoDB 存儲引擎》
  • 《高性能 MySQL》
  • 《MySQL 運維內參》
  • https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_acid
  • https://dev.mysql.com/doc/refman/5.6/en/innodb-next-key-locking.html
  • http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html
  • https://mp.weixin.qq.com/s/2dwGBTmu_da2x-HiHlN0vw
  • http://www.cnblogs.com/chenpingzhao/p/5065316.html
  • https://juejin.im/entry/5ba0a254e51d450e735e4a1f
  • http://hedengcheng.com/?p=771

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2018-05-22 10:09:09

數據庫MySQL優化原理

2019-04-03 09:27:01

MySQLInnoDB務ACID

2021-07-31 23:14:26

OpenCL框架語言

2021-01-27 08:12:04

Dotnet函數數據

2021-12-15 09:32:41

Linux系統負載

2021-09-15 06:55:34

異步LinqC#

2021-10-19 10:10:51

MySQL事務隔離級別數據庫

2024-12-30 13:58:14

2021-07-08 07:08:21

MySQL ACID 數據庫

2021-04-14 07:47:59

AttributeC#屬性

2020-03-18 13:40:03

Spring事數據庫代碼

2022-04-28 10:41:08

SaaS業務方式

2023-12-22 13:46:41

數據訓練

2024-03-13 08:34:22

2023-12-26 08:08:02

Spring事務MySQL

2017-05-04 20:29:12

HTTP服務器TCP

2023-02-24 15:24:14

MySQL數據庫管理分庫分表

2024-10-10 09:12:10

Spring接口初始化

2017-07-06 17:03:45

BP算法Python神經網絡

2020-02-13 10:14:11

MySQL事務ACID
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久岛一牛影视 | 欧美一区二区激情视频| 9l视频自拍九色9l视频成人| 亚洲狠狠爱一区二区三区| 国产精品久久国产精品| 香蕉免费毛片视频| 国产毛片一区二区三区 | 怡红院男人天堂| 五月婷婷亚洲| 亚洲电影免费观看高清| 成人一级片网站| h网站在线免费观看| 国产一区二区视频在线| 午夜精品久久久久久99热软件| 亚洲欧美一区二区三区不卡| 欧美一级鲁丝片| 欧美韩日一区二区三区| 999日本视频| 天天做天天爱夜夜爽| 久久高清精品| 亚洲第一av网| 手机看片福利日韩| 欧美18hd| 久久免费电影网| 91精品视频网站| 久久久久久久久久久网| 欧美国产极品| 91精品国产一区二区三区蜜臀| 国产精品又粗又长| 巨大荫蒂视频欧美大片| 99视频一区二区三区| 国产欧美 在线欧美| 黄色片视频网站| 99视频精品全部免费在线视频| 精品国产伦一区二区三区观看体验 | 国产精品夜夜夜| 一区二区三区丝袜| 人偷久久久久久久偷女厕| 国产男男gay体育生白袜| 国产日韩精品视频一区二区三区| www.亚洲男人天堂| 久久精品一区二区免费播放| 九九九精品视频| 黄色精品一区二区| 日本中文字幕一级片| 午夜免费播放观看在线视频| aaa国产一区| 亚洲自拍小视频| 中文字幕一级片| 国产欧美日韩亚洲一区二区三区| 久久99视频精品| 小早川怜子一区二区的演员表| 日韩在线黄色| 日韩精品中文字幕在线不卡尤物 | 国产成人免费观看| 国产免费一区二区三区最新不卡| 日韩精品国产欧美| 色综合老司机第九色激情 | 在线观看三级视频| 国产精品黄色在线观看| 香蕉久久免费影视| 成人av电影观看| 国产日韩成人精品| 欧美中文娱乐网| 欧美欧美欧美| 成人国产电影网| 国产99午夜精品一区二区三区 | 你懂得在线观看| 美女呻吟一区| 精品久久久久久久久久久久包黑料| www.com久久久| 亚洲精品第一| 欧美日韩一级片网站| 色一情一乱一伦一区二区三区日本| 深夜av在线| 欧美性猛交xxxx乱大交蜜桃| 国产欧美在线一区| 亚洲伊人av| 欧美综合视频在线观看| 国产一级特黄a大片免费| av有声小说一区二区三区| 欧美性猛交xxxx乱大交退制版| 日韩黄色片视频| 欧美黑人疯狂性受xxxxx野外| 狠狠躁夜夜躁久久躁别揉| 成人综合视频在线| 三上悠亚国产精品一区二区三区| 日本韩国欧美三级| 在线免费看污网站| 日韩在线成人| 欧美一区二区精品| 色综合五月婷婷| 亚洲码欧美码一区二区三区| 日韩成人中文字幕在线观看| 公侵犯人妻一区二区三区| 精品一区不卡| 久久天天躁日日躁| 久久午夜无码鲁丝片| 亚洲欧洲一区| 日本精品一区二区三区在线播放视频| 久久精品视频7| 六月丁香婷婷色狠狠久久| 亚洲在线一区二区| 五月婷婷丁香网| 中文字幕不卡一区| 中国丰满熟妇xxxx性| 天堂av中文在线观看| 在线免费视频一区二区| 欧美精品色视频| 日韩免费电影在线观看| 主播福利视频一区| 妺妺窝人体色www聚色窝仙踪| 亚洲精品精选| 国产精品毛片a∨一区二区三区|国 | 在线免费看黄色片| 国内精品视频在线观看| 另类少妇人与禽zozz0性伦| 国产精品成人久久| 日本系列欧美系列| 国产在线观看91精品一区| 成人免费视频国产| 中文久久乱码一区二区| 国产xxxx振车| 亚洲欧美久久精品| 精品亚洲精品福利线在观看| www日韩在线| 乱人伦精品视频在线观看| 91色精品视频在线| 久久久久久青草| 亚洲国产精品综合小说图片区| 成人免费在线观看视频网站| 久9re热视频这里只有精品| 精品国产依人香蕉在线精品| av黄色在线播放| 激情小说亚洲一区| 视频一区视频二区视频三区视频四区国产 | 久草国产在线视频| 蜜臀av一区二区在线观看| 国内精品视频免费| 天堂av最新在线| 欧美日韩不卡一区| 色哟哟精品观看| 极品中文字幕一区| 91精品免费| 欧美成人精品一区二区男人看| 偷拍亚洲欧洲综合| 久久黄色一级视频| 久久成人高清| 777777777亚洲妇女| 午夜精品在线播放| 亚洲色图在线看| www.色欧美| 久久国产电影| 国产精品久久久久久久9999| 三级做a全过程在线观看| 亚洲国产视频一区二区| 伊人五月天婷婷| 91久久夜色精品国产按摩| 国产激情久久久久| 国产区在线视频| 日本韩国欧美一区| 中文字幕乱码在线| 国产日韩综合| 鲁鲁视频www一区二区| 国产天堂在线播放视频| 欧美第一区第二区| 久久精品国产亚洲AV无码男同| 国产伦精品一区二区三区免费迷| 在线成人av电影| 电影一区二区三区久久免费观看| 久久综合伊人77777蜜臀| 国产又爽又黄免费软件| 国产精品国产三级国产普通话蜜臀| 污网站免费在线| 欧美h版在线| 国产欧美精品va在线观看| 国产三级在线免费观看| 在线亚洲人成电影网站色www| 日韩精品无码一区二区三区久久久| 国产亚洲精品自拍| 欧美成人综合一区| 国产黄色一区| 久久久成人精品视频| 亚洲国产www| 夜色激情一区二区| 欧美在线一级片| 亚洲欧美成人综合| 免费在线一区二区| 精品美女一区| 欧美人与性动交a欧美精品| 天天干,天天操,天天射| 色综合久久综合网欧美综合网| 三级网站在线免费观看| 蜜桃av一区二区| 国产女人18毛片| 欧美久久精品| 国产精品久久久久久久午夜| а√天堂官网中文在线| 亚洲精品美女在线观看播放| 国产精品成人无码| 亚洲欧美日韩国产手机在线| 午夜视频在线观看国产| 视频在线观看一区二区三区| 一区二区不卡在线| 99久久人爽人人添人人澡| 性色av一区二区三区在线观看 | 性国裸体高清亚洲| 一区二区三区动漫| 午夜精品久久久久久久99热黄桃 | 久久99久久久久久| 国产a久久精品一区二区三区 | 久操视频免费在线观看| 2023国产精品视频| 亚洲综合欧美激情| 亚洲高清免费| 中文字幕精品—区二区日日骚| 最新精品在线| 国产精品免费久久久久影院| 欧美xxxx黑人又粗又长| 有码中文亚洲精品| 高清毛片aaaaaaaaa片| 色综合久久久网| 国产美女久久久久久| 久久久国产一区二区三区四区小说 | 91精品天堂福利在线观看| 精品伦精品一区二区三区视频| 国产亚洲精彩久久| 欧美有码在线视频| 国产成人无吗| 国产亚洲精品美女久久久| 日韩有码第一页| 日韩一级精品视频在线观看| 成人一二三四区| 亚洲第一搞黄网站| 一区二区视频免费看| 中文av一区二区| 在线观看国产网站| 久久99精品久久久久久动态图| 92看片淫黄大片一级| 亚洲精品九九| 日韩一二区视频| 99久久久久国产精品| 久久久久九九九| 成人免费在线电影网| 91免费国产网站| 国产资源一区| 国产精品久久久久av| 欧美久久天堂| 91精品国产91| av色在线观看| 国内精久久久久久久久久人| 日本高清成人vr专区| 精品久久国产精品| 欧美成人精品一区二区男人看| 这里精品视频免费| 风间由美一区| 精品视频在线播放免| 亚洲精品久久久久avwww潮水| 欧美综合一区二区| 亚洲中文无码av在线| 色偷偷久久人人79超碰人人澡| 免费在线观看黄网站| 亚洲va国产va欧美va观看| 国产一级久久久| 亚洲国产美国国产综合一区二区| 久久视频免费看| 亚洲va国产天堂va久久en| 日韩免费av片| 天天爽夜夜爽夜夜爽精品视频| 免费高清在线观看电视| 国产日韩欧美在线一区| 欧美人妻一区二区三区| 中文字幕成人在线观看| 久久精品亚洲a| 亚洲免费大片在线观看| 久久久久久久国产视频| 亚洲超碰97人人做人人爱| 成年人免费高清视频| 欧美视频在线观看免费网址| 欧美日韩综合一区二区三区| 91久久精品午夜一区二区| 日韩免费av网站| 欧美日韩一本到| 99热这里只有精品66| 欧美mv和日韩mv的网站| 无码精品视频一区二区三区 | 国产福利在线免费| 韩国理伦片一区二区三区在线播放| 日韩精品在线播放视频| 成人av在线影院| 国产成人av一区二区三区不卡| 国产精品天美传媒| 欧美三级日本三级| 欧美日韩在线视频一区| 亚洲成人av网址| 在线播放日韩导航| 色欲av永久无码精品无码蜜桃| 亚洲视频免费一区| 中文字幕中文字幕在线十八区| 国自在线精品视频| 99久久精品一区二区成人| 亚洲影院色无极综合| 欧美天堂社区| 吴梦梦av在线| 在线观看一区| 日本免费一级视频| 黄网站免费久久| 一本加勒比波多野结衣| 日本一区二区视频在线| 久久一级黄色片| 在线这里只有精品| 亚洲毛片在线播放| 在线精品视频视频中文字幕| 欧美亚洲天堂| 国产日韩在线免费| 草草视频在线一区二区| 欧美国产一区二区在线| 欧美不卡一区| 男人搞女人网站| 粉嫩aⅴ一区二区三区四区五区| 免费观看a级片| 亚洲在线成人精品| 在线观看亚洲一区二区| 日韩激情片免费| 性欧美video高清bbw| 国产精品久久久久免费a∨ | 欧美精品九九99久久| 亚洲 欧美 激情 另类| 久久精品国产久精国产思思| 国产夫妻在线播放| 91福利视频导航| 日韩久久精品| 成年人黄色片视频| 国产在线看一区| 免费黄在线观看| 欧美日韩国产黄| 成人黄色在线观看视频| 久久精品视频在线播放| 欧美色网在线| 免费一区二区三区| 一本综合精品| 69xxx免费视频| 国产精品久久久久四虎| 无码人妻丰满熟妇区bbbbxxxx| 亚洲高清av在线| 青春草视频在线| yellow视频在线观看一区二区| 久久久久国产精品| 色国产在线视频| 国产女主播视频一区二区| 97久久久久久久| 日韩欧美国产1| 青青草原av在线| 国产一区二区丝袜| 久久亚洲在线| 国产又黄又猛又粗| 国产精品久久夜| 91禁在线观看| 久久久国产一区二区| 亚洲精品乱码日韩| 日韩福利视频| 米奇777在线欧美播放| 久久国产精品影院| 色婷婷综合视频在线观看| 三区在线视频| 国产精品福利在线| 91麻豆国产自产在线观看亚洲| 日本三级黄色网址| 亚洲在线免费播放| 欧美成熟毛茸茸| 91精品国产综合久久香蕉最新版 | 日本电影一区二区| 亚洲精品视频三区| 亚洲成人午夜电影| 国产综合在线观看| 成人a视频在线观看| 亚洲视频久久| 日本二区在线观看| 91精品一区二区三区久久久久久| 黄色美女视频在线观看| 日本在线观看一区二区| 国产精品一区二区免费不卡| 全部毛片永久免费看| 日韩亚洲精品视频| 粉嫩精品导航导航| wwww.国产| 五月婷婷综合激情| 欧美性videos| 精品久久久久久一区二区里番| 久久99精品国产麻豆婷婷洗澡| 国产在线视频第一页| 中文字幕在线成人| 久久精品福利| 红桃视频 国产| 色视频欧美一区二区三区| 午夜伦理大片视频在线观看| 神马影院我不卡| 97久久超碰国产精品| 国产av精国产传媒| 国产精品久久久久久久av大片|