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

咦~ MySQL怎么出現幻讀啦!

數據庫 MySQL
當前讀可以通過鎖機制完全避免幻讀問題,快照讀如果中間對其他事務已提交的插入或更新的數據進行了更新,則會出現幻讀的問題。

1 背景

InnoDB默認的事務隔離級別是REPEATABLE-READ,它為了解決該隔離級別并發情況下的幻讀問題,使用了LBCC(基于鎖的并發控制)和MVCC(多版本的并發控制)兩種方案。其中LBCC解決的是當前讀情況下的幻讀問題,MVCC解決的是快照讀情況下的幻讀問題,那既然如此,該隔離級別下是否仍然還存在幻讀的問題呢?幻讀問題到底有沒有完全解決呢?基于這樣的疑問,下面我們來進行驗證下吧。

2 驗證

2.1 驗證準備

2.1.1 環境信息

MySQL版本:5.6.36
存儲引擎:InnoDB
隔離級別:REPEATABLE-READ

2.1.2 數據準備

為了進行驗證,在測試庫建立了一張測試使用的用戶信息表,并且插入了3條初始數據。

CREATE TABLE `user_info` (
 `id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
 `name` VARCHAR ( 32 ) NOT NULL DEFAULT '' COMMENT '姓名',
 `gender` VARCHAR ( 32 ) NOT NULL DEFAULT '' COMMENT '性別',
 `email` VARCHAR ( 32 ) NOT NULL DEFAULT '' COMMENT '郵箱',
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '用戶信息表';

INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (1, 'Curry', '男', 'curry@163.com');
INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (2, 'Wade', '男', 'wade@163.com');
INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (3, 'James', '男', 'james@163.com');
commit;

2.2 當前讀場景驗證

首先我們先來看看當前讀的場景下會不會出現幻讀的問題。

2.2.1 前言

  • 什么是當前讀

當前讀(Locking Read)也稱為鎖定讀,讀取的是數據當前的最新版本,而且讀取到這個數據之后會對這個數據加鎖,防止別的事務進行更改,即通過next-key鎖(唯一索引next-key鎖會退化為記錄鎖)來解決當前讀中的臟讀,幻讀,不可重復讀問題,也就是LBCC的方式。在進行寫操作的時候也需要進行“當前讀”,讀取數據記錄的最新版本。當前讀包含以下SQL類型:select ... lock in share mode 、select ... for update、update 、delete 、insert。

  • 什么是臨鍵鎖

圖片圖片

我們將數據庫中存儲的每一行數據稱為記錄。如上圖中1、5、9、12分別代表id為當前數的記錄。對于鍵值在條件范圍內但不存在的記錄,叫做間隙(GAP)。則上圖中的(-∞,1)、(1,5)...(12,+∞)為數據庫中存在的間隙。而(-∞,1]、(1,5]...(12,+∞)我們稱之為臨鍵,即左開右閉的集合。當我們對上面的記錄和間隙共同加鎖時,添加的便是臨鍵鎖。

2.2.2 場景驗證

觸發當前讀的方式有很多種,這里僅使用select lock in share mode這種方式來進行當前讀幻讀問題驗證。

  • 場景:
  1. 開啟事務1
  2. 在事務1中通過select lock in share mode進行當前讀查詢用戶信息
  3. 開啟事務2
  4. 在事務2中插入一條新數據
  5. 提交事務2
  6. 在事務1中再次查詢用戶信息
  7. 提交事務1
mysql> START TRANSACTION; -- 1.開啟事務1
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user_info lock in share mode; -- 2.讀鎖方式查詢用戶信息
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
+----+-------+--------+---------------+
3 rows in set (0.00 sec)
mysql> START TRANSACTION; -- 3.開啟事務2
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (4, 'White', '男', 'white@163.com'); -- 4.在事務2中插入一條新數據

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction  -- 因鎖等待插入未成功,最終等待超時,事務回滾終止
  • 場景驗證結果

可以看到在事務1中開始事務執行了當前讀后,事務2在進行插入新數據時進入了鎖等待,最后發生了鎖等待超時,導致事務終止回滾。插入數據因鎖的原因是不會成功的,因此事務1第二次查詢時也不會查詢到新記錄,所以此場景下不會產生幻讀的問題。

2.2.3 小結

由場景驗證結果可以看到,由于臨鍵鎖的存在,會阻塞其他事務對加鎖間隙的數據插入,所以當前讀場景下通過LBCC是可以完全解決幻讀的問題。

2.3.快照讀場景驗證

那接下來我們再看看快照讀場景下是怎么樣的。

2.3.1 前言

  • 什么是快照讀

由于當前讀是通過LBCC基于鎖的方式來進行并發控制,是悲觀鎖的實現,同時也會因為鎖的原因,造成鎖沖突的概率變大,也會導致性能的下降,因此基于提高并發性能的考慮,引入了快照讀,快照讀顧名思義即讀取的是數據的快照版本,快照讀的實現是基于MVCC多版本并發控制,它在很多情況下,避免了加鎖操作,降低了性能開銷。

2.3.2 場景驗證

  • 場景一
  1. 開啟事務1
  2. 在事務1中查詢用戶信息
  3. 開啟事務2
  4. 在事務2中插入一條新數據
  5. 提交事務2
  6. 在事務1中再次查詢用戶信息
  7. 提交事務1
mysql> START TRANSACTION; -- 1.開啟事務1
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user_info; -- 2.在事務1中查詢用戶信息
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
+----+-------+--------+---------------+
3 rows in set (0.00 sec)
mysql> select * from user_info; 6.在事務1中再次查詢用戶信息
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
+----+-------+--------+---------------+
3 rows in set (0.00 sec)
mysql> commit; -- 7.提交事務1
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION; -- 3.開啟事務2
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (4, 'White', '男', 'white@163.com'); -- 4.在事務2中插入一條新數據
Query OK, 1 row affected (0.00 sec)

mysql> commit; -- 5.提交事務2
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
|  4 | White | 男     | white@163.com |
+----+-------+--------+---------------+
4 rows in set (0.00 sec)
  • 場景驗證結果

從場景一來看RR級別下是可以避免幻讀的問題,在意料之中。那如果我們在事務1中兩次查詢之間進行了當前讀更新操作呢,那會不會出現幻讀的問題呢,那接下來我們來看一看場景二。

  • 場景二
  1. 開啟事務1
  2. 在事務1中查詢用戶信息
  3. 開啟事務2
  4. 在事務2中插入一條新數據
  5. 提交事務2
  6. 在事務1中將ID為1的數據的用戶姓名修改為Iversen
  7. 在事務1中再次查詢用戶信息
  8. 提交事務1
mysql> START TRANSACTION; -- 1. 開啟事務1
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user_info; -- 2. 在事務1中查詢用戶信息
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
+----+-------+--------+---------------+
3 rows in set (0.00 sec)
mysql> update user_info set name = 'Iversen' where id = 1; -- 在事務1中將ID為1的數據的用戶姓名修改為Iversen
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from user_info; -- 7. 在事務1中再次查詢用戶信息
+----+---------+--------+---------------+
| id | name    | gender | email         |
+----+---------+--------+---------------+
|  1 | Iversen | 男     | curry@163.com |
|  2 | Wade    | 男     | wade@163.com  |
|  3 | James   | 男     | james@163.com |
+----+---------+--------+---------------+
3 rows in set (0.00 sec)
mysql> commit; -- 8. 提交事務1
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION; -- 3.開啟事務2
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (4, 'White', '男', 'white@163.com'); -- 4.在事務2中插入一條新數據
Query OK, 1 row affected (0.00 sec)

mysql> commit; -- 5.提交事務2
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
|  4 | White | 男     | white@163.com |
+----+-------+--------+---------------+
4 rows in set (0.00 sec)
  • 場景驗證結果

從場景二來看RR級別下仍然是可以避免幻讀的問題,那是不是就可以確定RR級別下已經完全解決了幻讀的問題呢。那我們再換一種更新方式來看看吧。

  • 場景三
  1. 開啟事務1
  2. 在事務1中查詢用戶信息
  3. 開啟事務2
  4. 在事務2中插入一條新數據
  5. 提交事務2
  6. 在事務1中將所有用戶的郵箱信息的后綴更換為@gmail.com
  7. 在事務1中再次查詢用戶信息
  8. 提交事務1
mysql> START TRANSACTION; -- 1. 開啟事務1
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user_info; -- 2. 在事務1中查詢用戶信息
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
+----+-------+--------+---------------+
3 rows in set (0.00 sec)
mysql> update user_info set email = REPLACE(email, '@163.com', '@gmail.com'); -- 6. 在事務1中將所有用戶的郵箱信息的后綴更換為@gmail.com
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> select * from user_info;  -- 7. 在事務1中再次查詢用戶信息
+----+-------+--------+-----------------+
| id | name  | gender | email           |
+----+-------+--------+-------------- --+
|  1 | Curry | 男     | curry@gmail.com |
|  2 | Wade  | 男     | wade@gmail.com  |
|  3 | James | 男     | james@gmail.com |
|  4 | White | 男     | white@gmail.com |
+----+-------+--------+-----------------+
4 rows in set (0.00 sec)
mysql> commit;  -- 8. 提交事務1
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION; -- 3.開啟事務2
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `user_info` (`id`, `name`, `gender`, `email`) VALUES (4, 'White', '男', 'white@163.com'); -- 4.在事務2中插入一條新數據
Query OK, 1 row affected (0.00 sec)

mysql> commit; -- 5.提交事務2
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+----+-------+--------+---------------+
| id | name  | gender | email         |
+----+-------+--------+---------------+
|  1 | Curry | 男     | curry@163.com |
|  2 | Wade  | 男     | wade@163.com  |
|  3 | James | 男     | james@163.com |
|  4 | White | 男     | white@163.com |
+----+-------+--------+---------------+
4 rows in set (0.00 sec)
  • 場景驗證結果

事務1在進行更新之后再次查詢讀取到了事務2新插入到數據,出現了幻讀。

2.3.3 小結

看來RR級別的確沒有完全解決幻讀問題,那為什么還會存在幻讀的問題呢,為什么更新的方式不同,會出現不同的結果,什么情況下還會出現幻讀問題呢。帶著這樣的疑問,我們來探索下~

3 分析

從驗證結果來看,當前讀是可以完全避免幻讀的問題,而對于快照讀如果在兩次讀取之間進行了當前讀,在某些情況下是會觸發幻讀的問題。那么下面我們可以從當前讀的實現(MVCC)的角度來分析幻讀問題的產生原因。

我們應該知道MVCC實現原理主要是依賴記錄中的3個隱式字段,undo日志,Read View來實現的,好,那么我們基于產生幻讀的場景結合MVCC的實現原理來一步步進行分析。

1.產生幻讀的場景 

  • 初始三條測試數據
  • 開啟事務1
  • 在事務1中查詢用戶信息
  • 開啟事務2
  • 在事務2中插入一條新數據
  • 提交事務2
  • 在事務1中將所有用戶的郵箱信息更換為@gmail.com
  • 在事務1中再次查詢用戶信息
  • 提交事務1

1.1 執行步驟0:初始三條測試數據

在初始化三條數據后三條初始數據分別會有三個隱式字段值,

DB_TRX_ID(事務id),DB_ROLL_PTR(回滾指針),DB_ROW_ID(隱式主鍵)。

如下:因為是新插入的數據,回滾指針字段的值均為NULL。

+----+-------+--------+--------------+-----------+-----------+---------+
| id | name  | gender | email        | DB_TRX_ID |DB_ROLL_PTR|DB_ROW_ID|
+----+-------+--------+--------------+-----------+-----------+---------+
|  1 | Curry | 男     | curry@163.com|    2334   |    NULL   |    1    |
|  2 | Wade  | 男     | wade@163.com |    2334   |    NULL   |    2    |
|  3 | James | 男     | james@163.com|    2334   |    NULL   |    3    |
+----+-------+--------+--------------+-----------+-----------+---------+

1.2 執行步驟1:開啟事務1

在開啟事務1后會為事務1分配一個唯一的事務id

mysql> SELECT trx_id,trx_state,trx_started  FROM INFORMATION_SCHEMA.INNODB_TRX;
+-----------------+-----------+---------------------+
| trx_id          | trx_state | trx_started         |
+-----------------+-----------+---------------------+
| 2335            | RUNNING   | 2024-07-28 21:31:52 |
+-----------------+-----------+---------------------+
1 row in set (0.00 sec)

1.3 執行步驟2:在事務1中查詢用戶信息

因為是開啟事務后的首次查詢,所以此時會生成一張Read Veaw讀視圖,此時trx_list,up_limit_id,low_limit_id的值分別為:

trx_list:因為是測試驗證,無其他并發事務參與,所以活躍事務列表中只有當前的事務id[2335];

up_limit_id:活躍事務列表中最小的事務id,即當前事務id:2335;

low_limit_id:下一個未開始的事務id,即當前事務id+1為:2336;

圖片

此時查詢數據會使用當前生成的Read View并依據可見性算法來進行查詢,因為數據庫中數據的事務id均小于up_limit_id所以對當前事務均是可見的,所以三條初始數據會全部被查詢出來。

注: 可見性算法

  • 首先比較 DB_TRX_ID < up_limit_id , 如果小于,則當前事務能看到 DB_TRX_ID 所在的記錄,如果大于等于進入下一個判斷
  • 接下來判斷 DB_TRX_ID >= low_limit_id , 如果大于等于則代表 DB_TRX_ID 所在的記錄在 Read View 生成后才出現的,那對當前事務肯定不可見,如果小于則進入下一個判斷
  • 判斷 DB_TRX_ID 是否在活躍事務之中,trx_list.contains (DB_TRX_ID),如果在,則代表Read View 生成時刻,這個事務仍處于活躍中,還沒有commit,如果DB_TRX_ID=creator_trx_id,則說明是當前事務自己產生的數據,是可見的,如果不等于,則為其他事務修改的數據,當前事務也是看不見的;如果不在活躍事務之中,則說明,你這個事務在Read View生成之前就已經commit了,修改的結果,當前事務是能夠看見的。

1.4 執行步驟3:開啟事務2

在開啟事務2后會為事務2分配一個唯一的事務id。

事務id的分配是遞增的,因此事務2的事務id一定是大于事務1。

mysql> SELECT trx_id,trx_state,trx_started  FROM INFORMATION_SCHEMA.INNODB_TRX;
+-----------------+-----------+---------------------+
| trx_id          | trx_state | trx_started         |
+-----------------+-----------+---------------------+
| 2336            | RUNNING   | 2024-07-28 21:35:52 |
+-----------------+-----------+---------------------+
1 row in set (0.00 sec)

1.5 執行步驟4:在事務2中插入一條新數據

此時會產生一條新插入數據的insert undolog日志

1.6 執行步驟5:提交事務2

由于事務提交插入的數據會實際生效,insert undolog日志會被刪除,此時表的數據情況如下:

+----+-------+--------+--------------+-----------+-----------+---------+
| id | name  | gender | email        | DB_TRX_ID |DB_ROLL_PTR|DB_ROW_ID|
+----+-------+--------+--------------+-----------+-----------+---------+
|  1 | Curry | 男     | curry@163.com|    2334   |    NULL   |    1    |
|  2 | Wade  | 男     | wade@163.com |    2334   |    NULL   |    2    |
|  3 | James | 男     | james@163.com|    2334   |    NULL   |    3    |
|  4 | White | 男     | white@163.com|    2336   |    NULL   |    4    |
+----+-------+--------+--------------+-----------+-----------+---------+

1.7 執行步驟6:在事務1中將所有用戶的郵箱信息的后綴更換為@gmail.com

因為是更新操作,所以是當前讀會將所有的符合條件的數據都讀取出來,進行更新。更新后的數據表中的數據如下:

+----+-------+--------+----------------+-----------+-----------+---------+
| id | name  | gender | email         | DB_TRX_ID |DB_ROLL_PTR|DB_ROW_ID|
+----+-------+--------+----------------+-----------+-----------+---------+
|  1 | Curry | 男     |curry@gmail.com |    2335   |  0x123825 |    1    |
|  2 | Wade  | 男     |wade@gmail.com  |    2335   |  0x153125 |    2    |
|  3 | James | 男     |james@gmail.com |    2335   |  0x115725 |    3    |
|  4 | White | 男     |white@gmail.com |    2335   |  0x163225 |    4    |
+----+-------+--------+----------------+-----------+-----------+---------+

undolog情況如下:

圖片圖片

1.8 執行步驟7:在事務1中再次查詢用戶信息

  • 當前是RR的隔離級別,所以此時使用的Read View讀視圖仍然是首次查詢生成的讀視圖。
  • 依據Read View的可見性算法分析,分別對四條數據的undolog版本鏈從尾部至頭部逐一進行可見性判斷是否可見進行追溯,會看到四條數據的尾部版本就可對當前事務可見。所以四條數據是會在此次查詢中全部被查詢得到。

由此可以推斷產生幻讀的原因啦,因為事務1中的更新操作,對事務2中的新插入的數據也進行了更新,更新后新數據的undolog日志中會追加此次更新的回滾日志,并指向新插入數據的undolog記錄,此時根據MVCC的可見性算法,事務2新插入的數據此時對于事務1也變成了可見的,因此產生了幻讀的問題。

  • 那同樣是更新場景二為什么沒有產生幻讀的問題呢?

在場景二中,更新語句更新的是事務1第一次查詢可見的數據,而對事務2中新插入的數據沒有進行任何操作,新插入數據的版本鏈中是不存在當前事務產生的版本數據的,因此新插入的數據對與事務1仍然不可見,所以沒有產生幻讀問題。圖片

4 總結

  • 當前讀可以通過鎖機制完全避免幻讀問題,快照讀如果中間對其他事務已提交的插入或更新的數據進行了更新,則會出現幻讀的問題。
  • 如何進行避免呢?

采用串行化的隔離級別(不建議);

開發時注意考慮這種產生幻讀的場景,盡量通過調整代碼邏輯規避幻讀問題的發生(建議);

  • 若不能通過調整代碼邏輯規避,可以考慮采用當前讀的方式避免(建議);
責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2019-05-28 13:50:27

MySQL幻讀數據庫

2022-06-30 08:00:00

MySQL關系數據庫開發

2023-08-09 17:22:30

MVCCMySQL數據

2024-04-19 08:18:47

MySQLSQL隔離

2021-04-20 19:21:50

臟讀MySQL幻讀

2023-06-05 00:28:24

MySQL數據庫非鎖定讀

2021-11-30 06:56:59

MySQL幻讀查詢

2023-11-01 14:13:00

MySQL事務隔離級別

2024-05-13 11:46:33

MySQL數據庫

2022-04-27 07:32:02

臟讀幻讀不可重復讀

2019-03-21 09:06:00

數據庫復讀幻讀

2021-04-27 08:25:52

MVCC數據MySQL

2024-04-24 08:26:35

事務數據InnoDB

2022-06-29 11:01:05

MySQL事務隔離級別

2022-01-03 07:18:05

臟讀幻讀 MySQL

2019-12-24 14:50:01

MySQL可重復讀數據庫

2019-03-12 15:41:09

Facebook微信馬化騰

2023-02-02 07:06:10

2021-08-26 06:58:15

Innodb RR隔離級別

2022-09-21 09:00:10

MySQL幻讀隔離級別
點贊
收藏

51CTO技術棧公眾號

欧美专区在线观看| 久久婷婷国产综合国色天香| 国产成人免费在线观看| 欧美1区视频| 日韩高清一区在线| 日韩精品在线一区二区| 欧美激情专区| 久久99久久久| 97成人资源| 国产成人啪免费观看软件| 在线免费观看羞羞视频一区二区| 日韩精品手机在线观看| 69av视频在线观看| 老牛精品亚洲成av人片| 日韩毛片视频在线看| 欧美亚洲视频一区二区| 亚洲av无码成人精品区| 蜜桃视频网站在线观看| 日韩高清国产一区在线| 亚洲精品丝袜日韩| 中国丰满熟妇xxxx性| 国产一区二区网站| 成人午夜国产| 色88888久久久久久影院按摩| 国产精品视频久| 日本一区二区在线免费观看| 怡红院在线播放| 精品一区二区三区在线播放| 中文字幕欧美专区| 久久久精品三级| 青青草超碰在线| 性8sex亚洲区入口| 日韩黄色av网站| 国产精品无码av在线播放| 丰满人妻一区二区三区免费视频| 久久综合五月婷婷| 偷窥国产亚洲免费视频| 国产伦精品一区二区三区视频黑人| 青青草原在线免费观看| 亚洲三级av| 亚洲宅男天堂在线观看无病毒| 成人18视频| 国产精品白浆一区二小说| 久久香蕉网站| 日韩欧美亚洲综合| 日韩高清国产精品| 亚洲图片在线播放| 久久久久美女| 精品欧美久久久| 欧美日本视频在线观看| 毛片在线能看| 久久99精品久久只有精品| 久久综合色88| 亚洲精品久久一区二区三区777| 日本大胆在线观看| 97精品电影院| 国产激情视频一区| 91视频综合网| swag国产精品一区二区| 日韩欧美亚洲一二三区| 亚洲人成人77777线观看| 国产农村妇女毛片精品| 亚洲黄色毛片| 一区二区三区亚洲| 韩国三级在线播放| 欧洲一区精品| 国产精品久久二区二区| 国产伦理久久久| 日韩国产成人在线| 午夜欧美精品久久久久久久| 日韩成人中文字幕| 性生活免费在线观看| 少女频道在线观看免费播放电视剧| 99视频精品免费视频| 国产精品成人v| 国模无码国产精品视频| 久草在线成人| 欧美一级片免费看| 六月丁香婷婷在线| 成人直播在线| 久久综合九色欧美综合狠狠| 91视频国产精品| 亚洲久久在线观看| 中文精品久久| 在线精品国产成人综合| 中文字幕在线视频播放| 久久91视频| 精品国产鲁一鲁一区二区张丽 | 亚洲国产精品人久久电影| youjizzxxxx18| av影院在线| 亚洲色图视频网站| 欧美一进一出视频| 神马午夜在线观看| 国产精品一区二区久激情瑜伽| 日韩美女在线观看一区| 国产精品成人免费观看| 欧美电影三区| 亚洲欧美资源在线| 中文字幕在线视频播放| 日本免费精品| 69堂亚洲精品首页| 免费涩涩18网站入口| 国产美女高潮在线观看| 一区二区三区四区在线播放 | 亚洲最快最全在线视频| 亚洲欧美日韩另类精品一区二区三区| 手机福利小视频在线播放| 久久er精品视频| 国产成一区二区| 天天做天天爱夜夜爽| 亚洲毛片在线| 久久久久久国产精品久久| 亚洲xxxx3d动漫| 四季av一区二区凹凸精品| 一区二区三区精品99久久| 女尊高h男高潮呻吟| 成人黄色av网址| 欧美va亚洲va在线观看蝴蝶网| 中文字幕avav| 欧美视频精品全部免费观看| 678五月天丁香亚洲综合网| 国产精品一区二区小说| 成人精品动漫| 欧美日韩电影一区| 热久久久久久久久| www.久久99| 91麻豆精品91久久久久久清纯 | 亚洲第一页中文字幕| 亚洲黄色小说在线观看| 午夜电影一区| 亚洲成色777777在线观看影院| 亚洲v在线观看| 久久九九热re6这里有精品| 欧美精品一区二区三区一线天视频 | 夜夜嗨一区二区| 91成人精品网站| 久久久成人免费视频| 久久久久久穴| 国产区亚洲区欧美区| 国产精品亚洲lv粉色| 在线免费观看日韩视频| 天天干天天爽天天操| 91丨porny丨中文| 蜜桃传媒视频麻豆一区| 国产视频三级在线观看播放| 国产免费观看久久| 亚洲一区二区四区| 成人黄视频在线观看| 亚洲主播在线播放| 免费观看精品视频| 欧美美女被草| 精品久久久久久久人人人人传媒| 在线精品一区二区三区| 欧美孕妇孕交| 成人av网站大全| 亚洲成人激情在线| 牛夜精品久久久久久久| а√天堂在线官网| 亚洲午夜激情网站| 国产一区二区三区精彩视频| 国产69精品久久久久9999人| 欧美电影在线免费观看| 亚洲精品国产成人av在线| 神马电影久久| 久热精品视频在线观看一区| 青青草偷拍视频| 日韩精品乱码免费| 亚洲自拍欧美另类| 日本精品专区| 亚洲精品中文在线| 黄色高清无遮挡| 日韩免费高清视频网站| 亚洲欧美国产精品专区久久| 天天色天天综合| 国产精品入口| 亚洲在线视频观看| jzzjzzjzz亚洲成熟少妇| 亚洲国产一区二区三区| 日本黄大片一区二区三区| 91精品国产自产在线丝袜啪| 最近2019中文字幕第三页视频 | 亚洲精选视频免费看| 粉嫩虎白女毛片人体| 2023国产精华国产精品| 色偷偷偷亚洲综合网另类| 黄色激情视频在线观看| 久久电影网电视剧免费观看| 久久国产人妖系列| 97久久天天综合色天天综合色hd| 国产女主播在线直播| 亚洲国产日日夜夜| 在线播放av中文字幕| 国产剧情在线观看一区| 欧美精品激情在线| 国产丰满美女做爰| 日本一二三四高清不卡| 国产精品无码专区av在线播放| 成人性生交大片免费看中文视频| 久久人人爽人人爽爽久久 | 国产精品vip| 成人精品一区二区三区| 国产片在线观看| 色婷婷国产精品| 中文字幕a在线观看| 永久91嫩草亚洲精品人人| 国产美女精彩久久| 大胆av不用播放器在线播放| 狠狠做深爱婷婷久久综合一区| 国产十八熟妇av成人一区| 亚洲小说区图片区| 风间由美久久久| 成人av福利| 欧美一卡二卡三卡| 亚洲不卡在线播放| 人人爱人人干婷婷丁香亚洲| 日韩**一区毛片| 久久人人九九| 麻豆mv在线看| 日韩福利在线播放| 久久狠狠高潮亚洲精品| 成人18视频在线播放| www.激情网| 6080成人| 久久男人资源视频| 天天摸天天碰天天爽天天弄| 午夜精品久久久久久久| 91玉足脚交白嫩脚丫| 亚洲国产精品第一区二区| 久久99精品国产99久久| 成人av免费电影网站| 亚洲欧美日韩在线一区| 波多野结衣高清在线| 国产欧美一区二区精品性| 免费涩涩18网站入口| 婷婷精品进入| 2014亚洲精品| 成人观看网址| 亚洲乱亚洲乱妇无码| 久久精品五月天| 欧美激情一区不卡| 日韩欧美中文视频| 在线欧美三区| 欧美人xxxxx| 91亚洲精品| 久久艹在线视频| 人人妻人人澡人人爽精品日本| 欧美日韩美女在线| 又色又爽的视频| 国产成人精品午夜视频免费| 国产特级淫片高清视频| 不卡在线一区二区| 亚洲在线免费视频| sese综合| 久久久久北条麻妃免费看| 神马久久久久久久久久| 欧美日韩一区二区电影| 国产亚洲欧美久久久久| 久久久午夜电影| 奇米777在线| 亚洲免费综合| 国产树林野战在线播放| 欧美日韩导航| 成人欧美一区二区三区黑人| 福利写真视频网站在线| 日韩精品亚洲视频| 波多野结衣在线观看视频| 一区二区三区日韩精品视频| 永久免费看mv网站入口78| 国产一区二区美女诱惑| 免费无码av片在线观看| 亚洲天堂免费| 免费电影一区| 日韩成人在线观看视频| 日本久久久久久久| 欧美午夜大胆人体| 尤物99国产成人精品视频| 人妻无码中文字幕| 欧美猛男超大videosgay| 圆产精品久久久久久久久久久| 国产精品久久99| 播金莲一级淫片aaaaaaa| 国产激情精品久久久第一区二区 | 欧美三区在线视频| 日韩黄色三级视频| 亚洲人成在线观看一区二区| 久久只有这里有精品| 成人午夜视频网站| 日韩av自拍偷拍| 日本伊人色综合网| 国产91在线免费| 欧美三级小说| 在线无限看免费粉色视频| 国产一区二区三区四区| 国产三级精品在线不卡| 欧美中文高清| 成人福利免费观看| 99久久er| 国产精品va在线| 免费亚洲电影| 4438全国亚洲精品在线观看视频| 欧美人与禽性xxxxx杂性| 久久精品免费播放| 91激情在线| 中文字幕日韩av电影| 电影在线一区| 亚洲欧美日韩高清| 九色视频在线观看免费播放| 国产丝袜视频一区| 亚洲色图狠狠干| 日韩精品在线免费观看| 婷婷国产在线| 亚洲成人在线网| 日本免费一区视频| 亚洲国产第一页| 人妻无码中文字幕免费视频蜜桃| 精品久久久久久久久久久久久久久久久 | 国产精品夜间视频香蕉| 怡红院成人在线| 国产精品高清网站| 国产成人亚洲一区二区三区| 国产日韩视频在线观看| 成人国产精品一区二区网站| 91亚洲精品在线| 日本免费一区二区三区视频| 国产精品久久久久久久久久直播 | 91精品一区二区三区在线观看| 亚洲在线精品视频| 欧美日韩性生活| av免费在线观看不卡| 欧美一区二区在线观看| 亚洲第一免费视频| 亚洲国产中文字幕久久网 | 精品一级视频| 97中文在线观看| 成人av资源网址| 欧美久久久久久一卡四| 久久国产电影| 91精品国产毛片武则天| 99精品国产在热久久| 国产真人无码作爱视频免费| 久久se精品一区精品二区| 韩国一区二区三区四区| 91免费国产视频网站| 国产精品久久免费观看| 亚洲色图制服丝袜| 国产无精乱码一区二区三区| 色婷婷激情一区二区三区| 888奇米影视| 精品av综合导航| 免费一级在线观看播放网址| 中文字幕在线看视频国产欧美在线看完整| 免费观看在线黄色网| 久久久亚洲影院你懂的| 唐人社导航福利精品| 91免费福利视频| 日韩av网站在线免费观看| 亚洲最大色综合成人av| 精品成人免费| 日韩一区二区三区不卡视频| 国产一区二区三区观看| 色欲av无码一区二区三区| 成人欧美一区二区三区白人| 亚洲 欧美 视频| 欧美老肥妇做.爰bbww| 少妇人妻精品一区二区三区| 日韩性生活视频| 三级在线观看视频| 92国产精品视频| 精品一区二区三| 精品无码一区二区三区爱欲| 久久精品国产秦先生| 国产性生活毛片| 国产精品国产三级国产a| 日本天堂网在线观看| 欧美电影影音先锋| 国产在线一二三区| 国产+成+人+亚洲欧洲| 日韩免费在线电影| 欧美日韩精品不卡| 在线播放日韩| 欧美体内she精高潮| 国产精品美女www爽爽爽| 在线观看亚洲欧美| 欧美大片免费久久精品三p| youjizz在线播放| 欧美在线视频a| 6080成人| 红桃一区二区三区| 麻豆高清免费国产一区| 自拍偷拍中文字幕| 亚欧色一区w666天堂| 99免费在线视频| 日韩在线观看免费av| 性欧美videohd高精| 黑人另类av| 禁久久精品乱码| 超碰在线超碰在线| 国产精品色在线| 日韩欧美一级大片|