成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Mysql InnoDB的鎖定機制實例詳解

瀏覽:33日期:2023-10-07 08:42:16
1.InnoDB的鎖定機制

InnoDB存儲引擎支持行級鎖,支持事務處理,事務是有一組SQL語句組成的邏輯處理單元,他的ACID特性如下:

原子性(Atomicity): 事務具有原子不可分割的特性,要么一起執行,要么都不執行。 一致性(Consistency): 在事務開始和事務結束時,數據都保持一致狀態。 隔離性(Isolation): 在事務開始和結束過程中,事務保持著一定的隔離特性,保證事務不受外部并發數據操作的影響。 持久性(Durability): 在事務完成后,數據將會被持久化到數據庫中。

并發事務能提高數據庫資源的利用率,提高了數據庫的事務吞吐量,但并發事務也存在一些問題,主要包括:

更新丟失(Lost Update): 兩個事務更新同一條數據,但第二個事務中途失敗退出,導致兩個修改都失效了;因為此時數據庫沒有執行任何鎖操作,并發事務并沒有被隔離。(現代數據庫已經不存在這種問題) 臟讀(Dirty Reads): 一個事務讀了某行數據,但是另一個事務已經更新了這行數據,這是非常危險的,很可能導致所有的操作被回滾。 不可重復讀: 一個事務對一行數據重復讀取兩次(多次),可是得到了不同的結果,在兩次讀取過程中,有可能存在另一個事務對數據進行了修改。 幻讀:事務在操作過程中進行兩次查詢,第二次查詢結果包含了第一次沒有出現的數據。出現幻讀的主要原因是兩次查詢過程中另一個事務插入新的數據。

數據庫并發中的“更新丟失”通常應該是完全避免的,但防止更新丟失數據,并不能單靠數據庫事務控制來解決,需要應用程序對要更新的數據加必要的鎖來解決,而以上出現的數據庫問題都必要由數據庫提供一定的事務隔離機制來解決。為了避免數據庫事務并發帶來的問題,在標準SQL規范中定義了4個事務的隔離級別,不同的隔離級別對事務處理不一樣。

數據庫隔離級別的比較

隔離級別 讀數據一致性 臟讀 不可重復讀 幻讀 未提交讀 (Read uncommitted) 最低級別,只能保證不讀取物理上損壞的數據 是 是 是 已提交讀 (Read committed) 語句級 否 是 是 可重復讀 (Repeatable read) 事務級 否 否 是 可序列化 (Serializable) 最高級別,事務級 否 否 否

InnoDB存儲引擎實現了4中行鎖,分別時共享鎖(S)、排他鎖(X)、意向共享鎖(IS)、意向排他鎖(IX)。

共享鎖:大家都能讀,但是不能改,只有其中一個獨占共享鎖時候才能改; 排它鎖:我要改,你們都不能改,也不能讀(但可以MVCC快照讀) 理解意向鎖

意向鎖不會和行級的S和X鎖沖突,只會和表級的S和X鎖沖突

意向鎖是為了避免遍歷全部行鎖

考慮這個例子:

事務A鎖住了表中的一行,讓這一行只能讀,不能寫。

之后,事務B申請整個表的寫鎖。

如果事務B申請成功,那么理論上它就能修改表中的任意一行,這與A持有的行鎖是沖突的。

數據庫需要避免這種沖突,就是說要讓B的申請被阻塞,直到A釋放了行鎖。

數據庫要怎么判斷這個沖突呢?

step1:判斷表是否已被其他事務用表鎖鎖表

step2:判斷表中的每一行是否已被行鎖鎖住。

注意step2,這樣的判斷方法效率實在不高,因為需要遍歷整個表。

于是就有了意向鎖。

在意向鎖存在的情況下,事務A必須先申請表的意向共享鎖,成功后再申請一行的行鎖。

在意向鎖存在的情況下,上面的判斷可以改成

step1:不變

