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

MySQL Repeatable-Read 實(shí)現(xiàn)的一些誤解

數(shù)據(jù)庫(kù) MySQL
對(duì)于 first-committer-wins 的定義, 在si 模式下, 如果在Start-Timestamp -> Commit-Timestamp 這之間如果有其他的trx2 修改了當(dāng)前trx1 修改過(guò)的內(nèi)容, 并且在trx1 提交的時(shí)候, trx2 已經(jīng)提交了. 那么trx1 就會(huì)abort, 這個(gè)叫first-committer-wins。
背景

首先1992 年發(fā)表的SQL Standard 對(duì)隔離級(jí)別進(jìn)行的定義是根據(jù)幾個(gè)異象(Dirty Read, Non-Repeatable Read, Phantom Read) , 當(dāng)然這個(gè)定義非常模糊, 后面Jim Grey 也有文章說(shuō)這個(gè)不合理, 然而此時(shí)MVCC, snapshot isolation 還沒(méi)被發(fā)明. 等有snapshot isolation 以后發(fā)現(xiàn)snapshot isolation 能夠規(guī)避Dirty Read, Non-Repeatable Read, 因此認(rèn)為snapshot isolation 和 Repeatable-read 很像, 所以MySQL, Pg 把他們實(shí)現(xiàn)的snapshot isolation 就稱為了Repeatable-read isolation.

另外snapshot isolation 其實(shí)也沒(méi)有準(zhǔn)確的定義, 因此MySQL 和 PG, Oracle 等等的實(shí)現(xiàn)也是有很大的區(qū)別的.

關(guān)于snapshot isolation 的定義:

A transaction running in Snapshot Isolation is never blocked attempting a read as long as the snapshot data from its Start-Timestamp can be maintained.The transaction’s writes (updates, inserts, and deletes) will also be reflected in this snapshot, to be read again if the transaction accesses (i.e., reads or updates) the data a second time.

這里對(duì)于snapshot isolation 的定義不論對(duì)于讀操作和寫操作都是讀取snapshot 的版本, 這也是pg, oracle 等等版本實(shí)現(xiàn)的, 但是InnoDB 不是這樣的. InnoDB 只有讀操作讀取到的是snapshot 的版本, 但是DML 操作是讀取當(dāng)前已提交的最新版本.

When the transaction T1 is ready to commit, it gets a Commit-Timestamp, which is larger than any existing Start-Timestamp or Commit-Timestamp. The transaction successfully commits only if no other transaction T2 with a Commit-Timestamp in T1’s execution interval [Start- Timestamp, Commit-Timestamp] wrote data that T1 also wrote. Otherwise, T1 will abort. This feature, called First- committer-wins prevents lost updates (phenomenon P4).

對(duì)于 first-committer-wins 的定義, 在si 模式下, 如果在Start-Timestamp -> Commit-Timestamp 這之間如果有其他的trx2 修改了當(dāng)前trx1 修改過(guò)的內(nèi)容, 并且在trx1 提交的時(shí)候, trx2 已經(jīng)提交了. 那么trx1 就會(huì)abort, 這個(gè)叫first-committer-wins.

但是InnoDB 也不是這樣的. InnoDB 并不遵守這個(gè)規(guī)則, 在repeatable read 模式下, 如果trx1, trx2 都修改了同一行, trx2 是先提交的, 那么trx1 的提交會(huì)直接把trx2 覆蓋. 而在類似PG, Oracle 實(shí)現(xiàn)的snapshot isolation 里面, 則是遵守first-committer-wins 的規(guī)則.

所以InnoDB 的snapshot isolation

  1. 僅僅Read 操作讀的是歷史版本

不遵守first-committer-wins 規(guī)則

官方把這種實(shí)現(xiàn)叫做Write committed Repeatable Read.

MySQL 開發(fā)者對(duì)于InnoDB repeatable-read 實(shí)現(xiàn)的介紹:

But when InnoDB Repeatable Read transactions modify the database, it is possible to get phantom reads added into the static view of the database, just as the ANSI description allows.  Moreover, InnoDB relaxes the ANSI description for Repeatable Read isolation in that it will also allow non-repeatable reads during an UPDATE or DELETE.  Specifically, it will write to newly committed records within its read view.  And because of gap locking, it will actually wait on other transactions that have pending records that may become committed within its read view.  So not only is an UPDATE or DELETE affected by pending or newly committed records that satisfy the predicate, but also ‘SELECT … LOCK IN SHARE MODE’ and ‘SELECT … FOR UPDATE’.

