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

一文快速搞懂MySQL InnoDB事務ACID實現原理

原創
數據庫 MySQL
說到數據庫事務,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念。其實事務的本質就是鎖、并發和重做日志的結合體。

【51CTO.com原創稿件】說到數據庫事務,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念。其實事務的本質就是鎖、并發和重做日志的結合體。

這一篇主要講一下 InnoDB 中的事務到底是如何實現 ACID 的:

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔離性(isolation)
  • 持久性(durability)

隔離性

隔離性的實現原理就是鎖,因而隔離性也可以稱為并發控制、鎖等。事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能互相分離。

再者,比如操作緩沖池中的 LRU 列表,刪除,添加、移動 LRU 列表中的元素,為了保證一致性那么就要鎖的介入。

InnoDB 使用鎖為了支持對共享資源進行并發訪問,提供數據的完整性和一致性。

那么到底 InnoDB 支持什么樣的鎖呢?我們先來看下 InnoDB 的鎖的介紹:

InnoDB 中的鎖

你可能聽過各種各樣的 InnoDB 的數據庫鎖,Gap 鎖,共享鎖,排它鎖,讀鎖,寫鎖等等。但是 InnoDB 的標準實現的鎖只有 2 類,一種是行級鎖,一種是意向鎖。

InnoDB 實現了如下兩種標準的行級鎖:

  • 共享鎖(讀鎖 S Lock),允許事務讀一行數據。
  • 排它鎖(寫鎖 X Lock),允許事務刪除一行數據或者更新一行數據。

行級鎖中,除了 S 和 S 兼容,其他都不兼容。

InnoDB 支持兩種意向鎖(即為表級別的鎖):

  • 意向共享鎖(讀鎖 IS Lock),事務想要獲取一張表的幾行數據的共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的 IS 鎖。
  • 意向排他鎖(寫鎖 IX Lock),事務想要獲取一張表中幾行數據的排它鎖,事務在給一個數據行加排它鎖前必須先取得該表的 IX 鎖。

首先解釋一下意向鎖,以下為意向鎖的意圖解釋:

The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.

大致意思是加意向鎖為了表明某個事務正在鎖定一行或者將要鎖定一行數據。

首先申請意向鎖的動作是 InnoDB 完成的,怎么理解意向鎖呢?例如:事務 A 要對一行記錄 R 進行上 X 鎖,那么 InnoDB 會先申請表的 IX 鎖,再鎖定記錄 R 的 X 鎖。

在事務 A 完成之前,事務 B 想要來個全表操作,此時直接在表級別的 IX 就告訴事務 B 需要等待而不需要在表上判斷每一行是否有鎖。

意向排它鎖存在的價值在于節約 InnoDB 對于鎖的定位和處理性能。另外注意了,除了全表掃描以外意向鎖都不會阻塞。

鎖的算法

InnoDB 有 3 種行鎖的算法:

  • Record Lock:單個行記錄上的鎖。
  • Gap Lock:間隙鎖,鎖定一個范圍,而非記錄本身。
  • Next-Key Lock:結合 Gap Lock 和 Record Lock,鎖定一個范圍,并且鎖定記錄本身。主要解決的問題是 RR 隔離級別下的幻讀。

這里主要講一下 Next-Key Lock。MySQL 默認隔離級別 RR 下,這時默認采用 Next-Key locks。

這種間隙鎖的目的就是為了阻止多個事務將記錄插入到同一范圍內從而導致幻讀。注意了,如果走唯一索引,那么 Next-Key Lock 會降級為 Record Lock。

前置條件為事務隔離級別為 RR 且 SQL 走的非唯一索引、主鍵索引。如果不是則根本不會有 Gap 鎖!先舉個例子來講一下 Next-Key Lock。