step2:發現表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,因此,事務B申請表的寫鎖會被阻塞。

1.1通過索引檢索數據,上共享鎖,行鎖(如果不通過索引,會使用表鎖)

1.1通過索引檢索數據,上共享鎖,行鎖SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------對主鍵索引上共享鎖,其他事務也能獲取到共享鎖mysql> select * from test where id=1 lock in share mode;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1 |+----+------+-------+-------+1 row in set (0.01 sec)--------------------------------------------------------------------------------事務B也能繼續加共享鎖mysql> select * from test where id=1 lock in share mode;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1 |+----+------+-------+-------+1 row in set (0.01 sec)但無法更新,因為事務A也加了共享鎖mysql> update test set level=11 where id=1;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transactionMORE:無法加排它鎖select *from test where id=1 for update;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction可以更新未加鎖的,比如mysql> update test set level=11 where id=2;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------事務A也無法更新,因為事務B加了共享鎖mysql> update test set level=11 where id=1;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction--------------------------------------------------------------------------------任意一個釋放共享鎖,則獨占共享鎖的事務可以更新mysql> commit;Query OK, 0 rows affected (0.00 sec)--------------------------------------------------------------------------------事務B釋放鎖,事務A獨占,可以更新了mysql> update test set level=11 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0

1.2通過索引檢索數據,上排他鎖,行鎖

