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

欧美黄色aaaa| 国产69精品久久久久9999人| 成人蜜臀av电影| 欧美亚洲成人免费| 亚洲女同二女同志奶水| 日韩欧美中文在线观看| 欧美日韩在线免费| 日本不卡一区二区三区四区| 四虎永久在线观看| 美女精品自拍一二三四| 孩xxxx性bbbb欧美| 情侣偷拍对白清晰饥渴难耐| 欧美五码在线| 欧美一区二区女人| 少妇高清精品毛片在线视频| av黄色在线| 国产日韩欧美在线一区| 国产成人精品日本亚洲11| 夜夜躁日日躁狠狠久久av| 黄色成人在线网站| 视频在线观看99| 97人妻天天摸天天爽天天| 成人在线日韩| 欧美三级视频在线观看| 国产h视频在线播放| 成人在线观看亚洲| 欧美激情中文字幕一区二区| 久久精品ww人人做人人爽| 99国产精品久久久久99打野战| 天堂成人免费av电影一区| 欧美激情喷水视频| 国产精品麻豆一区| 精品在线99| 亚洲精品资源在线| 在线xxxxx| 日本在线视频一区二区三区| 欧美日韩一区二区三区免费看 | 国产999免费视频| 在线观看精品| 色综合网站在线| 国产原创中文在线观看 | 神马午夜在线观看| 国产ts人妖一区二区| 成人精品一区二区三区电影黑人| 波多野结衣视频观看| 噜噜噜躁狠狠躁狠狠精品视频| 久久久久成人网| 久草视频在线资源| 在线成人超碰| 久久夜色精品国产亚洲aⅴ| 波多野结衣家庭教师在线观看 | 日韩欧美一区二区视频在线播放| 五月婷婷在线播放| caoporn国产精品| 国产免费一区二区三区| 狠狠综合久久av一区二区| 国产成人免费视| 99久久精品无码一区二区毛片| 国产美女无遮挡永久免费| 激情五月激情综合网| 96国产粉嫩美女| 精品久久久久成人码免费动漫| 国产一区91精品张津瑜| 亚洲资源在线看| 午夜久久久久久久久久| 成人动漫av在线| 久久久久久高清| 国产一级网站视频在线| 欧美激情一区二区三区不卡 | 亚洲欧美bt| 日本免费久久高清视频| 天天射天天干天天| 另类中文字幕网| 亚洲一区免费网站| 秋霞av鲁丝片一区二区| 久久综合色之久久综合| 日本午夜一区二区三区| 男人在线资源站| 一区二区三区四区国产精品| 99在线观看视频免费| 九九色在线视频| 欧美视频专区一二在线观看| 亚洲成色www.777999| 99国内精品久久久久| 欧美成人vr18sexvr| 熟女人妻在线视频| 成人无号精品一区二区三区| 久久国产精品99国产精| 五月天综合在线| 久久精品首页| 亚洲一区二区三区sesese| 乱精品一区字幕二区| 久久综合五月天婷婷伊人| 宅男一区二区三区| 丝袜老师在线| 91精品欧美一区二区三区综合在| 午夜男人的天堂| 第一sis亚洲原创| 欧美激情一二三| 欧美特级黄色片| 大胆亚洲人体视频| 四虎一区二区| 国产夫妻在线播放| 欧美日本一道本| 国产偷人妻精品一区| 99久久九九| 日本视频久久久| www.黄色一片| 中文一区二区在线观看| 国产自产在线视频| 伊人久久综合网另类网站| 精品亚洲一区二区三区| 天天看片中文字幕| 美腿丝袜亚洲色图| 精品视频一区二区| 影音先锋在线视频| 欧美乱妇15p| 成人免费无遮挡无码黄漫视频| 中文一区一区三区免费在线观看| 国产精品国产福利国产秒拍| 熟妇高潮一区二区三区| 亚洲六月丁香色婷婷综合久久| 人妻丰满熟妇av无码区app| 国产乱人伦精品一区| 久久久www成人免费精品张筱雨| 久久久精品视频网站| 国产成人午夜视频| 永久免费在线看片视频| 国产综合色区在线观看| 亚洲免费一级电影| 日韩污视频在线观看| 国产精品白丝av| 中文字幕中文字幕一区三区| 欧美韩国亚洲| 亚洲欧洲午夜一线一品| 国产一区二区三区影院| 成人免费视频一区二区| 中文字幕色呦呦| 国产aa精品| 久久精品免费播放| 91av久久久| 国产精品青草久久| 亚洲欧美久久久久| 日韩精品免费一区二区三区| 国产成人综合久久| 成人p站proumb入口| 91国产成人在线| 337人体粉嫩噜噜噜| 日韩综合一区二区| 亚洲成人精品电影在线观看| 嫩草伊人久久精品少妇av杨幂| 国产一区二区三区在线播放免费观看| 日韩手机在线视频| 国产欧美中文在线| 在线看的黄色网址| 99久久99久久精品国产片桃花 | 日韩一区电影| 国产一区二区香蕉| 国产在线高清视频| 日韩三级av在线播放| 久久国产在线视频| www.亚洲免费av| 国产午夜福利视频在线观看| 欧美美乳视频| 国产狼人综合免费视频| 国产在线高潮| 亚洲国产成人爱av在线播放| 成人毛片18女人毛片| 久久久噜噜噜久久中文字幕色伊伊| 能在线观看的av| 欧美视频免费| 91中文字幕在线| 成人ssswww在线播放| 亚洲激情自拍图| 日本精品入口免费视频| 亚洲天堂av老司机| 一级黄色免费视频| 丝袜亚洲另类丝袜在线| 在线观看一区二区三区三州 | 日韩欧美国产三级| 日韩av在线电影| 国产欧美精品国产国产专区| 黄色一级片免费的| 极品中文字幕一区| 欧美重口乱码一区二区| 亚洲综合视频| 97在线看福利| 五月天婷婷在线视频| 精品国产电影一区二区| 免费精品一区二区| 亚洲综合视频网| 久久久久久久久久久久| 国产曰批免费观看久久久| 黄色一级视频片| 天天综合亚洲| 精品日本一区二区三区| 伊人久久大香线蕉综合影院首页| 18久久久久久| 免费在线视频欧美| 日韩久久免费视频| 国产人妖在线播放| 色一区在线观看| 久久久香蕉视频| 国产精品三级av| 欧产日产国产精品98| 久久99精品久久只有精品| 日韩在线综合网| 综合天堂av久久久久久久| 欧美一进一出视频| 2021年精品国产福利在线| 国产精品一区二区电影| 校园春色亚洲| 欧美激情精品久久久久| 三级外国片在线观看视频| 日韩av在线免费看| www.午夜激情| 欧美日韩一区二区欧美激情| 在线观看亚洲欧美| 一区二区激情小说| 国产精品免费人成网站酒店| 久久精品网站免费观看| 日本一区二区在线免费观看| 国产在线视视频有精品| 蜜臀视频一区二区三区| 亚洲尤物精选| 国产日韩欧美精品在线观看| 中文字幕一区二区精品区| 亚洲国产欧美日韩| 精品在线播放| 欧美一区二区三区成人久久片| aiai久久| www.成人av| 日韩一区二区三区精品视频第3页| 国产精品入口尤物| 成人精品动漫| 国产精品露脸av在线| 成人午夜视屏| 日韩女在线观看| 中国色在线日|韩| 91产国在线观看动作片喷水| 国产乱码在线| 97免费视频在线播放| а√在线中文网新版地址在线| 久久91亚洲精品中文字幕| 成人日韩欧美| 欧美成人第一页| 羞羞视频在线免费国产| 欧美成年人在线观看| 污片视频在线免费观看| 欧美激情18p| 成人福利影视| 91chinesevideo永久地址| 原纱央莉成人av片| 国产精品a久久久久久| 日韩精品三区| 国产欧美一区二区三区久久人妖| 久久久免费人体| 成人一区二区电影| 日本一区二区三区电影免费观看| av资源站久久亚洲| 日韩有码av| 色姑娘综合av| 1024精品久久久久久久久| 91社在线播放| 亚洲美女毛片| 999精品网站| 麻豆精品一区二区| 伦伦影院午夜理论片| 成人午夜在线免费| 性欧美13一14内谢| 中文字幕一区二| 国产亚洲精品久久久久久打不开| 激情久久av一区av二区av三区| 国产免费一区二区三区四区五区| 欧美丝袜自拍制服另类| 99久久久国产精品无码网爆| 亚洲成av人影院在线观看| 精品av中文字幕在线毛片| 中文字幕在线亚洲| 久久久久黄久久免费漫画| 555www成人网| 色狠狠一区二区三区| aa成人免费视频| 亚州av日韩av| 最新av在线免费观看| 日韩香蕉视频| 亚欧激情乱码久久久久久久久| 国产电影精品久久禁18| 欲求不满的岳中文字幕| 国产精品欧美极品| 国产第一页在线播放| 欧美丝袜自拍制服另类| 色屁屁草草影院ccyycom| 中文字幕精品久久久久| 色婷婷在线播放| 国产成人综合亚洲| 99久久香蕉| 亚洲欧洲精品一区二区| 亚洲国产一区二区三区高清 | 国产精品18久久久久久vr| 一级国产黄色片| 夜夜亚洲天天久久| 人妻中文字幕一区二区三区| 精品国产一二三区| 91福利在线视频| 欧美性视频精品| 日韩精品一区二区三区中文在线| 欧美在线播放一区| 最新亚洲一区| 韩国一区二区在线播放| 国产女同性恋一区二区| 91国产丝袜播放在线| 91精品国产免费| 国际av在线| 4k岛国日韩精品**专区| aiss精品大尺度系列| 成人性做爰片免费视频| 日本中文字幕一区二区视频| 中文字幕一区三区久久女搜查官| 一区二区三区欧美久久| 中文字幕日韩国产| 亚洲男人天天操| 都市激情国产精品| 97视频资源在线观看| 香蕉国产精品| 色综合色综合色综合色综合| 久久这里只精品最新地址| 国产成人无码精品久久久久| 日韩女优av电影在线观看| 久久久久久久久免费视频| 国产精品视频久久| 欧美精品一区二区久久| 青青在线视频观看| 久久这里都是精品| 麻豆成人免费视频| 亚洲毛片在线观看| 永久免费毛片在线播放| 玛丽玛丽电影原版免费观看1977| 一区二区三区四区五区精品视频| 日本少妇xxxx软件| 亚洲国产裸拍裸体视频在线观看乱了| 午夜精品一二三区| 久久久久久久999| 成人av婷婷| 波多野结衣综合网| 91在线精品一区二区三区| 国产做受高潮漫动| 亚洲美女激情视频| 奇米777日韩| 亚洲精品国产精品国自产| 免费成人在线观看视频| 一二三四在线观看视频| 欧美裸体一区二区三区| 爆操欧美美女| 国产高清一区视频| 97精品在线播放| 第一福利永久视频精品| 欧美日韩伦理片| 国产成人精品久久二区二区| 精品久久91| 伊人国产精品视频| 亚洲一区中文在线| 亚洲日本国产精品| 日韩av电影手机在线| 日韩久久精品网| 97人人模人人爽人人澡| 亚洲主播在线观看| 五月天激情婷婷| 国产精品爱啪在线线免费观看| 成人羞羞网站入口免费| 日韩视频在线观看一区二区三区| 亚洲精品国产无天堂网2021| 欧性猛交ⅹxxx乱大交| 日韩免费观看视频| 久久人体视频| avtt中文字幕| 色综合中文字幕| 一区二区三区视频网站 | 欧美理伦片在线播放| 亚洲爆乳无码专区| 自拍偷拍亚洲欧美日韩| 免费av一级片| 国产精品日韩欧美综合| 国内精品久久久久久久影视蜜臀| 美国黄色一级毛片| 欧美另类高清zo欧美| 日本在线影院| 一区二区三区av在线| 菠萝蜜视频在线观看一区| 中文字幕在线观看免费| 欧美国产亚洲精品久久久8v| 九九亚洲视频| 丰满少妇中文字幕| 日本精品视频一区二区三区| www久久日com| 日本一区二区久久精品| 丁香激情综合五月| 中文字幕一区二区在线视频| 韩日精品中文字幕| 天天做天天爱天天综合网2021|