This WRITE COMMITTED implementation of REPEATABLE READ is not typical of any other database that I am aware of.  But it has some real advantages over a standard ‘Snapshot’ isolation.  When an update conflict would occur in other database engines that implement a snapshot isolation for Repeatable Read, an error message would typically say that you need to restart your transaction in order to see the current data. So the normal activity would be to restart the entire transaction and do the same changes over again.  But InnoDB allows you to just keep going with the current transaction by waiting on other records which might join your view of the data and including them on the fly when the UPDATE or DELETE is done.  This WRITE COMMITTED implementation combined with implicit record and gap locking actually adds a serializable component to Repeatable Read isolation.

PG 社區(qū)對(duì)于repeatable-read 實(shí)現(xiàn)的介紹:

UPDATE, DELETE, SELECT FOR UPDATE, and SELECT FOR SHARE commands behave the same as SELECT in terms of searching for target rows: they will only find target rows that were committed as of the transaction start time. However, such a target row might have already been updated (or deleted or locked) by another concurrent transaction by the time it is found. In this case, the repeatable read transaction will wait for the first updating transaction to commit or roll back (if it is still in progress). If the first updater rolls back, then its effects are negated and the repeatable read transaction can proceed with updating the originally found row. But if the first updater commits (and actually updated or deleted the row, not just locked it) then the repeatable read transaction will be rolled back with the message

https://www.postgresql.org/docs/13/transaction-iso.html#XACT-READ-COMMITTED

所以這里我們看一下MySQL repeatable-read 的具體行為, 也了解MySQL社區(qū)為什么要做這樣的實(shí)現(xiàn).

mysql> create table checking (name char(20) key, balance int) engine InnoDB;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into checking values ("Tom", 1000), ("Dick", 2000), ("John", 1500);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

Client #1                               Client #2
=====================================   =====================================
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from checking;
+------+---------+
| name | balance |
+------+---------+
| Dick |    2000 |
| John |    1500 |
| Tom  |    1000 |
+------+---------+
3 rows in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update checking
   set balance = balance - 250
   where name = "Dick";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update checking
   set balance = balance + 250
   where name = "Tom";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from checking;
+------+---------+
| name | balance |
+------+---------+
| Dick |    1750 |
| John |    1500 |
| Tom  |    1250 |
+------+---------+
3 rows in set (0.02 sec)
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

                                        mysql> select * from checking;
                                        +------+---------+
                                        | name | balance |
                                        +------+---------+
                                        | Dick |    2000 |
                                        | John |    1500 |
                                        | Tom  |    1000 |
                                        +------+---------+
                                        3 rows in set (0.00 sec)

                                        mysql> update checking
                                           set balance = balance - 200
                                           where name = "John";
                                        Query OK, 1 row affected (0.00 sec)
                                        Rows matched: 1  Changed: 1  Warnings: 0

                                        mysql> update checking
                                           set balance = balance + 200
                                           where name = "Tom";

                                        ### Client 2 waits on the locked record
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
                                        Query OK, 1 row affected (19.34 sec)
                                        Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from checking;
+------+---------+
| name | balance |
+------+---------+
| Dick |    1750 |
| John |    1500 |
| Tom  |    1250 |
+------+---------+
3 rows in set (0.00 sec)
                                        mysql> select * from checking;
                                        +------+---------+
                                        | name | balance |
                                        +------+---------+
                                        | Dick |    2000 |
                                        | John |    1300 | 
                                        | Tom  |    1450 |
                                        +------+---------+
                                        3 rows in set (0.00 sec)

                                      # 這里可以看到Tom = 1450, 而不是從上面 1000 + 200 = 1200, 
                                      # 因?yàn)閡pdate 的時(shí)候, InnoDB 實(shí)現(xiàn)的是write-committed repeatable, 
                                      # 不是基于場(chǎng)景的snapshot isolation的實(shí)現(xiàn), 
                                      # write 操作是直接讀取的已提交的最新版本的數(shù)據(jù)1250, 
                                      # 而不是snapshot 中的數(shù)據(jù)1000.

                                        mysql> commit;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> select * from checking;