1.2通過索引檢索數據,上排他鎖,行鎖SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------對主鍵索引上排他鎖,其他事務也能獲取到共享鎖mysql> select *from test whereid=1 for update;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1 |+----+------+-------+-------+1 row in set (0.01 sec)--------------------------------------------------------------------------------事務B則不能繼續上排它鎖,會發生等待mysql> select *from test where id=1 for update;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transactionMORE:也不能更新,因為更新也是上排它鎖mysql> update test set level=2 where id=1;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction也不能上共享鎖mysql> select * from test where level=1 lock in share mode;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction--------------------------------------------------------------------------------事務A可以更新mysql> update test set level=11 where id=1;Query OK, 1 row affected (0.08 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------釋放排它鎖mysql> commit;Query OK, 0 rows affected (0.00 sec)--------------------------------------------------------------------------------事務A釋放鎖,事務B就可以加排它鎖了mysql> select * from test where id=1 for update;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1 |+----+------+-------+-------+1 row in set (0.00 sec)

1.3通過索引更新數據,也是上排他鎖,行鎖

對于 update,insert,delete 語句會自動加排它鎖

1.3通過索引更新數據,也是上排他鎖,行鎖SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------更新id=1的行,就給該行上了排它鎖,其他事務無法更新該行mysql> update test set level=11 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------事務B則不能更新id=1的行,會發生等待mysql> update test set level=21 where id=1;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transactionMORE:也不能上排它鎖mysql> select *from test where id=1 for update;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction也不能上共享鎖mysql> select * from test where level=1 lock in share mode;ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction--------------------------------------------------------------------------------釋放排它鎖mysql> commit;Query OK, 0 rows affected (0.00 sec)--------------------------------------------------------------------------------事務A釋放鎖,事務B就可以加排它鎖了mysql> select * from test where id=1 for update;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 11|+----+------+-------+-------+1 row in set (0.00 sec)

2.1臟讀

//臟讀//2.1臟讀SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)set session transaction isolationset session transaction isolation level read uncommitted;level read uncommitted; Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec) mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=100 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------//臟讀mysql> select *from test where id=1;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 100 |+----+------+-------+-------+1 row in set (0.00 sec)--------------------------------------------------------------------------------rollback;Query OK, 0 rows affected (0.01 sec)mysql> select *from test where id=1;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1 |+----+------+-------+-------+1 row in set (0.00 sec)

2.2不可重復讀

2.2不可重復讀//臟讀SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)set session transaction isolationset session transaction isolation level read uncommitted;level read uncommitted; Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec) mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=100 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------mysql> select *from test where id=1;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 100 |+----+------+-------+-------+1 row in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=1000 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------//不可重復讀//讀三次,第一次是level是1,第二次是100,第三次是1000mysql> select *from test where id=1;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 1000|+----+------+-------+-------+1 row in set (0.00 sec)

2.3幻讀

//2.3幻讀SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec)set session transaction isolationset session transaction isolation level read uncommitted;level read uncommitted; Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec) mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=100 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0--------------------------------------------------------------------------------mysql> select *from test where id=1;+----+------+-------+-------+| id | name | money | level |+----+------+-------+-------+| 1 | tom | 100 | 100 |+----+------+-------+-------+1 row in set (0.00 sec)--------------------------------------------------------------------------------mysql> insert into test (name, money,level) VALUES (’tim’,250,4);Query OK, 1 row affected (0.01 sec)--------------------------------------------------------------------------------//幻讀//讀兩次,第二次多了tim的數據//如果是rr級別,需要使用當前讀select * from test lock in share mode;否則因為MVCC的緣故,是讀不到tim的mysql> select * from test;+----+-------+-------+-------+| id | name | money | level |+----+-------+-------+-------+| 1 | tom | 100 | 1 || 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 || 4 | tim | 250 | 4 |+----+-------+-------+-------+4 row in set (0.00 sec)3 間隙鎖(Net-Key鎖)

MVCC使RR級別下,事務當前讀,來避免了讀情況下的幻讀問題,但如果寫更新時候呢?在范圍更新的同時,往范圍內插入新數據,怎么辦?

于是就有了間隙鎖,在更新某個區間數據時,將會鎖定這個區間的所有記錄。例如update XXX where id between 1 and 100, 就會鎖住id從1到100之間的所有的記錄。值得注意的是,在這個區間中假設某條記錄并不存在,該條記錄也會被鎖住,這時,如果另一個事務往這個區間添加數據,就必須等待上一個事務釋放鎖資源。

使用間隙鎖有兩個目的,一是防止幻讀;二是滿足其恢復和賦值的需求。

3.1范圍間隙鎖,顯式左開右閉區間

//間隙鎖(Net-Key鎖) 范圍間隙鎖,左開右閉區間SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec) mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=0where money between 0 and 200;Query OK, 2 rows affected (0.02 sec)Rows matched: 2 Changed: 2 Warnings: 0理論上應該鎖定[0,300)這個區間--------------------------------------------------------------------------------插入money=0等待mysql> insert into test (name, money,level) VALUES (’tim’,0,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=90等待mysql> insert into test (name, money,level) VALUES (’tim’,90,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=100等待mysql> insert into test (name, money,level) VALUES (’tim’,100,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=299等待mysql> insert into test (name, money,level) VALUES (’tim’,299,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=300 okmysql> insert into test (name, money,level) VALUES (’tim’,300,0);Query OK, 1 row affected (0.00 sec)

3.2單個間隙鎖 隱式區間

上小節是指定update某個區間,那如果說是只update一個值呢?還會有間隙鎖么?

//間隙鎖(Net-Key鎖) 單個間隙鎖,左開右閉區間SessionA SessionBmysql> set autocommit=0; mysql> set autocommit=0;Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec) mysql> select * from test; mysql> select * from test;--------------------------------------------------------------------------------+----+-------+-------+-------+ +----+-------+-------+-------+ | id | name | money | level | | id | name | money | level |+----+-------+-------+-------+ +----+-------+-------+-------+| 1 | tom | 100 | 1 | | 1 | tom | 100 | 1 || 2 | jack | 200 | 2 | | 2 | jack | 200 | 2 || 3 | lucas | 300 | 3 | | 3 | lucas | 300 | 3 |+----+-------+-------+-------+ +----+-------+-------+-------+3 rows in set (0.00 sec) 3 rows in set (0.00 sec)--------------------------------------------------------------------------------mysql> update test set level=0where money = 200;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0理論上應該鎖定[0,300)這個區間--------------------------------------------------------------------------------插入money=0 okmysql> insert into test (name, money,level) VALUES (’tim’,0,0);Query OK, 1 row affected (0.00 sec)插入money=90 okmysql> insert into test (name, money,level) VALUES (’tim’,90,0);Query OK, 1 row affected (0.00 sec)插入money=100等待mysql> insert into test (name, money,level) VALUES (’tim’,100,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=150等待mysql> insert into test (name, money,level) VALUES (’tim’,150,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=200等待mysql> insert into test (name, money,level) VALUES (’tim’,200,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=240等待mysql> insert into test (name, money,level) VALUES (’tim’,240,0);ERROR 1205 (HY000): Lock wait timeout exceeded;try restarting transaction插入money=300 okmysql> insert into test (name, money,level) VALUES (’tim’,300,0);Query OK, 1 row affected (0.00 sec)

當不指定區間時,隱式的區間為索引B+數前后兩個節點的值所確定的區間,也是左開右閉,對于上述例子,就是[0,300)這個區間。

總結

到此這篇關于Mysql InnoDB鎖定機制的文章就介紹到這了,更多相關Mysql InnoDB鎖定機制內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲成人精品在线观看| 国内精品视频666| 日本不卡一二三| 亚洲婷婷免费| 国产亚洲精品久| av在线一区二区| 欧美一区二区三区电影| 久久精品99久久久| 一本色道a无线码一区v| 亚洲高清免费观看高清完整版在线观看| 91麻豆产精品久久久久久| 精品日韩欧美在线| 成人精品视频.| 精品少妇一区二区三区在线播放| 国产精品一二三四区| 欧美精品久久一区| 精品无码三级在线观看视频| 一本到不卡精品视频在线观看 | 日韩午夜在线影院| 丰满放荡岳乱妇91ww| 日韩区在线观看| 不卡欧美aaaaa| 久久精品人人做人人爽人人| 成av人片一区二区| 国产亚洲一区二区三区| 午夜国产精品视频免费体验区| 久久九九影视网| 国产一区视频观看| 亚洲女人的天堂| 亚洲一区欧美激情| 午夜久久久久久| 一本在线高清不卡dvd| 日本美女一区二区三区| 欧美日韩在线三级| 从欧美一区二区三区| 久久久久高清精品| 一色屋精品视频在线看| 一卡二卡三卡日韩欧美| 国产亚洲综合精品| 国产精品久久国产精麻豆99网站| 国色天香一区二区| 亚洲欧美视频一区| 亚洲一区二区成人| 日本欧美韩国一区三区| 欧美日韩日日摸| 成人午夜av在线| 中文字幕av一区二区三区高 | 在线亚洲免费视频| 国产激情一区二区三区桃花岛亚洲| 精品国产免费视频| 亚洲高清二区| 热久久一区二区| 91麻豆精品国产91久久久久| 91婷婷韩国欧美一区二区| 亚洲人成人一区二区在线观看 | 久久精品一二三| 国产精品一区在线播放| 青青草精品视频| 日韩欧美你懂的| 亚洲经典自拍| 欧美a级理论片| 精品日产卡一卡二卡麻豆| 亚洲无线视频| 日韩成人精品在线观看| 欧美一三区三区四区免费在线看 | 精品成人一区二区| 黑人巨大精品欧美一区二区小视频| 亚洲午夜在线观看视频在线| 欧美三级电影网| 欧美在线网址| 午夜精品福利一区二区三区av| 欧美日韩精品一区视频| 99久久国产综合精品麻豆| 综合久久久久久久| 欧美羞羞免费网站| 91视频com| 亚洲午夜久久久久久久久久久 | 亚洲免费高清视频在线| 欧美人成免费网站| 国产精品hd| 男男视频亚洲欧美| 国产视频一区在线观看 | 国产精品分类| 男人操女人的视频在线观看欧美| 精品国产乱码久久久久久闺蜜| 一区二区三区精品视频在线观看| 国产一区在线观看视频| 国产精品国产三级国产三级人妇 | 欧美日韩另类国产亚洲欧美一级| 亚洲欧美亚洲| 美国av一区二区| 国产精品久久久久久久久晋中 | 亚洲成人中文在线| 久久综合色播五月| 久久亚洲午夜电影| 99九九99九九九视频精品| 亚洲国产美国国产综合一区二区| 91精品国产乱| 国产精品亚洲不卡a| 成人国产精品免费观看动漫| 亚洲电影欧美电影有声小说| 久久久久久99精品| 色悠久久久久综合欧美99| 91色porny蝌蚪| 精品一区中文字幕| 亚洲黄色尤物视频| 久久亚洲捆绑美女| 亚洲精品你懂的| 欧美大片一区二区三区| 美日韩免费视频| 欧美日韩一区二区视频在线观看| 韩国精品久久久| 亚洲精品免费在线| 久久综合色综合88| 欧美日韩精品三区| 亚洲一区二区三区免费在线观看| a在线播放不卡| 精品一区二区国语对白| 一区二区在线免费| 国产午夜精品久久久久久免费视 | 99精品久久99久久久久| 麻豆成人免费电影| 一区二区三区在线视频观看58| 精品久久久久99| 在线观看日韩毛片| 99精品视频免费观看视频| 成人三级在线视频| 蜜臀久久久99精品久久久久久| 亚洲精选视频免费看| 精品久久五月天| 欧美日韩免费观看一区三区| 一本一本久久| 欧美激情成人在线| 成人免费观看av| 久久99精品国产.久久久久| 亚洲国产乱码最新视频| 国产精品久久久久久福利一牛影视| 精品少妇一区二区三区在线播放| 欧美午夜精品久久久久久超碰| 亚洲精华国产欧美| 欧美黄色一级视频| 成人美女视频在线看| 国产麻豆精品视频| 青青国产91久久久久久| 午夜精品久久久久久久| 亚洲精品国产精华液| 99久久婷婷国产精品综合| 国模无码大尺度一区二区三区| 日韩国产精品大片| 亚洲电影中文字幕在线观看| 国产精品高潮呻吟久久| 久久久久99精品一区| 日韩欧美亚洲一区二区| 欧美一级午夜免费电影| 欧美综合在线视频| 色婷婷av一区二区三区大白胸 | 国产日韩亚洲欧美综合| 欧美电影免费观看高清完整版在线| 精品视频1区2区| 欧美日韩中文字幕一区二区| 久久最新视频| 每日更新成人在线视频| 先锋影音久久| 国产精品亚洲欧美| 国产一区二区高清| 99国内精品| 在线日韩av| 亚洲成人在线| 在线观看不卡| 国产精品mv在线观看| 亚洲午夜精品久久| 亚洲欧洲日夜超级视频| 欧美午夜不卡影院在线观看完整版免费| 9i在线看片成人免费| 99久久99久久精品国产片果冻 | 夜夜嗨av一区二区三区网页| 亚洲精品视频免费观看| 亚洲欧洲美洲综合色网| 日韩美女精品在线| 亚洲老司机在线| 亚洲综合视频在线观看| 亚洲一线二线三线视频| 亚洲国产va精品久久久不卡综合| 亚洲一区中文在线| 亚洲精品成人天堂一二三| 亚洲欧洲日韩av| 伊人开心综合网| 午夜精品久久久久久久久久| 奇米在线7777在线精品| 国模无码大尺度一区二区三区| 久久电影国产免费久久电影| 国产精品资源在线| 懂色av一区二区夜夜嗨| 91免费观看在线| 亚洲午夜高清视频| 亚洲一区二区三区涩| 色婷婷综合久色| 欧美精品在线视频| 精品国产91久久久久久久妲己| 国产精品久久午夜夜伦鲁鲁|