首先建立一張表:

  1. mysql> show create table m_test_db.M; 
  2. +-------+----------------------------------------------------------+ 
  3. Table | Create Table                                                                                                                                                                                                                                     | 
  4. +-------+----------------------------------------------------------+ 
  5. | M     | CREATE TABLE `M` ( 
  6.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  7.   `user_id` varchar(45) DEFAULT NULL
  8.   `namevarchar(45) DEFAULT NULL
  9.   PRIMARY KEY (`id`), 
  10.   KEY `IDX_USER_ID` (`user_id`) 
  11. ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 | 
  12. +-------+----------------------------------------------------------+ 
  13. 1 row in set (0.00 sec) 

首先 Session A 去拿到 user_id 為 26 的 X 鎖,用 force index,強制走這個非唯一輔助索引,因為這張表里的數據很少。

  1. mysql> begin
  2. Query OK, 0 rows affected (0.00 sec) 
  3.  
  4. mysql> select * from m_test_db.M force index(IDX_USER_ID) where user_id = '26' for update
  5. +----+---------+-------+ 
  6. | id | user_id | name  | 
  7. +----+---------+-------+ 
  8. |  5 | 26      | jerry | 
  9. |  6 | 26      | ketty | 
  10. +----+---------+-------+ 
  11. rows in set (0.00 sec) 

然后 Session B 插入數據:

  1. mysql> begin
  2. Query OK, 0 rows affected (0.00 sec) 
  3.  
  4. mysql> insert into m_test_db.M values (8,25,'GrimMjx'); 
  5. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

明明插入的數據和鎖住的數據沒有毛線關系,為什么還會阻塞等鎖***超時呢?這就是 Next-Key Lock 實現的。

畫張圖你就明白了:

Gap 鎖鎖住的位置,不是記錄本身,而是兩條記錄之間的間隔 Gap,其實就是防止幻讀(同一事務下,連續執行兩句同樣的 SQL 得到不同的結果)。

為了保證圖上 3 個小箭頭中間不會插入滿足條件的新記錄,所以用到了 Gap 鎖防止幻讀。

簡單的 Insert 會在 Insert 的行對應的索引記錄上加一個 Record Lock 鎖,并沒有 Gap 鎖,所以并不會阻塞其他 Session 在 Gap 間隙里插入記錄。

不過在 Insert 操作之前,還會加一種鎖,官方文檔稱它為 Intention Gap Lock,也就是意向的 Gap 鎖。

這個意向 Gap 鎖的作用就是預示著當多事務并發插入相同的 Gap 空隙時,只要插入的記錄不是 Gap 間隙中的相同位置,則無需等待其他 Session 就可完成,這樣就使得 Insert 操作無須加真正的 Gap Lock。

Session A 插入數據:

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into m_test_db.M values (10,25,'GrimMjx');Query OK, 1 row affected (0.00 sec)

Session B 插入數據,完全沒有問題,沒有阻塞:

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into m_test_db.M values (11,27,'Mjx');Query OK, 1 row affected (0.00 sec)

死鎖

了解了 InnoDB 是如何加鎖的,現在可以去嘗試分析死鎖。死鎖的本質就是兩個事務相互等待對方釋放持有的鎖導致的,關鍵在于不同 Session 加鎖的順序不一致。

不懂死鎖概念模型的可以先看一幅圖:

[[261325]]

左鳥線程獲取了左肉的鎖,想要獲取右肉的鎖,右鳥的線程獲取了右肉的鎖。

右鳥想要獲取左肉的鎖。左鳥沒有釋放左肉的鎖,右鳥也沒有釋放右肉的鎖,那么這就是死鎖。

接下來還用剛才的那張 M 表來分析一下數據庫死鎖,比較好理解:

四種隔離級別

那么按照最嚴格到最松的順序來講一下四種隔離級別:

①Serializable(可序列化)

***事務隔離級別。主要用在 InnoDB 存儲引擎的分布式事務。強制事務排序,串行化執行事務。

不需要沖突控制,但是慢速設備。根據 Jim Gray 在《Transaction Processing》一書中指出,Read Committed 和 Serializable 的開銷幾乎是一樣的,甚至 Serializable 更優。

Session A 設置隔離級別為 Serializable,并開始事務執行一句 SQL:

  1. mysql> select @@tx_isolation; 
  2. +----------------+ 
  3. | @@tx_isolation | 
  4. +----------------+ 
  5. SERIALIZABLE   | 
  6. +----------------+ 
  7. 1 row in set, 1 warning (0.00 sec) 
  8.  
  9. mysql> start transaction
  10. Query OK, 0 rows affected (0.00 sec) 
  11.  
  12. mysql> select * from m_test_db.M; 
  13. +----+---------+-------+ 
  14. | id | user_id | name  | 
  15. +----+---------+-------+ 
  16. |  1 | 20      | mjx   | 
  17. |  2 | 21      | ben   | 
  18. |  3 | 23      | may   | 
  19. |  4 | 24      | tom   | 
  20. |  5 | 26      | jerry | 
  21. |  6 | 26      | ketty | 
  22. |  7 | 28      | kris  | 
  23. +----+---------+-------+ 
  24. rows in set (0.00 sec) 

Session Binsert 一條數據,超時:

  1. mysql> start transaction
  2. Query OK, 0 rows affected (0.00 sec) 
  3.  
  4. mysql> insert into m_test_db.M values (9,30,'test'); 
  5. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

②Repeatable Read(可重復讀)

一個事務按相同的查詢條件讀取以前檢索過的數據,其他事務插入了滿足其查詢條件的新數據,產生幻讀。

InnoDB 存儲引擎在 RR 隔離級別下,已經使用 Next-Key Lock 算法避免了幻讀,了解概念即可。

InnoDB 使用 MVCC 來讀取數據,RR 隔離級別下,總是讀取事務開始時的行數據版本。

Session A 查看 id=1 的數據:

  1. mysql> set tx_isolation='repeatable-read'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> begin
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> select * from m_test_db.M where id =1; 
  8. +----+---------+---------+ 
  9. | id | user_id | name    | 
  10. +----+---------+---------+ 
  11. |  1 | 20      | GrimMjx | 
  12. +----+---------+---------+ 
  13. 1 row in set (0.01 sec) 

Session B 修改 id=1 的數據:

  1. mysql> set tx_isolation='repeatable-read'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> begin
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> update m_test_db.M set name = 'Mjx'
  8. Query OK, 7 rows affected (0.00 sec) 
  9. Rows matched: 7  Changed: 7  Warnings: 0 

然后現在 Session A 再查看一下 id=1 的數據,數據還是事務開始時候的數據。

  1. mysql> select * from m_test_db.M where id =1; 
  2. +----+---------+---------+ 
  3. | id | user_id | name    | 
  4. +----+---------+---------+ 
  5. |  1 | 20      | GrimMjx | 
  6. +----+---------+---------+ 
  7. 1 row in set (0.00 sec) 

③Read Committed(讀已提交)

事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。

InnoDB 使用 MVCC 來讀取數據,RC 隔離級別下,總是讀取被鎖定行***的快照數據。

Session A 查看 id=1 的數據:

  1. mysql> set tx_isolation='read-committed'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> begin
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> select * from m_test_db.M where id =1; 
  8. +----+---------+------+ 
  9. | id | user_id | name | 
  10. +----+---------+------+ 
  11. |  1 | 20      | Mjx  | 
  12. +----+---------+------+ 
  13. 1 row in set (0.00 sec) 

Session B 修改 id=1 的 Name 并且 Commit:

  1. mysql> set tx_isolation='repeatable-read'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> begin
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> update m_test_db.M set name = 'testM' where id =1; 
  8. Query OK, 1 row affected (0.00 sec) 
  9. Rows matched: 1  Changed: 1  Warnings: 0 
  10.  
  11. // 注意,這里commit了! 
  12. mysql> commit
  13. Query OK, 0 rows affected (0.00 sec) 

Session A 再查詢 id=1 的記錄,發現數據已經是***的數據:

  1. mysql> select * from m_test_db.M where id =1; 
  2. +----+---------+-------+ 
  3. | id | user_id | name  | 
  4. +----+---------+-------+ 
  5. |  1 | 20      | testM | 
  6. +----+---------+-------+ 
  7. 1 row in set (0.00 sec) 

④Read Uncommitted(讀未提交)

事務中的修改,即使沒有提交,對其他事務也都是可見的。

Session A 查看一下 id=3 的數據,沒有 Commit:

  1. mysql> set tx_isolation='read-uncommitted'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> select @@tx_isolation; 
  5. +------------------+ 
  6. | @@tx_isolation   | 
  7. +------------------+ 
  8. READ-UNCOMMITTED | 
  9. +------------------+ 
  10. 1 row in set, 1 warning (0.00 sec) 
  11.  
  12. mysql> begin
  13. Query OK, 0 rows affected (0.00 sec) 
  14.  
  15. mysql> select * from m_test_db.M where id =3; 
  16. +----+---------+------+ 
  17. | id | user_id | name | 
  18. +----+---------+------+ 
  19. |  3 | 23      | may  | 
  20. +----+---------+------+ 
  21. 1 row in set (0.00 sec) 

Session B 修改 id=3 的數據,但是沒有 Commit:

  1. mysql> set tx_isolation='read-uncommitted'
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> begin
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> update m_test_db.M set name = 'GRIMMJX' where id = 3; 
  8. Query OK, 1 row affected (0.00 sec) 
  9. Rows matched: 1  Changed: 1  Warnings: 0 

Session A 再次查看則看到了新的結果:

  1. mysql> select * from m_test_db.M where id =3; 
  2. +----+---------+---------+ 
  3. | id | user_id | name    | 
  4. +----+---------+---------+ 
  5. |  3 | 23      | GRIMMJX | 
  6. +----+---------+---------+ 
  7. 1 row in set (0.00 sec) 

這里花了很多筆墨來介紹隔離性,這是比較重要,需要靜下心來學習的特性。所以也是放在***個的原因。

原子性、一致性、持久性

事務隔離性由鎖實現,原子性、一致性和持久性由數據庫的 redo log 和 undo log 實現。

redo log 稱為重做日志,用來保證事務的原子性和持久性,恢復提交事務修改的頁操作。

undo log 來保證事務的一致性,undo 回滾行記錄到某個特性版本及 MVCC 功能。兩者內容不同。redo 記錄物理日志,undo 是邏輯日志。

redo

重做日志由重做日志緩沖(redo log buffer)和重做日志文件(redo log file)組成,前者是易失的,后者是持久的。

InnoDB 通過 Force Log at Commit 機制來實現持久性,當 Commit 時,必須先將事務的所有日志寫到重做日志文件進行持久化,待 Commit 操作完成才算完成。

當事務提交時,日志不寫入重做日志文件,而是等待一個事件周期后再執行 Fsync 操作,由于并非強制在事務提交時進行一次 Fsync 操作,顯然這可以提高數據庫性能。

請記住 3 點:

重做日志是在 InnoDB 層產生的。

重做日志是物理格式日志,記錄的是對每個頁的修改。

重做日志在事務進行中不斷被寫入。

undo

事務回滾和 MVCC,這就需要 undo。undo 是邏輯日志,只是將數據庫邏輯恢復到原來的樣子,但是數據結構和頁本身在回滾之后可能不同。

例如:用戶執行 insert 10w 條數據的事務,表空間因而增大。用戶執行 ROLLBACK 之后,會對插入的數據回滾,但是表空間大小不會因此收縮。

實際的做法就是做與之前想法的操作,Insert 對應 Delete,Update 對應反向 Update 來實現原子性。

InnoDB 中 MVCC 的實現就是靠 undo,舉個經典的例子:Bob 給 Smith 轉 100 元,那么就存在以下 3 個版本,RR 隔離級別下,對于快照數據,總是讀事務開始的行數據版本見黃標。

RC 隔離級別下,對于快照數據,總是讀***的一份快照數據見紅標:

undo log 會產生 redo log,因為 undo log 需要持久性保護 。

***,你會發現姜承堯的 MySQL InnoDB 書上的很多內容都是官方手冊的翻譯,無論是看源碼還是學習新框架,***看原汁原味的。

只要你堅持,一步一步來,總歸會成功的。切忌,學技術急不來,快就是穩,穩就是快。

來源:https://www.cnblogs.com/GrimMjx/p/10575147.html

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

 

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

2019-01-29 09:36:10

MySQLACID特性

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-07-08 07:08:21

MySQL ACID 數據庫

2021-01-13 05:21:59

參數

2021-07-08 10:08:03

DvaJS前端Dva

2024-07-12 14:46:20

2023-09-22 10:45:47

云原生云計算

2023-12-15 15:55:24

Linux線程同步

2020-03-18 14:00:47

MySQL分區數據庫

2021-03-04 00:09:31

MySQL體系架構

2024-04-12 12:19:08

語言模型AI

2022-03-24 08:51:48

Redis互聯網NoSQL

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應用程序接口

2021-04-27 19:21:48

HBase原理開源

2021-02-22 09:44:03

KubernetesDNSLinux

2020-04-15 16:30:24

掃碼登錄微信前端

2020-02-21 20:10:13

搞懂事務隔離級別

2023-04-03 15:04:00

RPCPHP語言

2023-08-24 16:50:45

點贊
收藏

51CTO技術棧公眾號

欧美成人午夜免费视在线看片| 一区二区三区 在线观看视频| 欧美伊久线香蕉线新在线| 久久久久9999| 成人午夜亚洲| 一区二区三区中文字幕在线观看| 精品视频第一区| 中文字幕在线视频第一页| 欧美日韩福利| 国产亚洲精品久久久久久| 人妻换人妻仑乱| a日韩av网址| 99精品在线视频观看| 午夜欧美精品久久久久久久| 日韩国产中文字幕| 欧美视频国产视频| 日韩影院在线| 一区二区三区在线观看动漫| 欧美婷婷久久| 国产人妖一区二区三区| 免费中文字幕日韩欧美| 欧美剧在线观看| 东京热无码av男人的天堂| ccyy激情综合| 欧美日韩成人综合天天影院| 欧美无砖专区免费| 国产私人尤物无码不卡| 成人精品电影在线观看| 成人激情av在线| 中文字幕国产在线观看| 亚洲啪啪91| 美女黄色丝袜一区| 特黄一区二区三区| 欧美猛男做受videos| 精品粉嫩超白一线天av| 激情文学亚洲色图| 福利一区二区三区视频在线观看| 精品成人乱色一区二区| 国产成人生活片| 香蕉视频网站在线观看| 国产三级欧美三级日产三级99| 国产精华一区| 精品国产无码AV| 国产在线精品不卡| 国产精品嫩草影院久久久| 91国产丝袜播放在线| 欧美日本在线| 欧美成人国产va精品日本一级| 极品尤物一区二区| 成人a'v在线播放| 亚洲欧美中文另类| 91精品人妻一区二区三区蜜桃欧美 | 99精品女人在线观看免费视频| 色素色在线综合| 国产激情在线观看视频| 欧美香蕉视频| 色婷婷综合久久久久中文| 国产又黄又猛视频| 日韩成人亚洲| 欧美性三三影院| 三上悠亚av一区二区三区| 巨大黑人极品videos精品| 欧美日本在线一区| 中文国产在线观看| 亚洲va欧美va人人爽成人影院| 91精品国产欧美一区二区18| 无套内谢丰满少妇中文字幕| 亚洲一区二区三区免费| 精品国产乱码久久久久久1区2区| 污污免费在线观看| 日韩美女毛片| 亚洲天堂av电影| 国产成人在线网址| 欧美一区在线看| 国产+成+人+亚洲欧洲| 成年免费在线观看| 欧美bbbbb| 成人国产精品久久久| www.国产欧美| 久久久精品影视| 亚洲精品日韩在线观看| 黄av在线免费观看| 亚洲大片在线观看| 欧美自拍小视频| 国产一区二区三区精品在线观看 | 日韩欧美电影在线观看| 国产欧美日韩在线视频| 丰满女人性猛交| а√天堂中文在线资源8| 在线观看视频欧美| 丰满人妻一区二区三区大胸| 久久久免费毛片| 中文字幕av日韩| 国产一级片久久| 老司机精品视频网站| 91探花福利精品国产自产在线| 日本黄色免费视频| 国产精品三级视频| 国产无限制自拍| av高清不卡| 91精品国产乱码久久蜜臀| 亚洲av片不卡无码久久| 91超碰成人| 国产精品999| 亚洲精品字幕在线| 国产精品三级在线观看| 日韩精品―中文字幕| 亚洲日日夜夜| 亚洲欧美一区二区精品久久久| 日韩一级片av| 日本一不卡视频| 精品亚洲欧美日韩| www国产在线观看| 欧美在线啊v一区| 国产精品久久久久久亚洲色| 日韩欧美网站| 欧洲亚洲免费在线| 亚洲精品国产一区二| 中文成人av在线| 久久精品.com| 国产人妖ts一区二区| www.日韩.com| 波多野结衣mp4| 不卡的av中国片| 免费观看亚洲视频| 国产美女久久| 亚洲欧美三级伦理| 中文字幕超碰在线| 国产乱人伦偷精品视频免下载| 色之综合天天综合色天天棕色| 国产传媒在线| 日韩精品综合一本久道在线视频| av资源在线免费观看| 久久久久欧美精品| 农村寡妇一区二区三区| 免费看男女www网站入口在线 | 天天在线女人的天堂视频| 亚洲日本va在线观看| 日本黄大片一区二区三区| 自拍偷拍一区| 日韩av电影在线网| 青青草在线播放| 欧美性猛交丰臀xxxxx网站| 久久久久国产精品无码免费看| 午夜日韩在线| 成人自拍爱视频| 男女在线视频| 精品乱码亚洲一区二区不卡| 久久精品www| 丁香五精品蜜臀久久久久99网站| 欧美黄色免费网址| 超碰成人97| 97成人精品区在线播放| 天堂成人在线视频| 都市激情亚洲色图| 亚洲天堂久久新| 免费成人在线观看| 樱花www成人免费视频| 欧美aaaaaaaa| 欧美成人午夜激情| 好吊视频一二三区| 四虎影院中文字幕| 国产999精品久久久久久 | 免费人成精品欧美精品| 亚洲人体一区| 国产视频网站一区二区三区| 欧美激情高清视频| 天堂网www中文在线| 在线观看亚洲精品视频| 国产男女猛烈无遮挡在线喷水| 国内欧美视频一区二区| av日韩在线看| 香蕉精品久久| 国产区亚洲区欧美区| 性xxxxfjsxxxxx欧美| 亚洲国产97在线精品一区| 久久精品视频7| 最新不卡av在线| 白嫩情侣偷拍呻吟刺激| 可以看av的网站久久看| 咪咪色在线视频| 国产精品天天看天天狠| 国产成人精品免高潮费视频| 婷婷视频在线| 亚洲精品ady| 中文字幕在线观看视频一区| 一区二区三区欧美激情| 法国伦理少妇愉情| 国产自产v一区二区三区c| 久久久一本二本三本| 四虎8848精品成人免费网站| 成人h在线播放| 亚洲综合av一区二区三区| 欧美成人剧情片在线观看| 亚洲欧美日韩精品永久在线| 欧美手机在线视频| 日韩欧美a级片| 中文字幕一区不卡| 国产黄色三级网站| 国产一区二区三区久久久| 国产精品专区在线| 天堂美国久久| 欧美极品色图| 97久久亚洲| 国产欧美一区二区三区在线看 | 欧美黄在线观看| 欧美日韩一区二区三区免费| 日韩精品一区二区三区中文字幕| 国产91在线高潮白浆在线观看| 日本在线视频网址| 日韩中文在线中文网三级| 日韩大胆人体| 日韩精品在线一区| 国产精品免费无遮挡| 色婷婷av一区二区三区软件| 久久久久久久久久久久国产| 国产精品拍天天在线| 国产伦精品一区二区三区妓女 | 欧美天堂亚洲电影院在线播放| 精品少妇theporn| 日韩一区日韩二区| 手机看片福利视频| 91蝌蚪porny九色| 国产视频精品视频| 国产激情精品久久久第一区二区| 777视频在线| 日韩福利视频导航| 久久久免费视频网站| 国产日韩欧美三级| 黄色www网站| aa亚洲婷婷| 国产美女主播在线播放| 欧美日本中文| 欧美美女黄色网| 欧美福利网址| 国产91porn| 中文字幕免费一区二区| 综合视频在线观看| 久久精品一区二区不卡| 亚洲午夜精品国产| 97在线精品| 成人手机视频在线| 99久久这里只有精品| 中文字幕久精品免| 婷婷久久综合| 亚洲黄色网址在线观看| 亚洲a在线视频| 亚洲av综合色区| 国产精品99一区二区| 国产片侵犯亲女视频播放| 午夜日韩在线| 亚洲国产精品无码观看久久| 极品日韩av| 大陆极品少妇内射aaaaa| 99亚洲一区二区| 欧美黄色免费影院| 视频一区中文字幕国产| 一区二区三区韩国| 紧缚奴在线一区二区三区| 中文字幕av一区二区三区人妻少妇| 国产呦萝稀缺另类资源| 亚洲AV成人精品| 99久久免费视频.com| 日本黄色网址大全| 中文字幕中文字幕一区| 欧美高清视频一区二区三区| 亚洲.国产.中文慕字在线| 丁香六月婷婷综合| 欧美三级韩国三级日本三斤| 国产又粗又大又爽| 精品久久久久久久久久久久久久久| 黄色片一区二区| 亚洲片av在线| 免费a在线看| 欧美激情中文字幕在线| 午夜影院在线播放| 国产欧美日韩免费看aⅴ视频| 日韩免费一级| 久久伊人资源站| 欧美电影三区| 搞av.com| 久久精品国产久精国产爱| 精人妻一区二区三区| 91热门视频在线观看| 国产精品精品软件男同| 亚洲大片精品永久免费| 伊人免费在线观看| 精品成人在线观看| 尤物视频在线免费观看| 国模吧一区二区| 黄页免费欧美| 九九九九九九精品| 小说区亚洲自拍另类图片专区| 男女激情无遮挡| 久久精品国产99久久6| 男人网站在线观看| 国产精品第一页第二页第三页| 日韩经典在线观看| 欧美喷水一区二区| 欧美挠脚心网站| 欧美日本亚洲视频| 久久69成人| 久久久av水蜜桃| 国产精品porn| xxx国产在线观看| 久久综合给合久久狠狠狠97色69| 91久久久久久久久久| 久久久精品国产sm调教网站| 亚洲精品视频在线观看网站| 五月天婷婷丁香| 欧美日韩成人综合在线一区二区| 亚洲伦理在线观看| 夜夜嗨av一区二区三区免费区| 日韩精品视频网址| 蜜芽tv福利在线视频| 手机在线电影一区| 午夜久久久久久久久| 欧美刺激性大交免费视频| 欧美一级黄色影院| 亚洲欧洲另类| 久久久久久久久久久久久久久国产| 成人一区二区三区| 欧美做爰爽爽爽爽爽爽| 欧日韩精品视频| 无码h黄肉3d动漫在线观看| 久久最新资源网| 国产69精品久久| 日产精品久久久一区二区| 亚洲一区二区免费看| 欧美丰满熟妇bbb久久久| 国产精品国产三级国产有无不卡| 国产成人一级片| 亚洲精品久久久久| 国产在线xxx| 波多野结衣精品久久| 中文字幕亚洲综合久久五月天色无吗''| 男女男精品视频站| 欧美激情在线免费观看| 无码人妻精品一区二区50| 亚洲精品中文字| 亚洲欧美韩国| 免费不卡亚洲欧美| 久久国产精品久久w女人spa| 四季av综合网站| 精品久久香蕉国产线看观看亚洲 | 精品国产一区二区三区噜噜噜| 国产欧美在线一区| 国产亚洲欧美色| wwwwww在线观看| 深夜福利国产精品| 在线播放成人| 免费的av在线| 国产成人高清在线| 欧美成人aaaaⅴ片在线看| 亚洲电影av在线| 亚洲十八**毛片| 日韩久久在线| 国产一区久久久| 久久久久性色av无码一区二区| 亚洲成年人在线播放| av资源在线播放| 欧美一区少妇| 久久国产精品露脸对白| 青青草原在线免费观看| 亚洲精品一区二区三区福利| 日韩深夜视频| 性欧美精品一区二区三区在线播放 | av成人综合| 欧美丰满熟妇bbbbbb百度| 国产亚洲污的网站| 91成品人影院| 久久久久久国产精品| 少妇久久久久| 黄大色黄女片18第一次| 亚洲精品一二三四区| 亚州视频一区二区三区| 国产精品91在线观看| 久久久久午夜电影| 日本黄色动态图| 欧美在线综合视频| 污污的视频在线观看| 麻豆av一区二区三区| 蓝色福利精品导航| 国产一级淫片免费| 一区二区三欧美| 91九色鹿精品国产综合久久香蕉| 99蜜桃臀久久久欧美精品网站| 国产精品传媒在线| 亚洲欧洲成人在线| 91免费看国产| 噜噜噜91成人网| 成人免费毛片东京热| 亚洲精品在线看| 一区二区三区在线免费看| www.99在线| 午夜久久久影院| а√天堂官网中文在线| 欧美三级网色| 成人亚洲一区二区一| 中文字幕91爱爱|