+------+---------+
| name | balance |
+------+---------+
| Dick |    1750 |
| John |    1300 |
| Tom  |    1450 |
+------+---------+
3 rows in set (0.02 sec)

這里可以看到Tom = 1450, 而不是從上面 1000 + 200 = 1200, 因?yàn)閡pdate 的時(shí)候, InnoDB 實(shí)現(xiàn)的是write-committed repeatable, 不是基于場(chǎng)景的snapshot isolation的實(shí)現(xiàn), write 操作是直接讀取的已提交的最新版本的數(shù)據(jù)1250, 而不是snapshot 中的數(shù)據(jù)1000.

對(duì)比在PG里面, 由于PG是使用常見(jiàn)的 snapshot isolation 實(shí)現(xiàn)repeatable-read, 那么trx2 在修改Tom 的時(shí)候, 同樣必須等待trx1 commit or rollback, 因?yàn)镻G 讀取和修改基于trx 開始時(shí)候的snapshot 的record. 因此如果trx1 rollback, 那么trx2 則會(huì)基于開始snapshot 時(shí)候的值進(jìn)行修改, 也就是Tom = 1200, 如果trx1 commit, 那么trx2 只能rollback, 并且會(huì)返回

ERROR:  could not serialize access due to concurrent update

也就是在上面的場(chǎng)景下 trx2 是會(huì)rollback.

那么MySQL 為什么要這么做呢?

MySQL 社區(qū)的觀點(diǎn)是在常見(jiàn)的通過(guò)snapshot isolation 來(lái)實(shí)現(xiàn)repeatable Read 的方案里面, 經(jīng)常會(huì)出現(xiàn)如果兩個(gè)事務(wù)修改了同一個(gè)record, 那么就需要后提交的事務(wù)重試這個(gè)流程. 這種在小事務(wù)場(chǎng)景是可以接受的, 但是如果后提交的事務(wù)是大事務(wù), 比如trx1 修改了1個(gè)record rec1并先提交了, 但是trx2 修改了100 行, 正好包含了rec1, 那么常見(jiàn)的snapshot isolation 的實(shí)現(xiàn)就需要trx2 返回錯(cuò)誤, 然后重新執(zhí)行這個(gè)事務(wù). 這樣對(duì)沖突多的場(chǎng)景是特別不友好的.

但是Innodb 的實(shí)現(xiàn)則在修改rec1 的時(shí)候, 如果trx1 已經(jīng)提交了, 那么直接讀取trx1 committed 的結(jié)果, 這樣就可以避免了讓trx2 重試的過(guò)程了. 也可以達(dá)到幾乎一樣的效果.

當(dāng)然這個(gè)僅僅MySQL InnoDB 是這樣的實(shí)現(xiàn), 其他的數(shù)據(jù)庫(kù)都不會(huì)這樣.

兩種方案都有優(yōu)缺點(diǎn)吧, 基于常見(jiàn)SI(snapshot isolation) 實(shí)現(xiàn)會(huì)存在更多的事務(wù)回滾, 一旦兩個(gè)事務(wù)修改了同一個(gè)row, 那么必然有一個(gè)事務(wù)需要回滾, 但是InnoDB 的行為可以允許和其他trx 修改同一個(gè)record, 并且可以在其他trx 修改后的結(jié)果上進(jìn)行更新, 不需要進(jìn)行事務(wù)回滾, 效率會(huì)更高一些, 但是基于常見(jiàn)的snapshot isolation 的實(shí)現(xiàn)更符合直觀感受.

責(zé)任編輯:武曉燕 來(lái)源: MySQL內(nèi)核剖析
相關(guān)推薦

2018-10-29 10:25:17

物聯(lián)網(wǎng)IoT誤解

2011-11-28 15:57:26

MySQL數(shù)據(jù)庫(kù)主從配置

2021-06-11 16:59:41

MySQLRepeatableRead

2017-10-16 14:40:50

數(shù)據(jù)庫(kù)MySQL工具

2011-10-11 17:10:35

MySQL

2018-10-23 13:58:56

私有云云計(jì)算公共云

2019-08-13 16:01:12

2024-08-29 15:26:21

2021-09-12 07:33:23

python管理編程

2022-04-02 14:43:59

Promethues監(jiān)控

2021-06-17 09:16:34

MySQL數(shù)據(jù)庫(kù)隔離級(jí)別

2020-08-07 08:04:03

數(shù)據(jù)庫(kù)MySQL技術(shù)

2010-10-08 16:32:59

MySQL語(yǔ)句

2022-03-22 07:38:00

SQL語(yǔ)句MySQL

2010-05-24 18:22:36

jsp MySQL

2020-02-03 16:03:36

疫情思考

2013-07-02 10:18:20

編程編程策略

2016-11-16 21:18:42

android日志

2009-06-25 09:50:32

JSF

2011-06-01 16:50:21

JAVA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

综合图区亚洲| 亚洲欧美高清视频| 久久看人人摘| 欧美高清视频不卡网| 一本—道久久a久久精品蜜桃| 欧美成欧美va| 精品国产一区二区三区成人影院 | 午夜亚洲性色福利视频| 亚洲天堂久久av| 欧美体内she精高潮| 亚洲人成在线网站| 亚洲卡通动漫在线| 日本一区视频在线| 亚洲美女性生活| 久久国产精品第一页| 欧美激情免费视频| a一级免费视频| 欧美巨大xxxx| 日韩免费看网站| 午夜欧美福利视频| h片在线观看视频免费| 国产精品乱人伦| 蜜桃传媒视频第一区入口在线看| 日韩黄色在线视频| 99成人超碰| 亚洲乱码一区二区| 久久国产劲爆∧v内射| 色综合久久久| 日韩欧美精品在线观看| 青草网在线观看| 男人在线资源站| 国产日韩三级在线| 久久久久久99| 欧洲av在线播放| 精品制服美女久久| 国产精品网站大全| 日韩 国产 欧美| 一区二区高清| 久久人人爽人人| 日本黄色片免费观看| 日本a级不卡| 亚洲最新av网址| 蜜桃av免费看| 国产探花一区| 亚洲欧洲在线播放| 800av在线播放| av综合网址| 日韩三级视频在线观看| 污免费在线观看| 欧美国产亚洲精品| 日韩免费一区二区| 97中文字幕在线观看| 欧美高清一级片| 日韩欧美国产系列| 师生出轨h灌满了1v1| 久久一级大片| 日韩西西人体444www| 熟妇无码乱子成人精品| 欧美影院精品| 欧美精品一区二区蜜臀亚洲| 久久久久亚洲av成人网人人软件| 欧美影视资讯| 欧美影视一区二区三区| 牛夜精品久久久久久久| 成人国产激情| 69堂精品视频| 中文字幕久久久久久久| 99a精品视频在线观看| 精品久久人人做人人爰| 97人妻精品一区二区三区免费| 国产麻豆一区| 3d动漫精品啪啪1区2区免费| www.偷拍.com| 红杏aⅴ成人免费视频| 亚洲美女福利视频网站| 精品丰满少妇一区二区三区| 天天射成人网| 久久露脸国产精品| 中文字幕69页| 精品一二三四区| 粉嫩高清一区二区三区精品视频 | 麻豆蜜桃91| 久久经典视频| 亚洲麻豆国产自偷在线| 国产3p露脸普通话对白| 日韩欧美精品电影| 正在播放一区二区| 亚洲天堂av网站| 欧美日韩有码| 欧美激情极品视频| 不卡av电影在线| 国产伦精品一区二区三区视频青涩 | 亚洲高清在线观看| 亚洲久久久久久久| 一区二区三区午夜探花| 81精品国产乱码久久久久久| 在线视频免费观看一区| 成人在线综合网| 欧美日韩天天操| 超碰在线caoporen| 色婷婷综合久久久中文一区二区| 黄色免费视频大全| 婷婷久久免费视频| 亚洲激情在线视频| 日本二区三区视频| 国产亚洲毛片| 亚洲一区二区三区四区在线播放| 一级片免费网站| 99久久精品国产一区二区三区| 91免费看蜜桃| 国产露出视频在线观看| 亚洲精品久久嫩草网站秘色| 苍井空浴缸大战猛男120分钟| 亚洲国产成人二区| 日韩欧美成人午夜| 麻豆一区在线观看| 国产欧美一区二区色老头| 成人深夜直播免费观看| 黄色软件在线| 欧美午夜精品伦理| 欧洲成人午夜精品无码区久久| 国产精品x8x8一区二区| www高清在线视频日韩欧美| 日韩免费视频一区二区视频在线观看| 亚洲国产1区| 91中文在线视频| 中文字幕在线播放| 一本大道久久a久久精二百| av不卡中文字幕| 亚洲欧洲美洲一区二区三区| 国产精品一区二区久久| 国产在线视频网址| 欧美日韩国产精品专区| fc2成人免费视频| 正在播放日韩欧美一页| 成人国产精品色哟哟| 成人av电影观看| 色激情天天射综合网| 波多野结衣av在线免费观看| 日韩午夜在线电影| 国产精品一区二区三区不卡 | 91成人国产综合久久精品| 91丨porny丨蝌蚪视频| 国产真人做爰毛片视频直播| 久久的色偷偷| 久久国产精品影视| 99久久久久久久| 亚洲精品美国一| 国内精品国产三级国产aⅴ久| 首页亚洲中字| 日本精品久久久久久久| 免费国产在线观看| 欧美视频免费在线| 国产女主播喷水高潮网红在线| 亚洲女同中文字幕| 亚洲一区二区三区毛片 | 成人性生交大片免费看96| 久久伊人免费视频| 精品国产乱码一区二区三| 亚洲乱码国产乱码精品精的特点 | 中文字幕在线观看日韩| 中国a一片一级一片| 国产欧美一区二区在线观看| 美女黄色片视频| 日韩在线视屏| 95av在线视频| 爱草tv视频在线观看992| 亚洲精品aⅴ中文字幕乱码| 午夜婷婷在线观看| 中文一区一区三区高中清不卡| 久久久久久久久久网| 日韩在线影视| 国产精品久久99久久| 欧美精品videos另类| 日韩视频一区二区在线观看| 日韩毛片在线播放| 国产亚洲福利社区一区| xxxx在线免费观看| 欧美激情综合色综合啪啪| 精品乱色一区二区中文字幕| 欧美色片在线观看| 美女少妇精品视频| 色网站免费观看| 欧美综合亚洲图片综合区| 国产美女久久久久久| 成人毛片老司机大片| 青青草原av在线播放| 日韩黄色大片| 国产精品二区在线| 台湾佬中文娱乐久久久| 欧美精品手机在线| 玖玖综合伊人| 91精品国产福利| 久久久久久少妇| 亚洲人xxxx| 无套内谢大学处破女www小说| a91a精品视频在线观看| 日日噜噜噜噜夜夜爽亚洲精品| 波多视频一区| 久久精品免费播放| 亚洲人成色777777老人头| 在线不卡a资源高清| 激情综合网五月婷婷| 久久精品男人的天堂| 日本xxxx免费| 蜜臀国产一区二区三区在线播放| 亚欧精品在线| 精品五月天堂| 成人午夜高潮视频| 少妇一区视频| 高清一区二区三区四区五区| 色欧美激情视频在线| 亚洲精品电影网站| 91欧美日韩麻豆精品| 色偷偷久久一区二区三区| 精品一区二区三区人妻| 中文字幕一区二| 最近中文字幕免费| 91麻豆国产精品久久| 亚洲国产欧美91| 美国一区二区三区在线播放 | 日韩高清欧美高清| 中文字幕在线播出| 亚洲成人自拍网| 91视频青青草| 国产精品视频免费看| 美女又爽又黄视频毛茸茸| 岛国av在线一区| 一起草最新网址| 国产综合色视频| 五月激情婷婷在线| 99热在线精品观看| 国产天堂视频在线观看| 你懂的成人av| 黄色一级视频播放| 婷婷综合久久| 在线观看一区欧美| 久久国产精品亚洲人一区二区三区 | 91视视频在线直接观看在线看网页在线看| 可以在线看的av网站| 久久久国产精品| 日本特级黄色大片| 天天射天天综合网| 波多野结衣三级在线| 欧美电影一区| 自拍视频一区二区三区| 99精品网站| 二级片在线观看| 中出一区二区| 菠萝蜜视频在线观看入口| 欧美日本不卡高清| 欧美午夜性视频| 亚洲欧美成人| 国产福利一区视频| 日本成人在线一区| 九九热免费在线观看| 国产做a爰片久久毛片| 手机在线视频一区| 国产成人精品亚洲777人妖 | 久久久国内精品| 精品91在线| 少妇性饥渴无码a区免费| 久久精品首页| 欧美日韩一区二区三区69堂| 韩国女主播成人在线| 丰满少妇中文字幕| 99久久精品国产一区| 国产又粗又猛又爽视频| 国产精品久线观看视频| 激情五月婷婷小说| 精品毛片三在线观看| 波多野结衣二区三区| 在线不卡中文字幕| 五月婷婷狠狠干| 中文字幕欧美在线| 日韩精品卡一| 欧美专区第一页| 9999精品| 国产一区再线| 日韩一区欧美| 分分操这里只有精品| 亚洲综合国产| 成人不卡免费视频| 99久久精品免费精品国产| 日本美女bbw| 亚洲成人av在线电影| 瑟瑟视频在线免费观看| 日韩欧美国产一区二区三区| 男女污污视频在线观看| 欧美成年人视频网站欧美| 三级中文字幕在线观看| 国产精品视频永久免费播放| 亚洲不卡在线| 日韩电影在线播放| 欧美日韩精选| 一区二区三区国产免费| 粉嫩13p一区二区三区| 中文天堂资源在线| 亚洲成人www| 国产情侣自拍小视频| 精品无人区太爽高潮在线播放| 天堂中文字幕在线| 久久久www成人免费精品张筱雨| av资源种子在线观看| 久久久久国产精品www| 日本一区二区三区视频在线| 成人在线观看91| 精品淫伦v久久水蜜桃| 在线亚洲美日韩| 久久欧美肥婆一二区| 亚洲一二三四五| 国产精品美女久久久久久久网站| 国产精品成人在线视频| 激情av一区二区| av在线资源观看| 最近2019中文字幕一页二页| 91av亚洲| 精品国产一区二区三区麻豆小说| 美女视频亚洲色图| 九一免费在线观看| 久草热8精品视频在线观看| 9.1成人看片免费版| 亚洲国产va精品久久久不卡综合| 影音先锋亚洲天堂| 欧美大片顶级少妇| 国产传媒在线播放| 国产欧美精品一区二区三区介绍| 国产精品美女久久久久| 日韩精品电影网站| 久久国产直播| 国产精品无码一区二区三区免费| 国产欧美日韩综合| 精品美女久久久久| 亚洲成人黄色网| wwwwxxxx在线观看| 国产精品一区二区三区免费观看| 精品在线手机视频| 黄色国产精品视频| 91蝌蚪porny九色| 国产91精品一区| 日韩高清a**址| 中文不卡1区2区3区| 久久av免费观看| 国产精品久久久免费| 丰满大乳奶做爰ⅹxx视频| 欧美日韩国产在线| 天堂a√在线| 日本精品va在线观看| 欧美人与拘性视交免费看| 欧在线一二三四区| 欧美国产成人在线| 亚洲天堂自拍偷拍| 不卡毛片在线看| 99这里只有精品视频| 亚洲人成无码网站久久99热国产| 精品一区二区三区免费观看| 成人在线观看高清| 日韩一卡二卡三卡四卡| 久草在线资源站资源站| 精品国产一区二区三区免费| 久久精品一本| 99久久久无码国产精品不卡| 337p亚洲精品色噜噜狠狠| 欧美寡妇性猛交xxx免费| 国产伦精品一区二区三毛| 国产农村妇女毛片精品久久莱园子| 性生生活大片免费看视频| 最新不卡av在线| 高清毛片aaaaaaaaa片| 国产91av在线| 日本激情一区| 又大又长粗又爽又黄少妇视频| 欧美经典一区二区| av免费观看在线| 97精品视频在线观看| 国产a久久精品一区二区三区| 日韩一级性生活片| 久久久91精品国产一区二区精品| 日韩 欧美 精品| 国产小视频91| 国色天香久久精品国产一区| 777久久久精品一区二区三区 | 亚洲自拍小视频| 亚洲久色影视| 国产免费嫩草影院| 亚洲精品一区二区在线观看| 国产电影一区二区三区爱妃记| 久久国产一区二区| 美女国产一区二区| 97人人澡人人爽人人模亚洲| 怡红院精品视频| 国产毛片精品| 中文字幕第一页在线视频| 亚洲va天堂va国产va久| 成人高清网站| 狠狠久久综合婷婷不卡| 激情综合色综合久久综合| 91国产丝袜播放在线| 久久精品视频一| 国产一区二区三区91|