3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

[转载] 数据库分析手记 —— InnoDB锁机制分析

發(fā)布時(shí)間:2025/6/17 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载] 数据库分析手记 —— InnoDB锁机制分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

作者:倪煜

? ? ? ? InnoDB鎖機(jī)制常常困擾大家,不同的條件下往往表現(xiàn)出不同的鎖競爭,在實(shí)際工作中經(jīng)常要分析各種鎖超時(shí)、死鎖的問題。本文通過不同條件下的實(shí)驗(yàn),利用InnoDB系統(tǒng)給出的各種信息,分析了鎖的工作機(jī)制。通過本文可以幫助大家了解InnoDB鎖的基本原理,常見的沖突、死鎖,以及對InnoDB事務(wù)日志信息的解讀。

1.?索引基本原理

? ? ? ? InnoDB主要使用行級鎖(row lock),其行鎖是通過在索引項(xiàng)上加鎖而實(shí)現(xiàn)的,如果MySQL的執(zhí)行計(jì)劃沒有用到索引,那么行鎖也就無意義了,所以了解鎖之前需要了解一點(diǎn)索引原理。InnoDB索引是由改進(jìn)的B+樹實(shí)現(xiàn),基本特點(diǎn)就是一顆快速查找樹同時(shí)葉子節(jié)點(diǎn)由雙向鏈表連接,索引項(xiàng)都在葉子節(jié)點(diǎn)上,而且分為兩種類型:

  • 聚簇索引(clustered index?)(或主鍵索引)
  • ?輔助索引(secondary index)(或二級索引、非聚簇索引)

? ? ? ? 聚簇索引的特點(diǎn)是葉子節(jié)點(diǎn)中除了存儲索引key值,還存儲了真實(shí)的記錄內(nèi)容,同時(shí)還會存儲事務(wù)ID和回滾指針。因此聚簇索引就等于表的真實(shí)內(nèi)容,所以每張表都會有一個(gè)聚簇索引。通常聚簇索引就是主鍵索引,如果建表時(shí)沒有顯示的定義主鍵,則會首先選擇“非空的唯一索引(unique not null)”作為聚簇索引。如果沒有的話則會自動創(chuàng)建一個(gè)6字節(jié)大小的隱藏主鍵作為主鍵索引值,隨著記錄增加而單調(diào)遞增。一張表只有一個(gè)聚簇索引,否則該多浪費(fèi)。其他的索引都屬于輔助索引,輔助索引只存儲輔助鍵和主鍵,查詢時(shí)要再通過主鍵索引二次查找定位記錄。由于輔助索引的鍵值是可以重復(fù)的,所以為了唯一標(biāo)識B+樹鍵值,需要重復(fù)存儲主鍵值。

? ? ? ? InnoDB按聚簇索引的形式存儲數(shù)據(jù),大致如下:(《高性能MySQL》配圖)

?

? ? ? ? 聚簇索引中的每個(gè)葉子節(jié)點(diǎn)包含primary key的值、事務(wù)ID、回滾指針(rollback pointer)和余下的列。下文分析中會看到這幾個(gè)字段的具體展現(xiàn)。

? ? ? ? 輔助索引類似如下:

? ? ? ? 記錄的是輔助key值和主key值。

? ? ? ? 上面的示意圖相當(dāng)于索引的邏輯結(jié)構(gòu),在實(shí)際中B+樹中所有葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)都是通過page結(jié)構(gòu)管理,一個(gè)page單元通常含有多個(gè)節(jié)點(diǎn)數(shù)據(jù)。每個(gè)page中有一個(gè)Infimum表示最小,Supremum表示最大。通常的一個(gè)主鍵索引詳細(xì)結(jié)構(gòu)類似于Jeremy Cole的博客中提供InnoDB結(jié)構(gòu)圖:

? ? ? ? (關(guān)于InnoDB索引的實(shí)現(xiàn)細(xì)節(jié)請參考另一篇wiki《InnoDB索引實(shí)現(xiàn)機(jī)制》)

?

2. InnoDB鎖的模式和類型

? ? ? ? InnoDB鎖有兩個(gè)緯度,一個(gè)是鎖模式,一個(gè)是鎖類型。

2.1 鎖模式:

  • S共享鎖:讀鎖(shared lock permits the transaction that holds the lock to read a row.)

? ? ? ? (select …where … lock in share mode)顯示的加S鎖。允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。

  • X排它鎖:寫鎖(exclusive lock permits the transaction that holds the lock to update or delete a row)

? ? ? ? (select … where … for update)顯示的加X鎖。允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫鎖。

? ? ? ?

? ? ? ? 為了允許行鎖和表鎖共存,實(shí)現(xiàn)多粒度鎖機(jī)制,同時(shí)還有兩種內(nèi)部使用的表級意向鎖(都是表鎖),所謂意向就是想做但沒真做。

  • IS鎖:事務(wù)對記錄加S鎖之前必須先獲取表的IS鎖(Intention shared?(IS): Transaction?T?intends to set?S?locks on individual rows in table?t.)

? ? (Before a transaction can acquire an S lock on a row in table t, it must first acquire an IS or stronger lock on t. )

?

  • IX鎖:事務(wù)對記錄加X鎖之前必須先獲取表的IX鎖(Intention exclusive?(IX): Transaction?T?intends to set?X?locks on those rows.)

? ? (Before a transaction can acquire an X lock on a row, it must first acquire an IX lock on t. )

? ? ? ? 關(guān)于意向鎖的官方補(bǔ)充解釋:Thus, intention locks do not block anything except full table requests (for example,?LOCK TABLES ... WRITE). 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自動加的,不需用戶干預(yù),對于UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及到的數(shù)據(jù)集加排他鎖X,對于普通SELECT語句,InnoDB不會加任何鎖。

? ? ? ??SELECT ... LOCK IN SHARE MODE?會先設(shè)置一個(gè)IS

? ? ? ??SELECT ... FOR UPDATE?會先設(shè)置一個(gè)IX

? ? ?不同的鎖有不同的兼容性。四種鎖的兼容矩陣如下:

請求模式

當(dāng)前模式

X

IX

S

IS

X

沖突

沖突

沖突

沖突

IX

沖突

兼容

沖突

兼容

S

沖突

沖突

兼容

兼容

IS

沖突

兼容

兼容

兼容

? ? ? ? 意向鎖之間沒有任何沖突,S和X鎖之間的關(guān)系顯而易見。只有X、S鎖和意向鎖之間的關(guān)系比較特殊,后文詳細(xì)舉例分析。

2.2 鎖類型

? ? ? ? 除了有鎖模式概念,還有鎖的類型,總體分為表級鎖和行級鎖。

2.2.1 表鎖

? ? ? ? lock table XXX read;對表XXX加S讀鎖。

? ? ? ? lock table XXX write;對表XXX加X寫鎖。

? ? ? ? 意向鎖就是表級鎖,會跟表鎖之間有沖突。

2.2.2 行鎖

  • 間隙鎖(Gap Lock),只鎖間隙。表現(xiàn)為鎖住一個(gè)區(qū)間(注意這里的區(qū)間都是開區(qū)間,也就是不包括邊界值)。
  • 記錄鎖(Record Lock),只鎖記錄。表現(xiàn)為僅僅鎖著單獨(dú)的一行記錄。
  • Next-Key鎖(源碼中稱為Ordinary Lock),同時(shí)鎖住記錄和間隙。從實(shí)現(xiàn)的角度為record lock+gap lock,而且兩種鎖有可能只成功一個(gè),所以next-key是半開半閉區(qū)間,且是下界開,上界閉。一張表中的next-key鎖包括:(負(fù)無窮大,最小的第一條記錄],(記錄之間],(最大的一條記錄,正無窮大)。
  • 插入意圖鎖(Insert Intention Lock),插入操作時(shí)使用的鎖。在代碼中,插入意圖鎖實(shí)際上是Gap鎖上加了一個(gè)LOCK_INSERT_INTENTION的標(biāo)記。也就是說insert語句會對插入的行加一個(gè)X記錄鎖,但是在插入這個(gè)行的過程之前,會設(shè)置一個(gè)Insert intention的Gap鎖,叫做Insert intention鎖。

? ? ? ? 看一下官方定義:

InnoDB?has several types of record-level locks including record locks, gap locks, and next-key locks. For information about shared locks, exclusive locks, and intention locks, see?Section?14.2.3, “InnoDB Lock Modes”.

  • Record lock: This is a lock on an index record.

  • Gap lock: This is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.

  • Next-key lock: This is a combination of a record lock on the index record and a gap lock on the gap before the index record.

  • INSERT?sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-key lock (that is, there is no gap lock) and does not prevent other sessions from inserting into the gap before the inserted row.

? ? ? ? 行鎖在X鎖上做了一些精確的細(xì)分,在代碼中稱作Precise Mode。這些精確的模式使的鎖的粒度更細(xì)小,可以減少沖突。而且在事務(wù)級別RC或者innodb_locks_unsafe_for_binlog打開的情況下GAP鎖會失效。這個(gè)很重要,后面會說到。

3. 主鍵索引鎖分析

? ? ? ? 分析鎖之前一定要確認(rèn)前提條件。

鎖分析前提條件:

隔離級別為RR:

tx_isolation = REPEATABLE-READ

?

關(guān)閉binlog不安全寫:

innodb_locks_unsafe_for_binlog = OFF

?

? ? ? ? 同時(shí)打開InnoDB監(jiān)控:create table innodb_lock_monitor(x int) engine=InnoDB;

? ? ? (關(guān)于監(jiān)控的官方文檔:http://dev.MySQL.com/doc/refman/5.1/en/innodb-standard-monitor.html)

3.1 主鍵索引鎖測試

? ? ? ? 下面的實(shí)驗(yàn)建立在一張簡單的表A上,我們通過實(shí)例觀察InnoDB鎖機(jī)制。假設(shè)我們有這樣一張表A:

?

? ? ? ? 建表語句和數(shù)據(jù)集如下:

| A???? | CREATE TABLE `A` (

? `id` int(11) NOT NULL,

? `name` varchar(1024) DEFAULT NULL,

? `t` int(11) DEFAULT NULL,

? PRIMARY KEY (`id`),

? KEY `i_name` (`name`(255))

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

MySQL>? select * from A;

+----+------+

| id | name |

+----+------+

|? 2 | aa?? |

|? 6 | eee? |

|? 7 | aa?? |

|? 8 | adf? |

|? 9 | aa?? |

| 11 | a??? |

| 12 | bbb? |

+------+------+

7 rows in set (0.00 sec)

?

? ? ? ? 下面通過針對不同的where條件,觀察主鍵索引加鎖情況,注意彩色的內(nèi)容,先把要測試的條件列出來:

where條件
=1
<2
=2
<=2
>2 and <6
>=2 and <6
>=2 and <=6
=4
=6
>12
>=12
=12
<=12 and >11
<12 and >11

?

? ? ? ? 下面逐條分析:

case1:=1

MySQL> select * from A where id=1 for update;

Empty set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 721

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 720, ACTIVE 3 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 178 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 720 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 720lock_mode X locks gap before rec?? //行鎖模式與類型

Record lock,?heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0?//上鎖的記錄

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

解析:

  • TABLE LOCK table `test`.`A` trx id 720 lock mode IX

事務(wù)720對表A加IX鎖,如前面所述,對行加X鎖之前先對表加IX

  • ?lock_mode X locks gap before rec

對索引項(xiàng)加X鎖,類型為gap鎖

  • ?heap no 19 PHYSICAL RECORD

表示gap鎖加在哪個(gè)索引項(xiàng)上,19可以先理解為索引項(xiàng)的物理地址,InnoDB使用Page no. +Heap no.來做行的唯一識別。我們可以將Heap no.理解為頁面上的一個(gè)自增數(shù)值。每條物理記錄在被創(chuàng)建時(shí),都會分配一個(gè)唯一的heap no。

鍵值可以理解為一個(gè)邏輯值,page no. + heap no. 可以理解為物理地址。

?

從這里也可以看出gap鎖實(shí)際是加在索引項(xiàng)上的,不同的索引項(xiàng)之間并沒有其他數(shù)據(jù)結(jié)構(gòu)管理gap鎖。

? ? ? ? 一條行記錄可由(space_id, page_no, heap_no)唯一標(biāo)識,記錄項(xiàng)字段包含四個(gè)部分:

0: len 4; hex 80000002; asc ?聚簇值字段

1: len 6; hex 000000000714; asc? 事務(wù)ID:48位整型的ID值,由最近一次修改該字段的事務(wù)決定。

2: len 7; hex 94000001960110; asc? 回滾指針:包含最近一次修改該字段的undo記錄,長度為7字節(jié)(1-bit“is insert”標(biāo)記;7-bit回滾段ID;4字節(jié)頁號;2字節(jié)undo log的頁偏移)

3: len 2; hex 6161; asc aa;; 非主鍵字段:

?

?

?

case2:<2

select * from A where id<2 for update;

---TRANSACTION 718, ACTIVE 36 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 134 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 718 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 718lock_mode X ??????//后面未標(biāo)明鎖類型的是默認(rèn)類型,在源碼中是LOCK_ORDINARY

Record lock,?heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

解析:

  • lock_mode X

在索引項(xiàng)2上加next-key鎖,其他兩處解釋同上

?

?

case3:=2

MySQL> select * from A where id=2 for update;

+----+------+

| id | name |

+----+------+

|? 2 | aa?? |

+----+------+

1 row in set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 721

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 720, ACTIVE 3 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 178 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 720 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 720lock_mode X locks rec but not gap?? //X模式的記錄鎖

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

分析:

  • lock_mode X locks rec but not gap

只有一個(gè)對2這條記錄(heap no 19)的記錄鎖,符合常識。

?

?

?

?

case4:<=2

MySQL> select * from A where id<=2 for update;???????????

+----+------+

| id | name |

+----+------+

|? 2 | aa?? |

+----+------+

1 row in set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 71F

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 71E, ACTIVE 2 sec

2 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 168 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 71E lock mode IX

RECORD LOCKS?space id 0 page no 306?n bits 88 index `PRIMARY` of table `test`.`A` trx id 71Elock_mode X

Record lock, heap no 14 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;???????//主key值6

?1: len 6; hex 000000000536; asc????? 6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;?????//記錄中非主建字段

?

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

解析:

表示給heap no 14和heap no 19分別加一個(gè)X模式的next-key鎖。這里heap no 19是指key為2的記錄(看前面的hex值),heap no 14是指key為6的記錄,也就是說<=2時(shí)不僅會加鎖2,還會加鎖2后面的一條記錄6.

這個(gè)條件會導(dǎo)致后面的很多特殊的鎖沖突。原因暫時(shí)沒想到,應(yīng)該跟索引掃描有關(guān)。

?

InnoDB鎖系統(tǒng)有1個(gè)全局對象lock_sys(type lock_sys_t),而行鎖的hash table就存儲在其中

struct lock_sys_t {

??????? ib_mutex_t????? mutex;??

??????? hash_table_t*?? rec_hash;?? --行鎖hash表,以(space_id, page_no)為hash key,即同一頁的所有鎖均在一個(gè)hash bucket上,

??????? ulint?????????? n_lock_max_wait_time;

??????? // more ...

};

?

?

case5:>2 and <6

MySQL> select * from A where id>2 and id<6 for update;?????????????

Empty set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 723

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 722, ACTIVE 3 sec

2 lock struct(s), heap size 376, 1 row lock(s) //2個(gè)鎖結(jié)構(gòu),1個(gè)行鎖

MySQL thread id 1, OS thread handle 0x415b9960, query id 188 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 722 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 722 lock_mode X

Record lock, heap no 14 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 000000000536; asc????? 6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;

只在記錄6上加了一個(gè)X的next-key鎖

?

?

case6::>=2 and <6

MySQL> select * from A where id>=2 and id<6 for update;

+----+------+

| id | name |

+----+------+

|? 2 | aa?? |

+----+------+

1 row in set (0.00 sec)

TABLE LOCK table `test`.`A` trx id 71D lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 71Dlock_mode X locks rec but not gap

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

?

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 71Dlock_mode X

Record lock, heap no 14 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 000000000536; asc? ????6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;

記錄2上加了一個(gè)X的記錄鎖;記錄6上加了一個(gè)X的next-key鎖

?

?

case7: >=2 and <=6

select * from A where id>=2 and id<=6 for update;

------------

TRANSACTIONS

------------

Trx id counter 729

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 727, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 207 localhost root

---TRANSACTION 728, ACTIVE 2 sec

3 lock struct(s), heap size 376, 3 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 212 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 728 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 728lock_mode X locks rec but not gap

Record lock,?heap no 19?PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

?

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 728lock_mode X

Record lock,?heap no 14?PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 000000000536; asc????? 6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;

?

Record lock,?heap no 18?PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000007; asc???? ;;

?1: len 6; hex 0000000005cd; asc?????? ;;

?2: len 7; hex a7000001900110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

記錄2加了記錄鎖;記錄6和7加了next-key鎖

?

?

?

case8: =4(記錄不存在)

MySQL> select * from A where id=4 for update;???

Empty set (0.01 sec)

------------

TRANSACTIONS

------------

Trx id counter 720

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 71F, ACTIVE 3 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 172 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 71F lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 71Flock_mode X locks gap before rec

Record lock,?heap no 14 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 000000000536; asc????? 6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;

?

對一個(gè)不存在的記錄加鎖,鎖住間隙,所以在記錄6上加了一個(gè)X模式的gap鎖

?

?

?

case9: =6

MySQL> select * from A where id=6 for update;

+----+------+

| id | name |

+----+------+

|? 6 | eee? |

+----+------+

1 row in set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 722

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 71A, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 163 localhost root

---TRANSACTION 721, ACTIVE 2 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 182 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 721 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 721 lock_mode X locks rec but not gap

Record lock, heap no 14 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 000000000536; asc????? 6;;

?2: len 7; hex ae0000014f0110; asc???? O? ;;

?3: len 3; hex 656565; asc eee;;

只加一個(gè)記錄鎖

?

? ? ? ? 對于記錄的末尾會不會有什么不同嗎?我們繼續(xù)驗(yàn)證一下:

?

?

case10:>12

MySQL> select * from A where id>12 for update;

Empty set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 72A

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 727, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 207 localhost root

---TRANSACTION 729, ACTIVE 19 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 217 localhost root

show engine InnoDB status

Trx read view will not see trx with id >= 72A, sees < 72A

TABLE LOCK table `test`.`A` trx id 729 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 729 lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

不太一樣,對無窮大supremum加了一個(gè)X的next-key鎖

?

?

?

case11:>=12

MySQL> select * from A where id>=12 for update;??????????

+----+------+

| id | name |

+----+------+

| 12 | bbb? |

+----+------+

1 row in set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 72A

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 727, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 207 localhost root

---TRANSACTION 729, ACTIVE 62 sec

3 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 219 localhost root

show engine InnoDB status

Trx read view will not see trx with id >= 72A, sees < 72A

TABLE LOCK table `test`.`A` trx id 729?lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 729 lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

?

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 729lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000c; asc???? ;;

?1: len 6; hex 000000000542; asc????? B;;

?2: len 7; hex b900000156011c; asc???? V? ;;

?3: len 3; hex 626262; asc bbb;;

除了等于的記錄12加記錄所,還要給sup加next-key

?

?

?

case12: =12

MySQL> select * from A where id=12 for update;

+----+------+

| id | name |

+----+------+

| 12 | bbb? |

+----+------+

1 row in set (0.01 sec)

------------

TRANSACTIONS

------------

Trx id counter 78E

Purge done for trx's n:o < 78D undo n:o < 0

History list length 63

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 789, not started

MySQL thread id 10, OS thread handle 0x415b9960, query id 510 localhost root

---TRANSACTION 78D, ACTIVE 17 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 522 localhost root

show engine InnoDB status

Trx read view will not see trx with id >= 78E, sees < 78E

TABLE LOCK table `test`.`A` trx id 78D lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 78D lock_mode X locks rec but not gap

/*后面值的操作由于我做了表內(nèi)容改動,所以heap no變了,但不影響結(jié)論*/

Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

0: len 4; hex 8000000c; asc???? ;;

1: len 6; hex 00000000077f; asc?????? ;;

2: len 7; hex ef000001750158; asc???? u X;;

3: len 3; hex 626262; asc bbb;;

不多說

?

?

case13: <=12 and >11

MySQL> select * from A where id<=12 and id>11 for update;

+----+------+

| id | name |

+----+------+

| 12 | bbb? |

+----+------+

1 row in set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 78F

Purge done for trx's n:o < 78D undo n:o < 0

History list length 63

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 789, not started

MySQL thread id 10, OS thread handle 0x415b9960, query id 510 localhost root

---TRANSACTION 78E, ACTIVE 9 sec

2 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 527 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 78E lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 78E lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

?

Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000c; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750158; asc???? u X;;

?3: len 3; hex 626262; asc bbb;;

sup和記錄12加X的next-key鎖

?

?

?

case14: <12 and >11

MySQL> select * from A where id<12 and id>11 for update;

Empty set (0.00 sec)

------------

TRANSACTIONS

------------

Trx id counter 790

Purge done for trx's n:o < 78D undo n:o < 0

History list length 63

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 789, not started

MySQL thread id 10, OS thread handle 0x415b9960, query id 510 localhost root

---TRANSACTION 78F, ACTIVE 4 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 531 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 78F lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 78F lock_mode X

Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000c; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750158; asc???? u X;;

?3: len 3; hex 626262; asc bbb;;

?

?

? ? ? ? 從上面的case實(shí)驗(yàn)可以得出一張表,表示不同條件下分別在哪些索引項(xiàng)上,加何種鎖:

? ? ? ? 左邊一列是where條件,G表是GAP鎖加在哪個(gè)索引項(xiàng)上,N是next-key鎖,R是記錄鎖。有了這個(gè)表,就可以知道在不同條件的事務(wù)并發(fā)下,哪些會產(chǎn)生鎖等待。

?

比如,如果有下面兩個(gè)并發(fā)事務(wù)發(fā)生:

t1

t2

select * from A where id<2 for update;

select * from A where id=2 for update;?

t1事務(wù)需要<2的,t2事務(wù)需要=2的,表面上兩個(gè)條件沒有重合之處,但是由于他們都是在索引key=2上加鎖,所以就會產(chǎn)生沖突:

------------

TRANSACTIONS

------------

Trx id counter 71A

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 719, ACTIVE 13 sec starting index read

MySQL tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 2, OS thread handle 0x41743960, query id 133 localhost root statistics

select * from A where id=2 for update

------- TRX HAS BEEN WAITING 13 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 719 lock_mode X locks rec but not gap waiting

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

?

------------------

TABLE LOCK table `test`.`A` trx id 719 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 719 lock_mode X locks rec but not gap waiting

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

?

---TRANSACTION 718,?ACTIVE 36 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 134 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 718 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 718 lock_mode X

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

解析:

先執(zhí)行了TRANSACTION 718,鎖住heap no 19 PHYSICAL RECORD,后執(zhí)行的TRANSACTION 719就會發(fā)生lock_mode X locks rec but not gap waiting。注意觀察上面鎖等待的信息

?

從上表還可知,同樣的事情還會發(fā)生在下面類似的例子:

t1

t2

select * from A where id<=2 for update;

select * from A where id>2 and id<6 for update;

?

3.2 鎖類型的精確模式

? ? ? ? 那么對于下面這種呢:

t1

t2

select * from A where id<2 for update;

select * from A where id=1 for update;

? ? ? ? 按照表來說兩個(gè)事務(wù)都會對key=2加鎖,而且都是for update的X鎖,應(yīng)該會有沖突,我們看下結(jié)果。

------------

TRANSACTIONS

------------

Trx id counter 71A

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 719, ACTIVE 216 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 2, OS thread handle 0x41743960, query id 136 localhost root

TABLE LOCK table `test`.`A` trx id 719 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 719 lock_mode X locks gap before rec

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

?

---TRANSACTION 718, ACTIVE 239 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 137 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 718 lock mode IX

RECORD LOCKS space id 0 page no 306 n bits 88 index `PRIMARY` of table `test`.`A` trx id 718 lock_mode X

Record lock, heap no 19 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 000000000714; asc?????? ;;

?2: len 7; hex 94000001960110; asc??????? ;;

?3: len 2; hex 6161; asc aa;;

結(jié)果毫無沖突,兩個(gè)X鎖都成功了,而且都鎖住heap no 19,為什么呢?

?

? ? ? ??為了解釋上面的case就要引入一種行鎖的精確模式,我先貼一下源碼中對于4中鎖類型的注釋:

#define LOCK_S? 4 /* shared */

#define LOCK_X? 5 /* exclusive */

...

/* Waiting lock flag */

? #define LOCK_WAIT 256

/* this wait bit should be so high that it can be ORed to the lock

mode and type; when this bit is set, it means that the lock has not

yet been granted, it is just waiting for its turn in the wait queue */

...

/* Precise modes */

? #define LOCK_ORDINARY 0

/* this flag denotes an ordinary next-key lock in contrast to LOCK_GAP

or LOCK_REC_NOT_GAP */

??#define LOCK_GAP 512

/* this gap bit should be so high that it can be ORed to the other

flags; when this bit is set, it means that the lock holds only on the

gap before the record; for instance, an x-lock on the gap does not

give permission to modify the record on which the bit is set; locks of this type are created when records are removed from the index chain of records */

??#define LOCK_REC_NOT_GAP 1024

/* this bit means that the lock is only on the index record and does

NOT block inserts to the gap before the index record; this is used in

the case when we retrieve a record with a unique key, and is also used in locking plain SELECTs (not part of UPDATE or DELETE) when the user has set the READ COMMITTED isolation level */

??#define LOCK_INSERT_INTENTION 2048

/* this bit is set when we place a waiting gap type record lock

request in order to let an insert of an index record to wait until

there are no conflicting locks by other transactions on the gap; note

that this flag remains set when the waiting lock is granted, or if the lock is inherited to a neighboring record */

? ? ? ? 精確模式就是從源碼中導(dǎo)出的。大家都知到S鎖和X鎖的兼容關(guān)系,但這只是鎖的模式,上面說的InnoDB行鎖有四種類型:G(gap鎖)、R(記錄鎖)、N(next-key鎖)、I(插入意向鎖)。那么對于不同類型的鎖在X模式下有怎樣的兼容關(guān)系呢?(S模式下沒有什么沖突,不用解釋)

? ? ? ? 有人從源碼發(fā)掘出一個(gè)行鎖兼容矩陣,這個(gè)在官方文檔中并沒有。

兼容性

G

I

R

N

當(dāng)前持有的X鎖類型

G

+

+

+

+

?

要加的X鎖類型

I

-

+

+

-

R

+

+

-

-

N

+

+

-

-

? ? ? ? + 代表兼容, -代表不兼容。S鎖和S鎖是完全兼容的,因此在判別兼容性時(shí)不需要對比精確模式,精確模式的檢測,用在S、X和X、X之間。從這個(gè)精確模式可以看出,<2是N鎖,=1是G鎖,這兩種鎖匙完全兼容的,所以即使都是X鎖也沒有沖突,而=2是R鎖,N和R是不兼容的,所以<2和=2沖突。同時(shí)大家要注意這個(gè)矩陣不是對稱的,這點(diǎn)在I鎖的兼容性上,大家可以通過類似實(shí)驗(yàn)驗(yàn)證。其實(shí)上表中的N鎖應(yīng)該分解成G+R鎖來看會好理解一些。

? ? ? ? 這種新的兼容性是為了帶來更好的事務(wù)并發(fā)性,但也會帶來一些其他問題呢?比如下面的例子:

t1

t2

MySQL> select * from A where id>2 and id<6 for update;

Empty set (0.00 sec)

MySQL> select * from A where id=4 for update;

Empty set (0.00 sec)

兩個(gè)事務(wù)都加鎖成功:

------------

TRANSACTIONS

------------

Trx id counter 792

Purge done for trx's n:o < 78D undo n:o < 0

History list length 63

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 791, ACTIVE 58 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 539 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 791 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 791 lock_mode X locks gap before rec

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

---TRANSACTION 790, ACTIVE 95 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 10, OS thread handle 0x415b9960, query id 537 localhost root

TABLE LOCK table `test`.`A` trx id 790 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 790 lock_mode X

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

MySQL> insert into A values(3,'abc');

?

出現(xiàn)鎖等待:

------------

TRANSACTIONS

------------

Trx id counter 792

Purge done for trx's n:o < 78D undo n:o < 0

History list length 63

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 791, ACTIVE 226 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 543 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 791 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 791 lock_mode X locks gap before rec

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

---TRANSACTION 790, ACTIVE 263 sec inserting

MySQL tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 10, OS thread handle 0x415b9960, query id 542 localhost root update

insert into A values(3,'abc')

------- TRX HAS BEEN WAITING 22 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 790 lock_mode X locks gap before rec insert intention waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

------------------

TABLE LOCK table `test`.`A` trx id 790 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 790 lock_mode X

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 790 lock_mode X locks gap before rec insert intention waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

原因很明顯,I鎖和G鎖不兼容,需要等待,你雖然通過條件>2 and <6加了for update鎖,但是并沒有真正鎖住區(qū)間,這時(shí)insert 3時(shí)會先加I鎖,于是要等待t2的G鎖沖突了

?

這時(shí)如果t2認(rèn)為鎖住了4記錄,然后執(zhí)行

MySQL> insert into A values(4,'abc');

會怎樣呢?

直接死鎖了。

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

?

很明顯,因?yàn)閠1等待t2的G鎖,t2等待t1的N鎖。

下面是死鎖日志:

------------------------

LATEST DETECTED DEADLOCK

------------------------

141216 14:54:55

*** (1) TRANSACTION:

TRANSACTION 790, ACTIVE 556 sec inserting

MySQL tables in use 1, locked 1

LOCK WAIT 3 lock struct(s), heap size 1248, 2 row lock(s)

MySQL thread id 10, OS thread handle 0x415b9960, query id 544 localhost root update

insert into A values(3,'abc')

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 790lock_mode X locks gap before rec insert intention waiting

Record lock,?heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

*** (2) TRANSACTION:

TRANSACTION 791, ACTIVE 519 sec inserting

MySQL tables in use 1, locked 1

3 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 545 localhost root update

insert into A values(4,'abc')

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 791 lock_mode X locks gap before rec

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 791 lock_mode X locks gap before rec insert intention waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

*** WE ROLL BACK TRANSACTION (2)

?

? ? ? ? 同樣的原因還會有下面這種死鎖的例子:

t1

t2

select * from A where id=3 for update;

insert into A values(3,'abc');

select * from A where id=4 for update;

insert into A values(4,'def');

?

? ? ? ? “InnoDB locks all index records found by the WHERE clause with an exclusive lock and the gaps between them with a shared gap lock.”?網(wǎng)上會有上面這種說法,其實(shí)是因?yàn)閄的gap鎖之間是兼容的,其底層實(shí)現(xiàn)可能是通過S鎖的方式實(shí)現(xiàn)的。

? ? ? ? 精確模式在InnoDB中非常重要,從中也可以觀察到一些特性:

  • GAP鎖基本上跟所有鎖都兼容
  • Next-key鎖和Record鎖之間都沖突
  • 持有Insert鎖的記錄可以兼容所有鎖,但是Insert鎖卻不能加到GAP和Next-key鎖上。

? ? ? ? 想想這些特性為什么。

?

?

4. 無索引鎖

? ? ? ? 對于無索引的表,由于無法利用索引,因此會對所有記錄加Next-key鎖,可以觀察一下實(shí)驗(yàn)結(jié)果:

建一個(gè)無索引的表B:

| B???? | CREATE TABLE `B` (

? `id` int(11) NOT NULL,

? `name` varchar(1024) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

MySQL> select * from B;

+----+------+

| id | name |

+----+------+

|? 3 | dd?? |

|? 4 | t??? |

|? 5 | dd?? |

|? 4 | t??? |

+----+------+

4 rows in set (0.00 sec)

執(zhí)行下面語句:

MySQL> select * from A where id=2 for update;

+----+------+

| id | name |

+----+------+

|? 2 | aa?? |

+----+------+

1 row in set (0.00 sec)

由于沒有索引,會鎖全部索引項(xiàng)。而且全都是N鎖。(4條記錄和一個(gè)無窮大)

------------

TRANSACTIONS

------------

Trx id counter 72F

Purge done for trx's n:o < 703 undo n:o < 0

History list length 43

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 72C, not started

MySQL thread id 1, OS thread handle 0x415b9960, query id 248 localhost root

show engine InnoDB status

---TRANSACTION 72E, ACTIVE 3 sec

2 lock struct(s), heap size 376, 5 row lock(s)

MySQL thread id 2, OS thread handle 0x41743960, query id 247 localhost root

TABLE LOCK table `test`.`B` trx id 72E?lock mode IX

RECORD LOCKS space id 1 page no 3 n bits 72 index `GEN_CLUST_INDEX` of table `test`.`B` trx id 72E lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

?

Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 6; hex 000000000203; asc?? ????;;?? //InnoDB自動生成的6字節(jié)ID(索引相關(guān)文章有介紹)

?1: len 6; hex 0000000005be; asc?????? ;;

?2: len 7; hex 1a0000018d0110; asc??????? ;;

?3: len 4; hex 80000003; asc???? ;;????? //記錄字段

?4: len 2; hex 6464; asc dd;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 6; hex 000000000204; asc?????? ;;

?1: len 6; hex 0000000005c5; asc?????? ;;

?2: len 7; hex 200000018e0110; asc??????? ;;

?3: len 4; hex 80000004; asc???? ;;

?4: len 1; hex 74; asc t;;

?

Record lock, heap no 4 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 6; hex 000000000205; asc?????? ;;

?1: len 6; hex 0000000005be; asc?????? ;;

?2: len 7; hex 1a0000018d0154; asc?????? T;;

?3: len 4; hex 80000005; asc???? ;;

?4: len 2; hex 6464; asc dd;;

?

Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 6; hex 000000000206; asc?????? ;;

?1: len 6; hex 0000000005c5; asc?????? ;;

?2: len 7; hex 200000018e0130; asc?????? 0;;

?3: len 4; hex 80000004; asc???? ;;

?4: len 1; hex 74; asc t;;

? ? ? ? 還有執(zhí)行計(jì)劃中沒有使用到索引的也是類似上面這種情形,可以自行驗(yàn)證。

?

?

5. 輔助索引鎖

? ? ? ? ?下面再觀察一下輔助索引的情況:

---------+

| transfer | CREATE TABLE `transfer` (

? `id` int(11) NOT NULL AUTO_INCREMENT,

? `trans_id` int(11) NOT NULL,

? `name` varchar(256) NOT NULL,

? PRIMARY KEY (`id`),

? KEY `trans_id` (`trans_id`),

? KEY `name` (`name`(255))

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |

?

MySQL> select * from transfer;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 1 |????? 101 | aaa? |

|? 4 |?? ???103 | bbb? |

| 10 |????? 104 | ddd? |

+----+----------+------+

3 rows in set (0.01 sec)

? ? ? ? 針對上表做一下一種條件的測試:

case1:=103

MySQL> select * from transfer where trans_id=103 for update;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 4 |????? 103 | bbb? |

+----+----------+------+

1 row in set (0.00 sec)

--TRANSACTION 771, ACTIVE 4 sec

4 lock struct(s), heap size 1248, 3 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 421 localhost root

TABLE LOCK table `test`.`transfer` trx id 771 lock mode IX

RECORD LOCKS space id 22?page no 4?n bits 72 index `trans_id` of table `test`.`transfer` trx id 771lock_mode X? //輔助索引page 4。加的是N鎖,不同于主鍵索引哦

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000067; asc??? g;;????????????????? 輔助key?? hex67 == 103

?1: len 4; hex 80000004; asc???? ;;??????????????????????????????????????????? 主key????? hex4? ==? 4

?

RECORD LOCKS space id 22?page no 3?n bits 72 index `PRIMARY` of table `test`.`transfer` trx id 771lock_mode X locks rec but not gap //主索引page 3 ,加了記錄鎖

Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000004; asc???? ;;??????????? ????????????????????????? 主key

?1: len 6; hex 0000000005e0; asc?????? ;;????????????????????????????? trx_id

?2: len 7; hex b8000001930110; asc??????? ;;?????????????????????? roll_ptr

?3: len 4; hex 80000067; asc??? g;;????????????????????????????????????????????????????? 對應(yīng)的輔助key

?4: len 3; hex 626262; asc bbb;;?????????????????????? ??????? name 字段? bbb

?

RECORD LOCKS space id 22?page no 4?n bits 72 index `trans_id` of table `test`.`transfer` trx id 771lock_mode X locks gap before rec

Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000068; asc??? h;;???????? 在103后面的一條記錄上加了gap鎖

?1: len 4; hex 8000000a; asc???? ;;

?

這里給104又加了一個(gè)gap鎖,因?yàn)檩o助鍵是可能重復(fù)的,所以可能會在其后插入相同的記錄,因此這里要對其后的間隙加gap鎖

如果在這里繼續(xù)給101加鎖,會不會也給103加一個(gè)gap鎖呢?

繼續(xù):

MySQL> select * from transfer where trans_id=101 for update;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 1 |????? 101 | aaa? |

+----+----------+------+

1 row in set (0.00 sec)

---TRANSACTION 771, ACTIVE 403 sec

4 lock struct(s), heap size 1248, 5 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 423 localhost root

TABLE LOCK table `test`.`transfer` trx id 771 lock mode IX

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 771 lock_mode X

Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000065; asc??? e;;

?1: len 4; hex 80000001; asc???? ;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000067; asc??? g;;

?1: len 4; hex 80000004; asc???? ;;

?

RECORD LOCKS space id 22 page no 3 n bits 72 index `PRIMARY` of table `test`.`transfer` trx id 771 lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000001; asc???? ;;

?1: len 6; hex 0000000005d3; asc?????? ;;

?2: len 7; hex ac000001910110; asc??????? ;;

?3: len 4; hex 80000065; asc??? e;;

?4: len 3; hex 616161; asc aaa;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000004; asc???? ;;

?1: len 6; hex 0000000005e0; asc?????? ;;

?2: len 7; hex b8000001930110; asc??????? ;;

?3: len 4; hex 80000067; asc??? g;;

?4: len 3; hex 626262; asc bbb;;

?

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 771 lock_mode X locks gap before rec

Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000068; asc??? h;;

?1: len 4; hex 8000000a; asc???? ;;

?

沒有!因?yàn)?03上已經(jīng)有N鎖了,而N鎖比G鎖級別高,所以沒有必要再加個(gè)G鎖了。

所以如果是單獨(dú)給101加鎖,就肯定會給103加gap鎖了,驗(yàn)證一下:

?

單獨(dú)加鎖101

MySQL> select * from transfer where trans_id=101 for update;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 1 |????? 101 | aaa? |

+----+----------+------+

1 row in set (0.00 sec)

?

---TRANSACTION 772, ACTIVE 4 sec

4 lock struct(s), heap size 1248, 3 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 428 localhost root

TABLE LOCK table `test`.`transfer` trx id 772 lock mode IX

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 772 lock_mode X

Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000065; asc??? e;;

?1: len 4; hex 80000001; asc???? ;;

?

RECORD LOCKS space id 22 page no 3 n bits 72 index `PRIMARY` of table `test`.`transfer` trx id 772 lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000001; asc???? ;;

?1: len 6; hex 0000000005d3; asc?????? ;;

?2: len 7; hex ac000001910110; asc??????? ;;

?3: len 4; hex 80000065; asc??? e;;

?4: len 3; hex 616161; asc aaa;;

?

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 772 lock_mode X locks gap before rec

Record lock,?heap no 3?PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000067; asc??? g;;

?1: len 4; hex 80000004; asc???? ;;

?

的確會給后面一條記錄加G鎖。

?

加鎖不存在記錄102,在103記錄上加gap鎖,主索引無鎖

?---TRANSACTION 773, ACTIVE 3 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 434 localhost root

TABLE LOCK table `test`.`transfer` trx id 773 lock mode IX

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 773 lock_mode X locks gap before rec

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000067; asc??? g;;

?1: len 4; hex 80000004; asc???? ;;

加鎖<101,粒度比=101要少一個(gè)后一條記錄的G鎖,很好理解

MySQL> select * from transfer where trans_id<101 for update;???

Empty set (0.00 sec)

?---TRANSACTION 774, ACTIVE 3 sec

3 lock struct(s), heap size 376, 2 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 440 localhost root

TABLE LOCK table `test`.`transfer` trx id 774 lock mode IX

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 774 lock_mode X

Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000065; asc??? e;;

?1: len 4; hex 80000001; asc???? ;;

?

RECORD LOCKS space id 22 page no 3 n bits 72 index `PRIMARY` of table `test`.`transfer` trx id 774 lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000001; asc???? ;;

?1: len 6; hex 0000000005d3; asc?????? ;;

?2: len 7; hex ac000001910110; asc??????? ;;

?3: len 4; hex 80000065; asc??? e;;

?4: len 3; hex 616161; asc aaa;;

?

?

<=101 把101和103主輔索引都鎖住了

?MySQL> select * from transfer where trans_id<=101 for update;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 1 |????? 101 | aaa? |

+----+----------+------+

1 row in set (0.00 sec)

?---TRANSACTION 775, ACTIVE 17 sec

3 lock struct(s), heap size 376, 4 row lock(s)

MySQL thread id 6, OS thread handle 0x415fa960, query id 444 localhost root

TABLE LOCK table `test`.`transfer` trx id 775 lock mode IX

RECORD LOCKS space id 22 page no 4 n bits 72 index `trans_id` of table `test`.`transfer` trx id 775 lock_mode X

Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000065; asc??? e;;

?1: len 4; hex 80000001; asc???? ;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

?0: len 4; hex 80000067; asc??? g;;

?1: len 4; hex 80000004; asc???? ;;

?

RECORD LOCKS space id 22 page no 3 n bits 72 index `PRIMARY` of table `test`.`transfer` trx id 775 lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000001; asc???? ;;

?1: len 6; hex 0000000005d3; asc?????? ;;

?2: len 7; hex ac000001910110; asc??????? ;;

?3: len 4; hex 80000065; asc??? e;;

?4: len 3; hex 616161; asc aaa;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 5; compact format; info bits 0

?0: len 4; hex 80000004; asc???? ;;

?1: len 6; hex 0000000005e0; asc?????? ;;

?2: len 7; hex b8000001930110; asc??????? ;;

?3: len 4; hex 80000067; asc??? g;;

?4: len 3; hex 626262; asc bbb;;

?

? ? ? ? 所以,如果有下面兩個(gè)并發(fā),會沖突,雖然id=4跟trans_id<=101沒有什么關(guān)系:

MySQL> select * from transfer where trans_id<=101 for update;

+----+----------+------+

| id | trans_id | name |

+----+----------+------+

|? 1 |????? 101 | aaa? |

+----+----------+------+

1 row in set (0.00 sec)

MySQL> update transfer set name='ccc' where id=4;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

?

6. 表級鎖

? ? ? ? 前面在說鎖模式時(shí)提到IX和IS鎖,官方定義是表級鎖,而且IX和IS之間是全兼容,所以對于IX、IS和X、S鎖之間的關(guān)系比較好奇,官方定義的兼容性:

?

 

X

S

IX

IS

X

Conflict

Conflict

Conflict

Conflict

S

Conflict

Compatible

Conflict

Compatible

IX

Conflict

Conflict

Compatible

Compatible

IS

Conflict

Compatible

Compatible

Compatible

?

? ? ? ? S,X之間和IS,IX之間很好理解,重點(diǎn)關(guān)注的就是黃色區(qū)域的關(guān)系。

? ? ? ? 構(gòu)造兩個(gè)事務(wù)的狀態(tài):

---TRANSACTION 76C, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 371 localhost root

---TRANSACTION 76A, ACTIVE 838 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 375 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 76A lock mode IX

?

76A事務(wù)目前持有A表的IX鎖

IX和S關(guān)系

事務(wù)76C對A加表級S鎖:

lock table A read;

無沖突。(官方說有沖突)

---TRANSACTION 76C, not started

MySQL tables in use 1, locked 1

MySQL thread id 2, OS thread handle 0x41743960, query id 378 localhost root

---TRANSACTION 76A, ACTIVE 925 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 379 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 76A lock mode IX

?

注意:上面實(shí)驗(yàn)由于沒有設(shè)置autocommit=0,必須為0時(shí)才生效!重做實(shí)驗(yàn)后:

MySQL> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

?

MySQL> show variables like '%autocommit%';??????????

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit??? | OFF?? |

+---------------+-------+

1 row in set (0.00 sec)

MySQL> lock table A read;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

有沖突,符合官方定義

---TRANSACTION 7A2, ACTIVE 7 sec setting table lock

LOCK WAIT 1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 10, OS thread handle 0x415b9960, query id 584 localhost root System lock

lock table A read

------- TRX HAS BEEN WAITING 7 SEC FOR THIS LOCK TO BE GRANTED:

TABLE LOCK table `test`.`A` trx id 7A2 lock mode S waiting

------------------

TABLE LOCK table `test`.`A` trx id 7A2 lock mode S waiting

---TRANSACTION 7A1,?ACTIVE 164 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 585 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 7A1 lock mode IX

?

?

IX和X關(guān)系

事務(wù)76C對A加表級X鎖:

lock table A write;

有沖突

---TRANSACTION 76C, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 380 localhost root Waiting for table metadata lock

lock table A write

---TRANSACTION 76A, ACTIVE 970 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 381 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 76A lock mode IX

IS 和 S關(guān)系

無沖突

---TRANSACTION 76E, not started

MySQL tables in use 1, locked 1

MySQL thread id 2, OS thread handle 0x41743960, query id 405 localhost root

---TRANSACTION 76F, ACTIVE 727 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 406 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 76F lock mode IS

IS 和 X關(guān)系

有沖突

---TRANSACTION 76E, not started

MySQL thread id 2, OS thread handle 0x41743960, query id 400 localhost root Waiting for table metadata lock

lock table A write

---TRANSACTION 76F, ACTIVE 651 sec

1 lock struct(s), heap size 376, 0 row lock(s)

MySQL thread id 1, OS thread handle 0x415b9960, query id 401 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 76F lock mode IS

?

? ? ? ? 對于delete、update等各種操作以及l(fā)ock in share mode下或各種查詢條件下鎖的情況都可以用上面的方法通過實(shí)驗(yàn)分析。

?

?

附錄

A. InnoDB幾項(xiàng)常用行鎖變量:

MySQL> show status like 'innodb_row%';??????????????

+-------------------------------+--------+

| Variable_name???????????????? | Value? |

+-------------------------------+--------+

| Innodb_row_lock_current_waits | 0????? |

| Innodb_row_lock_time????????? | 191673 |累計(jì)鎖等待時(shí)間(毫秒)

| Innodb_row_lock_time_avg????? | 31945? |平均行鎖等待時(shí)間

| Innodb_row_lock_time_max????? | 50965? |最大行鎖等待時(shí)間

| Innodb_row_lock_waits???????? | 6????? |

| Innodb_rows_deleted?????????? | 0????? |

| Innodb_rows_inserted????????? | 17???? |

| Innodb_rows_read????????????? | 45???? |

| Innodb_rows_updated?????????? | 2????? |

+-------------------------------+--------+

| Innodb_lock_wait_timeout????? | 50???? |鎖等待超時(shí)時(shí)間(秒)

?

B. 問題案例

舉兩個(gè)實(shí)際環(huán)境中的案例,由于鎖的沖突而導(dǎo)致的故障

案例一:

首先把某實(shí)際系統(tǒng)中的數(shù)據(jù)庫操作shell腳本簡化如下,省略號略去一些無關(guān)信息:

MySQL.core -q -e "

??? insert into?bfb_analytics.yc_dashboard_cust_temp

????? ……;

? " &

?

MySQL.core -q -e "?????

??? drop table if exists bfb_analytics.yc_dashboard_cust_cat_${i_date};

??? create table bfb_analytics.yc_dashboard_cust_cat_${i_date}(

????? select f_buyer_user_id

……

????? from?bfb_analytics.yc_dashboard_cust_temp

??? );

? "

大致邏輯是第一條語句往yc_dashboard_cust_temp表中插入數(shù)據(jù),但會放入后臺運(yùn)行。第二條語句從yc_dashboard_cust_temp表select數(shù)據(jù)導(dǎo)入新表。但在運(yùn)行過程中該腳本頻繁出現(xiàn)新表yc_dashboard_cust_cat_${i_date}創(chuàng)建失敗,同時(shí)會有對該表的lock wait超時(shí)。從通常的InnoDB鎖分析看select f_buyer_user_id ,…… from bfb_analytics.yc_dashboard_cust_temp這種語句應(yīng)該會通過MVCC方式讀取表的快照,而不會對表加鎖。那么這里為何會加鎖呢?首先要確認(rèn)一下當(dāng)前MySQL環(huán)境:

+---------------+-----------------+

| Variable_name | Value?????????? |

+---------------+-----------------+

| tx_isolation? | REPEATABLE-READ |

+---------------+-----------------+

?

+--------------------------------+-------+

| Variable_name????????????????? | Value |

+--------------------------------+-------+

| innodb_locks_unsafe_for_binlog | OFF?? |

+--------------------------------+-------+

?

+---------------+-----------+

| Variable_name | Value???? |

+---------------+-----------+

| binlog_format | STATEMENT |

+---------------+-----------+

?

| log_bin ??| ON ?|

?

上面幾個(gè)變量值會對InnoDB鎖行為有所影響。

原因分析:

在RR隔離級別下,同時(shí)開啟了bin-log時(shí),系統(tǒng)首先認(rèn)為你是需要進(jìn)行數(shù)據(jù)恢復(fù)和主從同步的。 為了保證事務(wù)在主從數(shù)據(jù)一致,對于create … B select * from A;這種情況必須對A表加鎖,否則可能會存在另一個(gè)事務(wù)在對A做update操作,當(dāng)這兩個(gè)事務(wù)寫入bin-log時(shí)就會由于事務(wù)完成時(shí)間的不確定而寫入 順序不同,那么當(dāng)同步或者恢復(fù)時(shí)就會造成數(shù)據(jù)不一致。

?

案例二:

另外一個(gè)案例跟上面差不多,有類似下面的shell腳本:

create table bfb_analytics.yc_dashboard_rec_${i_date}(

????? select f_trans_id

……

????? from bfb_db.t_recvables

????? where f_create_time<=’2014-10-11’ and f_create_time>’2014-09-01’

??? );

同時(shí)每天會有bfb_db.t_recvables表的主從同步在進(jìn)行。

該 腳本的運(yùn)行幾乎每天都會發(fā)生因?yàn)殒i等待超時(shí)而導(dǎo)致主從同步停止,所以一定是上面操作bfb_db.t_recvables的語句問題。按案例一中的分析可 知create … select …類型需要對select的查詢表加鎖,但是因?yàn)檫@里加了where限定條件,而且recvables表在f_create_time上也有索引,所以鎖 應(yīng)該是加在where限定范圍內(nèi)的。主從同步的時(shí)間都是當(dāng)前時(shí)間,跟腳本中的時(shí)間范圍跟主從同步的時(shí)間沒有任何交集,為何會鎖等待呢?

原因分析:

???????? 通過查看該語句的執(zhí)行計(jì)劃(explain)才知,由于結(jié)果集數(shù)據(jù)量較大,當(dāng)夸天超過15天時(shí)就已經(jīng)不再使用f_create_time上的索引了,當(dāng)InnoDB不能使用索引時(shí)就只能鎖全部記錄,這樣就演變成案例一中的情形了。

?

上面的兩個(gè)case可以通過下面的測試驗(yàn)證:

select * from A where id=2 for update;

create table D select * from A;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

------------

TRANSACTIONS

------------

Trx id counter 79B

Purge done for trx's n:o < 796 undo n:o < 0

History list length 65

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 79A, ACTIVE 3 sec starting index read

MySQL tables in use 2, locked 2

LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 10, OS thread handle 0x415b9960, query id 557 localhost root Sending data

create table D select * from A

------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 79A?lock mode S waiting

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750110; asc???? u? ;;

?3: len 2; hex 6161; asc aa;;

?

------------------

TABLE LOCK table `test`.`A` trx id 79A lock mode IS

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 79A lock mode S waiting

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750110; asc???? u? ;;

?3: len 2; hex 6161; asc aa;;

?

---TRANSACTION 798, ACTIVE 18 sec

2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 11, OS thread handle 0x41743960, query id 558 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 798 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 798 lock_mode X locks rec but not gap

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750110; asc???? u? ;;

?3: len 2; hex 6161; asc aa;;

確實(shí)是要加鎖,原因正如前面所述,由于binlog記錄是有序的,要保證數(shù)據(jù)恢復(fù)和同步必須加鎖。但如果將innodb_locks_unsafe_for_binlog設(shè)置off,也就是不要binlog的安全功能了,這里就不會加鎖了。當(dāng)然如果關(guān)閉binlog也不用加鎖。InnoDB在默認(rèn)情況下不得不設(shè)置鎖定,因?yàn)樵趶囊粋€(gè)備份的回滾恢復(fù)中,每個(gè)SQL語句不得不以與它最初被執(zhí)行的方式完全同樣的方式執(zhí)行。

?

C. LOG中事務(wù)ID的解釋

順便提一下開頭提到的聚簇索引的結(jié)構(gòu),主鍵key值下面是TID,這個(gè)值記錄的是最后一次修改該字段的事務(wù)ID。

------------

TRANSACTIONS

------------

Trx id counter 7A6

Purge done for trx's n:o < 79D undo n:o < 0

History list length 66

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 7A4, not started

MySQL thread id 16, OS thread handle 0x415fa960, query id 604 localhost root

---TRANSACTION 7A5, ACTIVE 9 sec??? //當(dāng)前的事務(wù)ID

2 lock struct(s), heap size 376, 8 row lock(s)

MySQL thread id 17, OS thread handle 0x41743960, query id 610 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 7A5 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 7A5 lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

?

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;????????? //主key值

?1: len 6; hex 00000000077f; asc?????? ;;??? //事務(wù)ID,其實(shí)是產(chǎn)生這條記錄的事務(wù)ID,類似于一個(gè)數(shù)據(jù)的版本號,用于MVCC中。

?2: len 7; hex ef000001750110; asc???? u? ;; //回滾LOG指針

?3: len 2; hex 6161; asc aa;;??????????????? //其他字段值

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;???? //此時(shí)所有數(shù)據(jù)的事務(wù)ID都是一樣的。

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000007; asc???? ;;

?1: len 6; hex 00000000077f; asc????? ?;;

?2: len 7; hex ef000001750128; asc???? u (;;

?3: len 2; hex 6161; asc aa;;

?

Record lock, heap no 5 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000008; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750134; asc???? u 4;;

?3: len 3; hex 616466; asc adf;;

?

Record lock, heap no 6 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000009; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750140; asc???? u @;;

?3: len 2; hex 6161; asc aa;;

?

Record lock, heap no 7 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000b; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175014c; asc???? u L;;

?3: len 1; hex 61; asc a;;

?

Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000c; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750158; asc???? u X;;

?3: len 3; hex 626262; asc bbb;;

上面所有數(shù)據(jù)的事務(wù)ID都是一樣的,如果我們這時(shí)候修改某條數(shù)據(jù),他的ID應(yīng)該會變成當(dāng)前事務(wù)ID

MySQL> update A set name='new' where id=8;

------------

TRANSACTIONS

------------

Trx id counter 7A6

Purge done for trx's n:o < 79D undo n:o < 0

History list length 66

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 7A4, not started

MySQL thread id 16, OS thread handle 0x415fa960, query id 604 localhost root

---TRANSACTION 7A5, ACTIVE 75 sec

2 lock struct(s), heap size 376, 8 row lock(s), undo log entries 1

MySQL thread id 17, OS thread handle 0x41743960, query id 613 localhost root

show engine InnoDB status

TABLE LOCK table `test`.`A` trx id 7A5 lock mode IX

RECORD LOCKS space id 0 page no 420 n bits 80 index `PRIMARY` of table `test`.`A` trx id 7A5 lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

?0: len 8; hex 73757072656d756d; asc supremum;;

?

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000002; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750110; asc???? u? ;;

?3: len 2; hex 6161; asc aa;;

?

Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000006; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175011c; asc???? u? ;;

?3: len 3; hex 656565; asc eee;;

?

Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000007; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750128; asc???? u (;;

?3: len 2; hex 6161; asc aa;;

?

Record lock, heap no 5 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000008; asc???? ;;

?1: len 6; hex 0000000007a5; asc?????? ;;?? //變成當(dāng)前事務(wù)ID了

?2: len 7; hex 0f0000018801ca; asc??????? ;;

?3: len 3; hex 6e6577; asc new;;

?

Record lock, heap no 6 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 80000009; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750140; asc???? u @;;

?3: len 2; hex 6161; asc aa;;

?

Record lock, heap no 7 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000b; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef00000175014c; asc???? u L;;

?3: len 1; hex 61; asc a;;

?

Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0

?0: len 4; hex 8000000c; asc???? ;;

?1: len 6; hex 00000000077f; asc?????? ;;

?2: len 7; hex ef000001750158; asc???? u X;;

?3: len 3; hex 626262; asc bbb;;

轉(zhuǎn)載于:https://www.cnblogs.com/zhengran/p/4611616.html

總結(jié)

以上是生活随笔為你收集整理的[转载] 数据库分析手记 —— InnoDB锁机制分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

大地资源中文第3页 | 国产精品国产三级国产专播 | 无码毛片视频一区二区本码 | 亚洲自偷自偷在线制服 | 曰本女人与公拘交酡免费视频 | 99视频精品全部免费免费观看 | 麻豆蜜桃av蜜臀av色欲av | 久久精品一区二区三区四区 | 精品午夜福利在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久国产精品偷任你爽任你 | 中文字幕无码日韩专区 | 日本熟妇人妻xxxxx人hd | 99国产欧美久久久精品 | 欧美老熟妇乱xxxxx | 亚洲成av人片在线观看无码不卡 | 精品久久久久香蕉网 | 国产内射爽爽大片视频社区在线 | 亚洲国产精品一区二区美利坚 | 亚洲国产综合无码一区 | 特大黑人娇小亚洲女 | 国产精品第一区揄拍无码 | 亚洲人成网站色7799 | 欧美激情内射喷水高潮 | 成人无码精品1区2区3区免费看 | 国产美女极度色诱视频www | 欧美高清在线精品一区 | 久久99精品国产麻豆蜜芽 | 精品无码国产一区二区三区av | 国产精品久久久久久久影院 | 欧美大屁股xxxxhd黑色 | 99久久久无码国产aaa精品 | 我要看www免费看插插视频 | 大屁股大乳丰满人妻 | 中文字幕人成乱码熟女app | 日本饥渴人妻欲求不满 | 成在人线av无码免费 | 狠狠色丁香久久婷婷综合五月 | 极品尤物被啪到呻吟喷水 | 婷婷六月久久综合丁香 | 亚洲s色大片在线观看 | 色 综合 欧美 亚洲 国产 | 国产一区二区三区四区五区加勒比 | 成 人 免费观看网站 | 亚洲日韩av一区二区三区四区 | 国产人妻精品一区二区三区 | 老太婆性杂交欧美肥老太 | 亚洲熟妇色xxxxx欧美老妇 | 欧美 日韩 人妻 高清 中文 | 亚洲精品成人av在线 | 强伦人妻一区二区三区视频18 | 欧美 日韩 人妻 高清 中文 | 18无码粉嫩小泬无套在线观看 | 青春草在线视频免费观看 | 日日摸夜夜摸狠狠摸婷婷 | 国产精品无码一区二区桃花视频 | 熟女少妇人妻中文字幕 | 亚洲va中文字幕无码久久不卡 | 亚欧洲精品在线视频免费观看 | 大屁股大乳丰满人妻 | 国内精品一区二区三区不卡 | 国产精品第一国产精品 | 又黄又爽又色的视频 | 亚洲天堂2017无码 | 领导边摸边吃奶边做爽在线观看 | 国产精品永久免费视频 | 荡女精品导航 | 亚洲精品久久久久avwww潮水 | 国产精品爱久久久久久久 | 国产卡一卡二卡三 | 国产午夜亚洲精品不卡下载 | 久久99精品久久久久久动态图 | 黑人巨大精品欧美一区二区 | 日韩精品乱码av一区二区 | 国产明星裸体无码xxxx视频 | 国产精品久久久久影院嫩草 | 99久久人妻精品免费二区 | 98国产精品综合一区二区三区 | 久久亚洲日韩精品一区二区三区 | 中文字幕av日韩精品一区二区 | 久久久久成人片免费观看蜜芽 | 久久久久99精品国产片 | 一区二区三区乱码在线 | 欧洲 | 亚洲国产av美女网站 | 红桃av一区二区三区在线无码av | 久久久精品人妻久久影视 | 亚洲国产欧美在线成人 | 香蕉久久久久久av成人 | 亚洲国产精品成人久久蜜臀 | 夜先锋av资源网站 | 日本精品高清一区二区 | 亚洲の无码国产の无码步美 | 免费乱码人妻系列无码专区 | 精品无码成人片一区二区98 | 精品一区二区三区无码免费视频 | 国产亲子乱弄免费视频 | 久久伊人色av天堂九九小黄鸭 | 亚洲中文字幕av在天堂 | a在线观看免费网站大全 | av无码久久久久不卡免费网站 | 在线播放免费人成毛片乱码 | 久久精品国产日本波多野结衣 | 欧美性生交活xxxxxdddd | 蜜臀av无码人妻精品 | 夜夜高潮次次欢爽av女 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 性欧美熟妇videofreesex | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日本一本二本三区免费 | 特黄特色大片免费播放器图片 | 女高中生第一次破苞av | 成在人线av无码免费 | 久久久精品人妻久久影视 | 午夜精品一区二区三区在线观看 | 久久久国产精品无码免费专区 | 野外少妇愉情中文字幕 | 亚洲精品综合五月久久小说 | 国产午夜精品一区二区三区嫩草 | 欧美精品一区二区精品久久 | 成人无码影片精品久久久 | 色窝窝无码一区二区三区色欲 | 国产精品高潮呻吟av久久 | 久久婷婷五月综合色国产香蕉 | 综合激情五月综合激情五月激情1 | 黑人粗大猛烈进出高潮视频 | 中文字幕无码av激情不卡 | 欧美激情综合亚洲一二区 | 国产精品二区一区二区aⅴ污介绍 | 欧美精品国产综合久久 | 日本又色又爽又黄的a片18禁 | 亚洲日韩av片在线观看 | 真人与拘做受免费视频一 | 99久久人妻精品免费一区 | 秋霞特色aa大片 | 丝袜 中出 制服 人妻 美腿 | 天天躁夜夜躁狠狠是什么心态 | 欧洲欧美人成视频在线 | 日日碰狠狠躁久久躁蜜桃 | 无码人妻精品一区二区三区下载 | yw尤物av无码国产在线观看 | 少妇高潮喷潮久久久影院 | 精品国产一区av天美传媒 | 女高中生第一次破苞av | 亚洲成a人片在线观看无码 | 国产精品美女久久久网av | a国产一区二区免费入口 | 国产激情一区二区三区 | 国产婷婷色一区二区三区在线 | 日本xxxx色视频在线观看免费 | 国产在线精品一区二区高清不卡 | 丰满少妇高潮惨叫视频 | 欧美黑人巨大xxxxx | 澳门永久av免费网站 | 亚洲一区二区观看播放 | 青草视频在线播放 | 丁香啪啪综合成人亚洲 | 成人性做爰aaa片免费看不忠 | 国产美女极度色诱视频www | 亚洲欧洲无卡二区视頻 | 国产精品鲁鲁鲁 | 欧美精品一区二区精品久久 | 日本一卡2卡3卡四卡精品网站 | 天干天干啦夜天干天2017 | 初尝人妻少妇中文字幕 | 精品偷自拍另类在线观看 | 99精品无人区乱码1区2区3区 | 日韩 欧美 动漫 国产 制服 | 亚洲の无码国产の无码步美 | 99视频精品全部免费免费观看 | 啦啦啦www在线观看免费视频 | 色狠狠av一区二区三区 | 亚洲精品综合一区二区三区在线 | aa片在线观看视频在线播放 | 国产九九九九九九九a片 | 国产真实乱对白精彩久久 | 装睡被陌生人摸出水好爽 | 亚洲精品中文字幕久久久久 | 国产人成高清在线视频99最全资源 | 国产精品第一国产精品 | 丁香花在线影院观看在线播放 | 亚洲 a v无 码免 费 成 人 a v | 国产人妻久久精品二区三区老狼 | 呦交小u女精品视频 | 亚洲精品国产第一综合99久久 | 国产乡下妇女做爰 | 任你躁国产自任一区二区三区 | 亚洲 高清 成人 动漫 | 国产无av码在线观看 | 国产一区二区三区四区五区加勒比 | 国产精品高潮呻吟av久久 | 爱做久久久久久 | 国产亚洲精品久久久久久久久动漫 | 久久这里只有精品视频9 | 欧美日韩一区二区综合 | 国产 浪潮av性色四虎 | 精品成人av一区二区三区 | 日韩少妇白浆无码系列 | 精品久久久久香蕉网 | 亚洲中文字幕乱码av波多ji | 国产又爽又黄又刺激的视频 | 国产精品久久久 | 无码午夜成人1000部免费视频 | 免费人成在线观看网站 | 玩弄少妇高潮ⅹxxxyw | 午夜福利试看120秒体验区 | 丰满肥臀大屁股熟妇激情视频 | 亚洲大尺度无码无码专区 | 久久人人爽人人爽人人片av高清 | 无码成人精品区在线观看 | 久久zyz资源站无码中文动漫 | 亚洲精品国产精品乱码视色 | 亚洲成色www久久网站 | 日韩av激情在线观看 | 久久精品人人做人人综合试看 | 国内精品一区二区三区不卡 | 亚洲色大成网站www国产 | 久久国产自偷自偷免费一区调 | 强伦人妻一区二区三区视频18 | 日本一本二本三区免费 | 精品国产aⅴ无码一区二区 | 蜜桃视频插满18在线观看 | 亚洲小说图区综合在线 | 人妻少妇精品无码专区二区 | 国产明星裸体无码xxxx视频 | 亚洲精品国产a久久久久久 | 日本一卡2卡3卡四卡精品网站 | 88国产精品欧美一区二区三区 | 亚洲 高清 成人 动漫 | 国产精品久久久久久久9999 | 无码任你躁久久久久久久 | 国产精品va在线播放 | 东京热无码av男人的天堂 | 欧洲欧美人成视频在线 | 美女毛片一区二区三区四区 | 欧美丰满熟妇xxxx性ppx人交 | 久久人妻内射无码一区三区 | 丰满少妇人妻久久久久久 | 欧美怡红院免费全部视频 | 国产欧美精品一区二区三区 | 久久午夜无码鲁丝片 | 久久zyz资源站无码中文动漫 | 一二三四社区在线中文视频 | 99久久人妻精品免费二区 | 无码乱肉视频免费大全合集 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品免费大片 | 中文字幕乱码中文乱码51精品 | 国精品人妻无码一区二区三区蜜柚 | 亚洲精品鲁一鲁一区二区三区 | 日日摸天天摸爽爽狠狠97 | 熟妇人妻激情偷爽文 | aⅴ在线视频男人的天堂 | 国产精品久久国产三级国 | 在线视频网站www色 | 奇米影视7777久久精品人人爽 | 国产热a欧美热a在线视频 | 亚洲一区二区三区播放 | 亚洲va中文字幕无码久久不卡 | 精品少妇爆乳无码av无码专区 | 又大又硬又黄的免费视频 | 黄网在线观看免费网站 | 亚洲中文字幕久久无码 | 好男人社区资源 | 亚洲精品国产a久久久久久 | 大肉大捧一进一出视频出来呀 | 99久久久国产精品无码免费 | 粉嫩少妇内射浓精videos | 亚洲七七久久桃花影院 | 欧美人与牲动交xxxx | 久精品国产欧美亚洲色aⅴ大片 | 精品人妻人人做人人爽 | 999久久久国产精品消防器材 | 亚洲精品综合五月久久小说 | 高清无码午夜福利视频 | 人人澡人人透人人爽 | 奇米影视888欧美在线观看 | 中国大陆精品视频xxxx | 亚洲一区二区三区 | 丰满少妇女裸体bbw | 国产精品久久久久久久9999 | 少妇无套内谢久久久久 | 高潮喷水的毛片 | 牛和人交xxxx欧美 | 偷窥村妇洗澡毛毛多 | 性欧美大战久久久久久久 | 国产亚洲人成a在线v网站 | 久久午夜无码鲁丝片午夜精品 | 国産精品久久久久久久 | 扒开双腿吃奶呻吟做受视频 | 九月婷婷人人澡人人添人人爽 | 狂野欧美性猛交免费视频 | 国产精品国产自线拍免费软件 | 亚洲爆乳精品无码一区二区三区 | 一本色道婷婷久久欧美 | 亚洲 a v无 码免 费 成 人 a v | 国产精品久免费的黄网站 | 少女韩国电视剧在线观看完整 | 无码av免费一区二区三区试看 | 国产成人无码av一区二区 | 亚洲国产精品毛片av不卡在线 | 精品欧美一区二区三区久久久 | 欧美亚洲日韩国产人成在线播放 | 国产成人午夜福利在线播放 | 无套内射视频囯产 | 青春草在线视频免费观看 | 无码免费一区二区三区 | 午夜熟女插插xx免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 日本va欧美va欧美va精品 | 狠狠cao日日穞夜夜穞av | 日韩欧美成人免费观看 | 人妻无码久久精品人妻 | 中文字幕 人妻熟女 | 狂野欧美性猛xxxx乱大交 | 亚洲 另类 在线 欧美 制服 | 国产精品无码成人午夜电影 | 国产三级精品三级男人的天堂 | 野狼第一精品社区 | 日韩人妻无码一区二区三区久久99 | 亚洲成av人综合在线观看 | 精品久久久久久亚洲精品 | 麻豆国产97在线 | 欧洲 | 精品欧洲av无码一区二区三区 | 国产亚av手机在线观看 | 国产精品亚洲lv粉色 | 日韩在线不卡免费视频一区 | 无码人妻少妇伦在线电影 | 呦交小u女精品视频 | 欧美丰满少妇xxxx性 | 欧美精品无码一区二区三区 | 国产精品va在线观看无码 | 中文字幕乱码人妻二区三区 | 免费无码肉片在线观看 | 好屌草这里只有精品 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲色偷偷偷综合网 | 国产精品亚洲五月天高清 | 国产成人无码午夜视频在线观看 | 久久久久成人精品免费播放动漫 | 无码一区二区三区在线观看 | 玩弄少妇高潮ⅹxxxyw | 女人色极品影院 | 无码人妻精品一区二区三区下载 | 国产在线aaa片一区二区99 | 18精品久久久无码午夜福利 | 精品国产麻豆免费人成网站 | 久久精品丝袜高跟鞋 | 精品一区二区三区无码免费视频 | 精品无码国产自产拍在线观看蜜 | 国产午夜视频在线观看 | 成人影院yy111111在线观看 | 老司机亚洲精品影院无码 | 欧美大屁股xxxxhd黑色 | 国产亚洲精品久久久ai换 | 九九久久精品国产免费看小说 | 亚洲va欧美va天堂v国产综合 | 久久国产自偷自偷免费一区调 | 国产人妖乱国产精品人妖 | 人人妻人人澡人人爽人人精品浪潮 | aa片在线观看视频在线播放 | 免费人成网站视频在线观看 | 亚洲综合色区中文字幕 | 欧美成人免费全部网站 | 亚洲综合在线一区二区三区 | 永久免费观看美女裸体的网站 | 欧美zoozzooz性欧美 | 午夜福利试看120秒体验区 | 亚洲精品一区三区三区在线观看 | 又色又爽又黄的美女裸体网站 | 国产美女极度色诱视频www | 牛和人交xxxx欧美 | 国产av无码专区亚洲awww | 亚洲呦女专区 | 亚洲精品中文字幕乱码 | 国产精品99久久精品爆乳 | 丝袜 中出 制服 人妻 美腿 | 少妇无套内谢久久久久 | 乌克兰少妇xxxx做受 | 真人与拘做受免费视频一 | 国产福利视频一区二区 | 麻豆国产人妻欲求不满谁演的 | 色偷偷人人澡人人爽人人模 | 欧美丰满熟妇xxxx | 亚洲の无码国产の无码影院 | 对白脏话肉麻粗话av | 中文字幕人妻无码一夲道 | 欧美xxxxx精品 | 波多野结衣乳巨码无在线观看 | 国产凸凹视频一区二区 | 国精产品一品二品国精品69xx | 人妻有码中文字幕在线 | 亚洲无人区午夜福利码高清完整版 | 欧美性生交xxxxx久久久 | 亚洲精品久久久久久一区二区 | 麻花豆传媒剧国产免费mv在线 | 精品久久久中文字幕人妻 | 人人澡人摸人人添 | 影音先锋中文字幕无码 | 国产亚洲精品久久久久久久 | 一个人免费观看的www视频 | 曰韩少妇内射免费播放 | 人人澡人摸人人添 | 3d动漫精品啪啪一区二区中 | 九月婷婷人人澡人人添人人爽 | 精品午夜福利在线观看 | 欧美xxxx黑人又粗又长 | 免费观看的无遮挡av | 精品一区二区不卡无码av | 日本护士毛茸茸高潮 | 成年女人永久免费看片 | 精品久久综合1区2区3区激情 | 亚洲欧洲无卡二区视頻 | 99精品无人区乱码1区2区3区 | 欧美精品无码一区二区三区 | 99久久精品国产一区二区蜜芽 | 欧美黑人巨大xxxxx | 中文字幕人妻无码一夲道 | 久久精品国产精品国产精品污 | 4hu四虎永久在线观看 | 3d动漫精品啪啪一区二区中 | 国产精品久久久久久无码 | 狂野欧美性猛交免费视频 | 真人与拘做受免费视频一 | 永久免费精品精品永久-夜色 | 午夜精品一区二区三区在线观看 | 中文字幕人成乱码熟女app | 亚洲精品一区二区三区婷婷月 | www成人国产高清内射 | 无码吃奶揉捏奶头高潮视频 | 亚洲综合久久一区二区 | 国产激情艳情在线看视频 | 7777奇米四色成人眼影 | 在线精品国产一区二区三区 | 亚洲娇小与黑人巨大交 | 亚洲精品久久久久中文第一幕 | 牲欲强的熟妇农村老妇女视频 | 精品国产一区av天美传媒 | 亚洲最大成人网站 | 久久综合给合久久狠狠狠97色 | 欧美成人免费全部网站 | 狠狠躁日日躁夜夜躁2020 | 中文亚洲成a人片在线观看 | 99精品无人区乱码1区2区3区 | 国产乱人无码伦av在线a | 女人和拘做爰正片视频 | 丰满人妻翻云覆雨呻吟视频 | 成在人线av无码免观看麻豆 | 久久国产精品偷任你爽任你 | 亚洲人成无码网www | 国产精品对白交换视频 | 国产极品视觉盛宴 | 国产欧美熟妇另类久久久 | 无码午夜成人1000部免费视频 | 十八禁视频网站在线观看 | 成人aaa片一区国产精品 | 久久99国产综合精品 | 在线播放亚洲第一字幕 | 免费无码的av片在线观看 | 亚洲精品一区三区三区在线观看 | 老子影院午夜精品无码 | 精品久久久久久人妻无码中文字幕 | 久久亚洲中文字幕精品一区 | 夜夜影院未满十八勿进 | 久久精品人人做人人综合试看 | 国产精品高潮呻吟av久久 | 久久国语露脸国产精品电影 | 国产极品美女高潮无套在线观看 | 中文字幕无码日韩专区 | 牲欲强的熟妇农村老妇女 | 亚洲中文字幕无码一久久区 | √8天堂资源地址中文在线 | 久久99精品国产麻豆 | 国产激情一区二区三区 | 东京热无码av男人的天堂 | 中国大陆精品视频xxxx | 国产精品久久精品三级 | 久久综合久久自在自线精品自 | 精品人妻人人做人人爽夜夜爽 | 中文久久乱码一区二区 | 亚洲人成影院在线无码按摩店 | 亚洲乱码国产乱码精品精 | 亚洲精品久久久久久久久久久 | 女人被男人爽到呻吟的视频 | 狂野欧美性猛交免费视频 | 中文字幕久久久久人妻 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲理论电影在线观看 | 日韩精品一区二区av在线 | 牛和人交xxxx欧美 | 日本丰满熟妇videos | 综合激情五月综合激情五月激情1 | 中文字幕人妻无码一区二区三区 | 无人区乱码一区二区三区 | 免费无码的av片在线观看 | 蜜桃视频插满18在线观看 | 日本护士xxxxhd少妇 | 大地资源网第二页免费观看 | 99久久精品午夜一区二区 | 亚洲精品午夜无码电影网 | 少妇人妻偷人精品无码视频 | 性开放的女人aaa片 | 国产欧美熟妇另类久久久 | 亚洲小说图区综合在线 | 男女猛烈xx00免费视频试看 | 亚洲精品一区三区三区在线观看 | 强奷人妻日本中文字幕 | 国产精品内射视频免费 | 永久免费精品精品永久-夜色 | 国产精品人人妻人人爽 | 香港三级日本三级妇三级 | 亚洲第一无码av无码专区 | 大乳丰满人妻中文字幕日本 | 丝袜人妻一区二区三区 | 国产精品久久久久久久9999 | 亚洲色成人中文字幕网站 | 精品午夜福利在线观看 | 中文字幕无码免费久久9一区9 | 伊人久久大香线焦av综合影院 | 亚洲精品国产第一综合99久久 | 久久亚洲国产成人精品性色 | 国产极品美女高潮无套在线观看 | 精品无人区无码乱码毛片国产 | 成人免费视频一区二区 | 亚洲国产精品久久久天堂 | 国产精品无码mv在线观看 | 丰满肥臀大屁股熟妇激情视频 | 久久久精品欧美一区二区免费 | 久久久精品国产sm最大网站 | 精品国产一区二区三区四区在线看 | 亚洲一区二区三区国产精华液 | 国产在线aaa片一区二区99 | 国产在线精品一区二区三区直播 | 中文字幕无码人妻少妇免费 | 亚洲日本一区二区三区在线 | 久久综合九色综合97网 | 丰满岳乱妇在线观看中字无码 | 亚洲国产一区二区三区在线观看 | 麻豆成人精品国产免费 | 97精品国产97久久久久久免费 | 亚洲色成人中文字幕网站 | 亚洲精品美女久久久久久久 | 国产精品久久久久9999小说 | 久久国产精品二国产精品 | 无码乱肉视频免费大全合集 | 亚洲阿v天堂在线 | 亚洲啪av永久无码精品放毛片 | 国产亚洲欧美在线专区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲中文字幕在线无码一区二区 | 久久人妻内射无码一区三区 | 成 人 网 站国产免费观看 | 欧美日韩视频无码一区二区三 | 无遮挡啪啪摇乳动态图 | 好爽又高潮了毛片免费下载 | 成在人线av无码免观看麻豆 | 亚洲中文无码av永久不收费 | 色综合久久88色综合天天 | 欧美freesex黑人又粗又大 | 精品国产福利一区二区 | 国产成人精品一区二区在线小狼 | 性色欲网站人妻丰满中文久久不卡 | 日本又色又爽又黄的a片18禁 | 欧美兽交xxxx×视频 | 成人无码视频免费播放 | 色综合久久88色综合天天 | 欧美日韩一区二区综合 | 国内综合精品午夜久久资源 | 中文字幕亚洲情99在线 | 欧美国产日韩亚洲中文 | 国产免费久久久久久无码 | 中文字幕乱码亚洲无线三区 | 无码国产乱人伦偷精品视频 | 国产无遮挡吃胸膜奶免费看 | 老头边吃奶边弄进去呻吟 | 无遮挡国产高潮视频免费观看 | 国产午夜无码视频在线观看 | 人妻体内射精一区二区三四 | 中文字幕av无码一区二区三区电影 | 中文无码成人免费视频在线观看 | 免费视频欧美无人区码 | 日韩欧美群交p片內射中文 | 丰满人妻一区二区三区免费视频 | 久久国产精品精品国产色婷婷 | 成熟女人特级毛片www免费 | 日韩精品a片一区二区三区妖精 | 国产凸凹视频一区二区 | 免费人成在线视频无码 | 全黄性性激高免费视频 | 久久久久久av无码免费看大片 | 亚洲成色www久久网站 | 一本久久a久久精品亚洲 | 国产av久久久久精东av | 国产麻豆精品精东影业av网站 | 免费国产成人高清在线观看网站 | 97se亚洲精品一区 | 国产亚洲精品久久久久久久久动漫 | 十八禁真人啪啪免费网站 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 无遮挡啪啪摇乳动态图 | 亚洲爆乳精品无码一区二区三区 | 精品欧美一区二区三区久久久 | 无遮挡国产高潮视频免费观看 | 高清不卡一区二区三区 | 国产乡下妇女做爰 | 综合激情五月综合激情五月激情1 | 中文亚洲成a人片在线观看 | 巨爆乳无码视频在线观看 | 激情人妻另类人妻伦 | 亚洲第一无码av无码专区 | 免费无码午夜福利片69 | 欧美精品免费观看二区 | 久久精品一区二区三区四区 | 亚洲精品国偷拍自产在线麻豆 | 妺妺窝人体色www婷婷 | 久久亚洲日韩精品一区二区三区 | 精品aⅴ一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 成人欧美一区二区三区黑人免费 | 黑人大群体交免费视频 | 亚洲日本一区二区三区在线 | 日产精品99久久久久久 | 国产激情艳情在线看视频 | 欧美日韩一区二区免费视频 | 撕开奶罩揉吮奶头视频 | 中文字幕av日韩精品一区二区 | 国产农村乱对白刺激视频 | 毛片内射-百度 | 精品国产福利一区二区 | 亚洲精品综合一区二区三区在线 | 国产va免费精品观看 | 露脸叫床粗话东北少妇 | 免费看男女做好爽好硬视频 | 无码成人精品区在线观看 | 亚洲国产精品久久久久久 | 丰满妇女强制高潮18xxxx | 狠狠色欧美亚洲狠狠色www | 久久人人爽人人爽人人片av高清 | 天堂亚洲2017在线观看 | 国产成人综合色在线观看网站 | 欧美黑人性暴力猛交喷水 | 亚洲中文字幕在线无码一区二区 | 久久久久免费看成人影片 | 国产成人一区二区三区别 | 国产成人综合在线女婷五月99播放 | 国产在线精品一区二区高清不卡 | 少妇久久久久久人妻无码 | 熟女俱乐部五十路六十路av | 荫蒂添的好舒服视频囗交 | 日本丰满护士爆乳xxxx | 亚洲毛片av日韩av无码 | 国产va免费精品观看 | 永久免费精品精品永久-夜色 | 天天av天天av天天透 | 无码人妻av免费一区二区三区 | 最近免费中文字幕中文高清百度 | 亚洲自偷自拍另类第1页 | 丰满人妻一区二区三区免费视频 | 国产精品亚洲一区二区三区喷水 | 少妇被黑人到高潮喷出白浆 | 51国偷自产一区二区三区 | 亚洲精品一区二区三区在线 | 国产在热线精品视频 | 夜夜影院未满十八勿进 | 亚洲综合伊人久久大杳蕉 | 亚洲日韩av一区二区三区中文 | 精品国产一区av天美传媒 | 大地资源中文第3页 | 国产精品毛多多水多 | 欧洲熟妇精品视频 | 亚洲精品国产品国语在线观看 | 青青青爽视频在线观看 | 国产精品无码久久av | 久久国内精品自在自线 | 性做久久久久久久久 | 亚洲国产综合无码一区 | 国产精品人人爽人人做我的可爱 | 亚洲日本在线电影 | 久久精品无码一区二区三区 | 青青久在线视频免费观看 | 亚洲啪av永久无码精品放毛片 | 激情内射亚州一区二区三区爱妻 | 蜜臀av在线播放 久久综合激激的五月天 | 精品偷自拍另类在线观看 | 亚洲の无码国产の无码影院 | 小sao货水好多真紧h无码视频 | 男女性色大片免费网站 | 欧洲熟妇精品视频 | 十八禁视频网站在线观看 | 夜夜高潮次次欢爽av女 | 久久这里只有精品视频9 | av无码不卡在线观看免费 | 国产精品二区一区二区aⅴ污介绍 | 国产成人一区二区三区在线观看 | 国产内射爽爽大片视频社区在线 | 中文字幕无码视频专区 | 亚洲理论电影在线观看 | 人人爽人人澡人人人妻 | 国产精品久久久av久久久 | 中文字幕人妻丝袜二区 | 久久午夜无码鲁丝片午夜精品 | www成人国产高清内射 | 无码毛片视频一区二区本码 | 狠狠色噜噜狠狠狠7777奇米 | 青青久在线视频免费观看 | 色欲综合久久中文字幕网 | 国产av无码专区亚洲awww | 风流少妇按摩来高潮 | 久久精品国产大片免费观看 | 无码国产乱人伦偷精品视频 | 牲欲强的熟妇农村老妇女 | 婷婷五月综合缴情在线视频 | 久久五月精品中文字幕 | 成人免费视频一区二区 | 成 人 网 站国产免费观看 | 强开小婷嫩苞又嫩又紧视频 | 亚洲成a人片在线观看日本 | 国产精品久久久久久无码 | 国产性生大片免费观看性 | 99久久精品国产一区二区蜜芽 | 性生交大片免费看女人按摩摩 | 国产精品毛片一区二区 | 51国偷自产一区二区三区 | 成人试看120秒体验区 | 亚洲精品久久久久久久久久久 | 欧美日韩综合一区二区三区 | 日本丰满熟妇videos | 亚洲国产精品无码久久久久高潮 | 日韩精品无码一区二区中文字幕 | 欧美三级a做爰在线观看 | 丰满妇女强制高潮18xxxx | 国产亚洲精品精品国产亚洲综合 | 久久久久成人片免费观看蜜芽 | 桃花色综合影院 | 久久99精品久久久久久动态图 | 色一情一乱一伦一区二区三欧美 | 日韩 欧美 动漫 国产 制服 | 欧美成人免费全部网站 | 自拍偷自拍亚洲精品10p | 欧美性色19p | 亚洲精品午夜国产va久久成人 | 亚洲精品一区二区三区婷婷月 | 老熟女乱子伦 | 成人三级无码视频在线观看 | 亚洲人亚洲人成电影网站色 | 日本护士毛茸茸高潮 | 亚洲毛片av日韩av无码 | 国产高清av在线播放 | 国产三级精品三级男人的天堂 | 色婷婷香蕉在线一区二区 | 国产精品久久国产三级国 | 天堂а√在线中文在线 | 香港三级日本三级妇三级 | 好屌草这里只有精品 | 人人超人人超碰超国产 | 领导边摸边吃奶边做爽在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 啦啦啦www在线观看免费视频 | 日本一区二区三区免费高清 | 又色又爽又黄的美女裸体网站 | 日欧一片内射va在线影院 | 人人澡人人透人人爽 | 无码人妻精品一区二区三区下载 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲天堂2017无码中文 | 午夜无码区在线观看 | 少妇性l交大片欧洲热妇乱xxx | 国产精品99久久精品爆乳 | 人人妻人人澡人人爽人人精品 | 久久精品国产亚洲精品 | 亚洲经典千人经典日产 | 日本欧美一区二区三区乱码 | 国产精品对白交换视频 | 亚洲无人区一区二区三区 | 一本一道久久综合久久 | 成人片黄网站色大片免费观看 | 麻豆国产丝袜白领秘书在线观看 | 欧美变态另类xxxx | 小鲜肉自慰网站xnxx | 久久久婷婷五月亚洲97号色 | 久久精品女人的天堂av | 综合网日日天干夜夜久久 | 麻豆蜜桃av蜜臀av色欲av | а√资源新版在线天堂 | 日本乱偷人妻中文字幕 | 高清无码午夜福利视频 | 免费无码午夜福利片69 | 亚洲精品一区二区三区在线 | 国产在热线精品视频 | 无遮无挡爽爽免费视频 | 秋霞成人午夜鲁丝一区二区三区 | 久热国产vs视频在线观看 | 中国女人内谢69xxxxxa片 | √天堂资源地址中文在线 | 国产一区二区三区四区五区加勒比 | 国产人妻精品一区二区三区不卡 | 成人动漫在线观看 | 亚洲色www成人永久网址 | 亚洲中文字幕无码中字 | 精品日本一区二区三区在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲自偷自偷在线制服 | 亚洲日韩中文字幕在线播放 | 性欧美大战久久久久久久 | 狠狠噜狠狠狠狠丁香五月 | 中文亚洲成a人片在线观看 | 国产一区二区不卡老阿姨 | 日本护士xxxxhd少妇 | 一本久久伊人热热精品中文字幕 | 欧美人与禽猛交狂配 | 妺妺窝人体色www婷婷 | 丁香啪啪综合成人亚洲 | 人妻无码αv中文字幕久久琪琪布 | 老熟女重囗味hdxx69 | 日产精品高潮呻吟av久久 | 国产九九九九九九九a片 | 欧美国产日产一区二区 | 天海翼激烈高潮到腰振不止 | 亚洲日韩一区二区 | 一本大道久久东京热无码av | а√资源新版在线天堂 | 成人免费视频一区二区 | 国产97色在线 | 免 | 色综合久久久久综合一本到桃花网 | 日日天日日夜日日摸 | 午夜精品久久久内射近拍高清 | 久久久久久a亚洲欧洲av冫 | 久久综合狠狠综合久久综合88 | 日本丰满熟妇videos | av无码久久久久不卡免费网站 | 国产精品无码永久免费888 | 亚洲午夜久久久影院 | 国产 浪潮av性色四虎 | 老司机亚洲精品影院无码 | 久久精品中文字幕大胸 | 少妇一晚三次一区二区三区 | 成 人影片 免费观看 | 免费看男女做好爽好硬视频 | 一个人免费观看的www视频 | 激情内射亚州一区二区三区爱妻 | 久久国产精品_国产精品 | 欧美性生交xxxxx久久久 | 一本无码人妻在中文字幕免费 | 精品国偷自产在线视频 | 伊人久久大香线蕉午夜 | 激情综合激情五月俺也去 | 天天av天天av天天透 | 亚洲精品鲁一鲁一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 67194成是人免费无码 | 国产一区二区三区四区五区加勒比 | 国产绳艺sm调教室论坛 | 综合激情五月综合激情五月激情1 | 国内少妇偷人精品视频免费 | 成人精品一区二区三区中文字幕 | 国产黄在线观看免费观看不卡 | 国产欧美熟妇另类久久久 | 久久99国产综合精品 | 久久视频在线观看精品 | 免费观看激色视频网站 | 色偷偷人人澡人人爽人人模 | 精品熟女少妇av免费观看 | 99久久精品午夜一区二区 | 日日摸天天摸爽爽狠狠97 | 精品无码国产自产拍在线观看蜜 | 午夜男女很黄的视频 | 国产精品无码一区二区桃花视频 | 131美女爱做视频 | 亚洲高清偷拍一区二区三区 | 日韩av无码中文无码电影 | 国产高清不卡无码视频 | 97久久超碰中文字幕 | 国产精品99爱免费视频 | 亚洲精品鲁一鲁一区二区三区 | 欧美精品在线观看 | 成人动漫在线观看 | 内射老妇bbwx0c0ck | 亲嘴扒胸摸屁股激烈网站 | 男女猛烈xx00免费视频试看 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产麻豆精品一区二区三区v视界 | 九九久久精品国产免费看小说 | 少妇性荡欲午夜性开放视频剧场 | 国精产品一区二区三区 | 国产在线无码精品电影网 | 亚洲综合久久一区二区 | 丝袜 中出 制服 人妻 美腿 | 国内精品久久毛片一区二区 | 国产色视频一区二区三区 | 久久久亚洲欧洲日产国码αv | 中文字幕色婷婷在线视频 | 国内精品久久毛片一区二区 | 国产成人精品久久亚洲高清不卡 | 中文字幕日韩精品一区二区三区 | av无码电影一区二区三区 | 人人妻人人澡人人爽欧美一区 | 中文字幕人成乱码熟女app | 强伦人妻一区二区三区视频18 | 中文字幕无码热在线视频 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲乱码日产精品bd | 欧美人妻一区二区三区 | 日产精品高潮呻吟av久久 | 玩弄少妇高潮ⅹxxxyw | 日本一本二本三区免费 | 日本欧美一区二区三区乱码 | 午夜精品一区二区三区的区别 | 日产精品99久久久久久 | 狠狠色欧美亚洲狠狠色www | 国产女主播喷水视频在线观看 | 在线a亚洲视频播放在线观看 | 无码毛片视频一区二区本码 | 2020最新国产自产精品 | 欧美成人免费全部网站 | 狠狠色丁香久久婷婷综合五月 | 精品无码国产自产拍在线观看蜜 | 国产高清不卡无码视频 | 无码av最新清无码专区吞精 | 国产av一区二区精品久久凹凸 | 在线看片无码永久免费视频 | 少妇性l交大片 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日本乱偷人妻中文字幕 | 性生交大片免费看l | 东京一本一道一二三区 | 亚洲精品久久久久久久久久久 | 高潮喷水的毛片 | 午夜男女很黄的视频 | 国产精华av午夜在线观看 | 日本va欧美va欧美va精品 | 久久综合狠狠综合久久综合88 | 国产免费久久精品国产传媒 | 国产精品无套呻吟在线 | 麻豆精品国产精华精华液好用吗 | 日日天干夜夜狠狠爱 | 久久综合给久久狠狠97色 | 成人精品视频一区二区三区尤物 | 中文字幕无线码免费人妻 | 国产成人精品必看 | 啦啦啦www在线观看免费视频 | 久久97精品久久久久久久不卡 | 俄罗斯老熟妇色xxxx | 亚洲色无码一区二区三区 | 亚洲成a人片在线观看日本 | 巨爆乳无码视频在线观看 | 国产色xx群视频射精 | 成人试看120秒体验区 | 日本一本二本三区免费 | 成人免费无码大片a毛片 | 国内精品一区二区三区不卡 | 人妻人人添人妻人人爱 | 精品夜夜澡人妻无码av蜜桃 | 97资源共享在线视频 | www国产亚洲精品久久久日本 | 亚洲精品美女久久久久久久 | 无码人妻丰满熟妇区毛片18 | 亚洲日韩一区二区 | 国内少妇偷人精品视频 | 久久久精品456亚洲影院 | 日本一区二区三区免费播放 | 2020久久超碰国产精品最新 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲国产成人a精品不卡在线 | 中文字幕人妻无码一区二区三区 | 国产97色在线 | 免 | 欧美高清在线精品一区 | 一本久道久久综合婷婷五月 | 欧美日韩视频无码一区二区三 | 国产精品毛多多水多 | 国产特级毛片aaaaaaa高清 | 精品 日韩 国产 欧美 视频 | 日日碰狠狠丁香久燥 | 国产人妻精品一区二区三区不卡 | 亚洲爆乳无码专区 | 伊人久久大香线蕉亚洲 | 国产精品久久久久久久影院 | 国产片av国语在线观看 | 小泽玛莉亚一区二区视频在线 | 白嫩日本少妇做爰 | 夜精品a片一区二区三区无码白浆 | 日本一卡二卡不卡视频查询 | 东京无码熟妇人妻av在线网址 | 无码中文字幕色专区 | 扒开双腿疯狂进出爽爽爽视频 | 99精品无人区乱码1区2区3区 | 国产一精品一av一免费 | 国产精品无码久久av | 国产深夜福利视频在线 | 欧美一区二区三区视频在线观看 | 亚洲欧美精品伊人久久 | 国产午夜手机精彩视频 | 小sao货水好多真紧h无码视频 | 亚洲欧洲无卡二区视頻 | 日本精品人妻无码77777 天堂一区人妻无码 | 帮老师解开蕾丝奶罩吸乳网站 | 九一九色国产 | 国产精品高潮呻吟av久久4虎 | 中文字幕 亚洲精品 第1页 | 少妇人妻偷人精品无码视频 | 国产精品毛多多水多 | 妺妺窝人体色www在线小说 | 国产av久久久久精东av | 人妻无码αv中文字幕久久琪琪布 | 在线观看国产午夜福利片 | 日本大乳高潮视频在线观看 | 亚洲娇小与黑人巨大交 | 少妇性l交大片欧洲热妇乱xxx | 亚洲综合色区中文字幕 | 天干天干啦夜天干天2017 | 国产午夜亚洲精品不卡下载 | 色婷婷久久一区二区三区麻豆 | 欧美阿v高清资源不卡在线播放 | 久久久www成人免费毛片 | 国产亚洲精品久久久ai换 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲色欲色欲天天天www | 国产午夜亚洲精品不卡下载 | 老头边吃奶边弄进去呻吟 | 日本免费一区二区三区最新 | 色欲综合久久中文字幕网 | 成人动漫在线观看 | 国产成人综合在线女婷五月99播放 | 一本加勒比波多野结衣 | 性欧美熟妇videofreesex | аⅴ资源天堂资源库在线 | 天天摸天天碰天天添 | 99久久99久久免费精品蜜桃 | 中文字幕无码av激情不卡 | 人妻熟女一区 | 国产午夜无码精品免费看 | 国内精品久久久久久中文字幕 | 大地资源中文第3页 | 国产激情一区二区三区 | 欧美freesex黑人又粗又大 | 中文字幕亚洲情99在线 | 国产精品无码一区二区三区不卡 | 日本精品人妻无码77777 天堂一区人妻无码 | 日本乱人伦片中文三区 | 日日躁夜夜躁狠狠躁 | 色综合久久88色综合天天 | 久久久久免费精品国产 | 免费无码午夜福利片69 | 成年女人永久免费看片 | 国产又粗又硬又大爽黄老大爷视 | 亚洲精品国产精品乱码视色 | 久久久亚洲欧洲日产国码αv | 丰满人妻被黑人猛烈进入 | 日本一本二本三区免费 | 成人综合网亚洲伊人 | 免费看男女做好爽好硬视频 | 精品一区二区三区波多野结衣 | 高清国产亚洲精品自在久久 | 亚洲成av人影院在线观看 | 亚洲中文字幕在线观看 | 亚洲区欧美区综合区自拍区 | 欧美日本精品一区二区三区 | 真人与拘做受免费视频一 | 最新国产麻豆aⅴ精品无码 | 国产麻豆精品精东影业av网站 | 亚洲成熟女人毛毛耸耸多 | 欧美人妻一区二区三区 | 男人的天堂2018无码 | 久久久久久久女国产乱让韩 | 国产熟妇高潮叫床视频播放 | 欧美35页视频在线观看 | 国产卡一卡二卡三 | 7777奇米四色成人眼影 | 亚洲第一无码av无码专区 | 欧美国产亚洲日韩在线二区 | 日韩av激情在线观看 | 亚洲欧美综合区丁香五月小说 | 免费无码av一区二区 | 日日摸天天摸爽爽狠狠97 | 国产午夜亚洲精品不卡下载 | 久久久国产精品无码免费专区 | 无码任你躁久久久久久久 | 麻豆国产人妻欲求不满谁演的 | 亚洲欧美日韩成人高清在线一区 | 婷婷色婷婷开心五月四房播播 | 国产色视频一区二区三区 | 日本精品人妻无码免费大全 | 无码人妻丰满熟妇区五十路百度 | 红桃av一区二区三区在线无码av | 国产人妻久久精品二区三区老狼 | 亚洲国产精华液网站w | 一区二区三区乱码在线 | 欧洲 | 久久97精品久久久久久久不卡 | 永久免费观看国产裸体美女 | 波多野结衣av一区二区全免费观看 | 久久人人爽人人爽人人片ⅴ | 亚洲天堂2017无码 | 亚洲gv猛男gv无码男同 | 嫩b人妻精品一区二区三区 | 我要看www免费看插插视频 | 日欧一片内射va在线影院 | 免费观看的无遮挡av | av无码不卡在线观看免费 | 一区二区三区乱码在线 | 欧洲 | 中文无码精品a∨在线观看不卡 | 无码一区二区三区在线观看 | 一本无码人妻在中文字幕免费 | 伊人久久婷婷五月综合97色 | 蜜桃无码一区二区三区 | 兔费看少妇性l交大片免费 | 亚洲国产成人a精品不卡在线 | 熟妇人妻中文av无码 | 亚洲综合精品香蕉久久网 | 欧美日本精品一区二区三区 | 国产成人精品优优av | 综合人妻久久一区二区精品 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品对白交换视频 | 成人欧美一区二区三区 | 丝袜人妻一区二区三区 | 亚洲七七久久桃花影院 | 亚洲日韩一区二区三区 | 色欲综合久久中文字幕网 | 福利一区二区三区视频在线观看 | 熟女俱乐部五十路六十路av | 国产sm调教视频在线观看 | 在线观看国产午夜福利片 | 精品熟女少妇av免费观看 | 欧美日韩人成综合在线播放 | 欧美兽交xxxx×视频 | 窝窝午夜理论片影院 | 亚洲熟妇色xxxxx欧美老妇y | 波多野结衣一区二区三区av免费 | 国产真实伦对白全集 | 亚洲欧洲中文日韩av乱码 | 国产人妻久久精品二区三区老狼 | 成人av无码一区二区三区 | 中文字幕人妻无码一区二区三区 | 亚洲成a人片在线观看日本 | 性史性农村dvd毛片 | 少妇激情av一区二区 | 三上悠亚人妻中文字幕在线 | 无码av最新清无码专区吞精 | 久久精品人人做人人综合试看 | 性欧美videos高清精品 | 人妻少妇被猛烈进入中文字幕 | 久久国产劲爆∧v内射 | 2020最新国产自产精品 | 男女超爽视频免费播放 | 久久久久免费看成人影片 | 亚洲第一无码av无码专区 | 无码人妻久久一区二区三区不卡 | 亚洲人成无码网www | 欧美日本精品一区二区三区 | 久久99久久99精品中文字幕 | 国产99久久精品一区二区 | 一区二区传媒有限公司 | 久久久亚洲欧洲日产国码αv | 无码吃奶揉捏奶头高潮视频 | 亚洲 欧美 激情 小说 另类 | 水蜜桃色314在线观看 | 300部国产真实乱 | 国产亚洲欧美日韩亚洲中文色 | 国产av一区二区三区最新精品 | 国产激情无码一区二区 | 人妻少妇精品无码专区二区 | 无码成人精品区在线观看 | 国产片av国语在线观看 | 亚洲精品中文字幕乱码 | 一本久道高清无码视频 | 亚洲日韩一区二区 | 色一情一乱一伦 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成 人 网 站国产免费观看 | 久久久久久九九精品久 | 精品国产青草久久久久福利 | 日本在线高清不卡免费播放 | 男人和女人高潮免费网站 | 天堂亚洲免费视频 | 综合激情五月综合激情五月激情1 | 亚洲国产精品久久人人爱 | 人妻少妇精品无码专区二区 | 少女韩国电视剧在线观看完整 | 99久久人妻精品免费一区 | 又大又硬又黄的免费视频 | 精品国产av色一区二区深夜久久 | 亚洲国产欧美在线成人 | 玩弄人妻少妇500系列视频 | 国产精品人人妻人人爽 | 最新版天堂资源中文官网 | 牲欲强的熟妇农村老妇女视频 | 日本一区二区三区免费高清 | 久久精品人人做人人综合试看 | 少妇性l交大片欧洲热妇乱xxx | 国产真实伦对白全集 | 国产做国产爱免费视频 | 亚洲成a人片在线观看无码 | 爆乳一区二区三区无码 | 国产无套内射久久久国产 | 成人性做爰aaa片免费看不忠 | 国产成人无码区免费内射一片色欲 | 中国女人内谢69xxxx | 欧美日韩在线亚洲综合国产人 | 久久99精品久久久久婷婷 | 国产精品无码一区二区桃花视频 | 国产黄在线观看免费观看不卡 | 免费无码的av片在线观看 | 亚洲国产一区二区三区在线观看 | 熟妇人妻无码xxx视频 | 亚洲码国产精品高潮在线 | 日日摸日日碰夜夜爽av | 女人色极品影院 | 性欧美疯狂xxxxbbbb | 免费国产黄网站在线观看 | 久久aⅴ免费观看 | 久久久www成人免费毛片 | 日日鲁鲁鲁夜夜爽爽狠狠 | 水蜜桃av无码 | 亚洲精品久久久久中文第一幕 | 精品乱码久久久久久久 | 亚洲国产高清在线观看视频 | 日产精品高潮呻吟av久久 | 久久精品国产99精品亚洲 | 亚洲综合精品香蕉久久网 | 一本大道久久东京热无码av | 十八禁真人啪啪免费网站 | 亚洲欧美国产精品久久 | 成人av无码一区二区三区 | 天堂无码人妻精品一区二区三区 | 国产精华av午夜在线观看 | 精品无码成人片一区二区98 | 黄网在线观看免费网站 | 欧美 日韩 人妻 高清 中文 | 色婷婷综合中文久久一本 | 久久综合色之久久综合 | 日本www一道久久久免费榴莲 | 久久视频在线观看精品 | 精品国产青草久久久久福利 | 精品国产aⅴ无码一区二区 | 成人综合网亚洲伊人 | 真人与拘做受免费视频 | 欧美国产亚洲日韩在线二区 | 亚洲精品久久久久久一区二区 | 亚洲无人区午夜福利码高清完整版 | 久久久无码中文字幕久... | 亚洲色偷偷偷综合网 | 人妻aⅴ无码一区二区三区 | 黑人玩弄人妻中文在线 | 久久综合给合久久狠狠狠97色 | 夜夜影院未满十八勿进 | 风流少妇按摩来高潮 | 无码免费一区二区三区 | 欧美变态另类xxxx | 亚洲人成无码网www | 国产精品久久福利网站 | 在线欧美精品一区二区三区 | 日本www一道久久久免费榴莲 | 亚洲人成网站色7799 | 亚洲一区av无码专区在线观看 | 国产综合久久久久鬼色 | 国产精品亚洲а∨无码播放麻豆 | 国产卡一卡二卡三 | 国产精品高潮呻吟av久久 | 国产精品国产自线拍免费软件 | 国产人妻精品午夜福利免费 | 国产成人精品视频ⅴa片软件竹菊 | 99久久久无码国产精品免费 | 成人无码精品一区二区三区 | 亚洲乱码国产乱码精品精 | 日韩亚洲欧美精品综合 | 午夜精品一区二区三区在线观看 | 国产精品久久久久9999小说 | 在线观看欧美一区二区三区 | 青青草原综合久久大伊人精品 | аⅴ资源天堂资源库在线 | 亚洲gv猛男gv无码男同 | 精品人妻人人做人人爽 | 国产成人精品必看 | 在教室伦流澡到高潮hnp视频 | 午夜免费福利小电影 | 日本乱偷人妻中文字幕 | 东北女人啪啪对白 | 亚洲 欧美 激情 小说 另类 | 日韩人妻系列无码专区 | 亚拍精品一区二区三区探花 | 中文毛片无遮挡高清免费 | 欧洲欧美人成视频在线 | 亚洲七七久久桃花影院 | 国产av人人夜夜澡人人爽麻豆 | 亚洲一区二区三区播放 | 国产成人无码午夜视频在线观看 | 免费人成在线观看网站 | 曰韩无码二三区中文字幕 | 国产婷婷色一区二区三区在线 | 精品偷自拍另类在线观看 | 在线播放无码字幕亚洲 | 国产乱子伦视频在线播放 | 国产精品无码久久av | 婷婷丁香五月天综合东京热 | 麻豆人妻少妇精品无码专区 | 天海翼激烈高潮到腰振不止 | 人人妻人人澡人人爽人人精品浪潮 | 国产两女互慰高潮视频在线观看 | 欧美人与禽zoz0性伦交 | 欧美丰满熟妇xxxx性ppx人交 | 国产绳艺sm调教室论坛 | 人妻少妇被猛烈进入中文字幕 | 国产精品毛片一区二区 | 久久人人爽人人爽人人片av高清 | 大地资源中文第3页 | 亚洲国产日韩a在线播放 | 天天av天天av天天透 | 国产日产欧产精品精品app | 无码人妻精品一区二区三区不卡 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲国产日韩a在线播放 | 少妇高潮喷潮久久久影院 | 精品无码国产自产拍在线观看蜜 | 大肉大捧一进一出好爽视频 | 日韩人妻系列无码专区 | 亚洲熟妇色xxxxx亚洲 | 久久精品国产大片免费观看 | √天堂中文官网8在线 | 亚洲呦女专区 | 午夜精品久久久久久久久 | 亚洲狠狠婷婷综合久久 | 人妻熟女一区 | 天下第一社区视频www日本 | 国产激情无码一区二区app | 天堂久久天堂av色综合 | 老子影院午夜精品无码 | 久久人人爽人人人人片 | 久久精品人妻少妇一区二区三区 | 精品国偷自产在线视频 | 成人免费无码大片a毛片 | 午夜无码人妻av大片色欲 | 国产精品亚洲lv粉色 | 300部国产真实乱 | 国内精品久久毛片一区二区 | 日韩无套无码精品 | 国产精品二区一区二区aⅴ污介绍 | 亚洲 a v无 码免 费 成 人 a v | 夫妻免费无码v看片 | 久久久久成人片免费观看蜜芽 | 亚洲人亚洲人成电影网站色 | 国产精品国产三级国产专播 | 精品无码国产自产拍在线观看蜜 | 亚洲国产精品无码久久久久高潮 | 久久亚洲日韩精品一区二区三区 | 精品国精品国产自在久国产87 | 日韩在线不卡免费视频一区 | 日欧一片内射va在线影院 | 国产精品va在线播放 | 亚洲色欲色欲欲www在线 | 日日碰狠狠躁久久躁蜜桃 | 成人三级无码视频在线观看 | 色欲av亚洲一区无码少妇 | 婷婷综合久久中文字幕蜜桃三电影 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 7777奇米四色成人眼影 | 国产 浪潮av性色四虎 | 99精品国产综合久久久久五月天 | 久久午夜无码鲁丝片秋霞 | 日日躁夜夜躁狠狠躁 | 任你躁在线精品免费 | 无码人妻久久一区二区三区不卡 | 熟妇人妻中文av无码 | 久久亚洲日韩精品一区二区三区 | 国产极品美女高潮无套在线观看 | 色一情一乱一伦 | 中文精品无码中文字幕无码专区 | 欧美 亚洲 国产 另类 | 中文字幕无码日韩专区 | 老司机亚洲精品影院无码 | 亚洲成色www久久网站 | 国产精品亚洲综合色区韩国 | 又湿又紧又大又爽a视频国产 | 久久精品国产一区二区三区 | 国产suv精品一区二区五 | 日本乱人伦片中文三区 | 青青草原综合久久大伊人精品 | av香港经典三级级 在线 | 国产乱人伦av在线无码 | 丰满人妻翻云覆雨呻吟视频 | 动漫av一区二区在线观看 | 亚洲精品久久久久avwww潮水 | 少妇的肉体aa片免费 | 国产精品免费大片 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲第一无码av无码专区 | 理论片87福利理论电影 | 老太婆性杂交欧美肥老太 | 国产真人无遮挡作爱免费视频 | 麻豆精产国品 | 狠狠综合久久久久综合网 | 伊人色综合久久天天小片 | 97精品国产97久久久久久免费 | 免费观看激色视频网站 | 亚洲精品中文字幕 | 国产肉丝袜在线观看 | 色综合久久久无码网中文 | 国产精品久久久午夜夜伦鲁鲁 | 天堂一区人妻无码 | 国产凸凹视频一区二区 | 99久久精品无码一区二区毛片 | 99精品视频在线观看免费 | 丰满人妻精品国产99aⅴ | 强奷人妻日本中文字幕 | 久久久婷婷五月亚洲97号色 | 99久久久无码国产aaa精品 | 装睡被陌生人摸出水好爽 | 国产做国产爱免费视频 | 无码福利日韩神码福利片 | 国产农村妇女高潮大叫 | 黑人巨大精品欧美一区二区 | 久久久婷婷五月亚洲97号色 | 亚洲天堂2017无码中文 | 内射白嫩少妇超碰 | 丰满诱人的人妻3 | 亚洲男女内射在线播放 | 国产精品va在线播放 | 人人澡人人透人人爽 | 国产真人无遮挡作爱免费视频 | 亚洲乱亚洲乱妇50p | 精品无人国产偷自产在线 | 国内精品人妻无码久久久影院蜜桃 | 狠狠色丁香久久婷婷综合五月 | 精品成在人线av无码免费看 | 免费观看的无遮挡av | 国产成人无码av一区二区 | 精品aⅴ一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品无码mv在线观看 | 夜夜躁日日躁狠狠久久av | 在线成人www免费观看视频 | 激情爆乳一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 国产suv精品一区二区五 | 亚洲国产精品美女久久久久 | 日本精品人妻无码免费大全 | 黑人大群体交免费视频 | 国产真实乱对白精彩久久 | 国产免费久久久久久无码 | 亚洲精品欧美二区三区中文字幕 | 性啪啪chinese东北女人 | 欧美精品一区二区精品久久 | 亚洲a无码综合a国产av中文 | 久久亚洲a片com人成 | 日韩av无码中文无码电影 | 中文字幕无码乱人伦 | 久久伊人色av天堂九九小黄鸭 | 国精产品一区二区三区 | 久久人妻内射无码一区三区 | 又大又硬又黄的免费视频 | 精品久久久无码人妻字幂 | 狂野欧美激情性xxxx | 久久久久久a亚洲欧洲av冫 | 久久久久99精品成人片 | 国产精品毛片一区二区 | 精品无码一区二区三区爱欲 | 中文字幕亚洲情99在线 | 巨爆乳无码视频在线观看 | 亚洲午夜无码久久 | 中文精品久久久久人妻不卡 | 99精品国产综合久久久久五月天 | 一个人看的视频www在线 | 无码帝国www无码专区色综合 | 久久久无码中文字幕久... | 国产无套粉嫩白浆在线 | 少妇被黑人到高潮喷出白浆 | 性欧美熟妇videofreesex | 欧美激情内射喷水高潮 | 亚洲一区二区三区播放 | 国产超碰人人爽人人做人人添 | 亚洲国产精品久久人人爱 | 国产九九九九九九九a片 | 精品国产青草久久久久福利 | 免费乱码人妻系列无码专区 | 日韩在线不卡免费视频一区 | 久久久久久九九精品久 | 国产卡一卡二卡三 | 国产成人精品一区二区在线小狼 | 露脸叫床粗话东北少妇 | 日韩精品乱码av一区二区 | 国产亚洲精品精品国产亚洲综合 | 免费观看黄网站 | 久久这里只有精品视频9 | 国产尤物精品视频 | 日日干夜夜干 | 国产亚洲精品久久久久久大师 | 日本丰满熟妇videos | 午夜熟女插插xx免费视频 | 免费无码肉片在线观看 | 麻豆av传媒蜜桃天美传媒 | 在线 国产 欧美 亚洲 天堂 | 在线观看免费人成视频 | 亚洲七七久久桃花影院 | 成人无码影片精品久久久 | 久久国语露脸国产精品电影 | 亚洲天堂2017无码中文 | 欧美乱妇无乱码大黄a片 | 免费人成在线观看网站 | 久久亚洲日韩精品一区二区三区 | 久久亚洲精品成人无码 | www成人国产高清内射 | 亚洲性无码av中文字幕 | 国产亚洲欧美日韩亚洲中文色 | 人人妻人人澡人人爽人人精品 | 亚洲无人区午夜福利码高清完整版 | 国产精品高潮呻吟av久久 | 日韩人妻系列无码专区 | 欧美丰满老熟妇xxxxx性 | 黑人巨大精品欧美一区二区 | 久久精品国产日本波多野结衣 | 久久久中文久久久无码 | 亚洲综合色区中文字幕 | 人人妻人人澡人人爽欧美精品 | 免费网站看v片在线18禁无码 | 成人精品视频一区二区 | 中文亚洲成a人片在线观看 | 国产精品香蕉在线观看 | 国产黄在线观看免费观看不卡 | 日韩精品乱码av一区二区 | 少妇久久久久久人妻无码 | 国产色精品久久人妻 | 亚洲自偷精品视频自拍 | 婷婷综合久久中文字幕蜜桃三电影 | 丰满人妻翻云覆雨呻吟视频 | 国内精品人妻无码久久久影院蜜桃 | 精品国产麻豆免费人成网站 | 欧美人与禽zoz0性伦交 | 国产又爽又黄又刺激的视频 | 国产区女主播在线观看 | 精品 日韩 国产 欧美 视频 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲一区二区三区播放 | 中文字幕亚洲情99在线 | 性欧美牲交在线视频 | 好爽又高潮了毛片免费下载 | 黑人粗大猛烈进出高潮视频 | аⅴ资源天堂资源库在线 | 日韩成人一区二区三区在线观看 | 成年美女黄网站色大免费全看 | 精品国产aⅴ无码一区二区 | 乱人伦人妻中文字幕无码久久网 | 欧洲美熟女乱又伦 | 性色欲情网站iwww九文堂 | av香港经典三级级 在线 | 久久这里只有精品视频9 | 亚洲精品国产a久久久久久 | 亚洲欧美综合区丁香五月小说 | 国产精品多人p群无码 | 亚洲精品国产a久久久久久 | 97se亚洲精品一区 | 亚洲一区二区三区播放 | 亚洲 激情 小说 另类 欧美 | 欧美日韩久久久精品a片 | 日本熟妇大屁股人妻 | 亚洲欧美综合区丁香五月小说 | 亚洲欧洲日本无在线码 | 荫蒂被男人添的好舒服爽免费视频 | 荡女精品导航 | 亚洲人成网站免费播放 | 日日摸日日碰夜夜爽av | 图片区 小说区 区 亚洲五月 | 精品国产av色一区二区深夜久久 | 爱做久久久久久 | 老熟女重囗味hdxx69 | 亚洲国产精品无码久久久久高潮 | 思思久久99热只有频精品66 | 亚洲熟妇色xxxxx欧美老妇y | 日本丰满护士爆乳xxxx | 日本熟妇乱子伦xxxx | 一本色道久久综合亚洲精品不卡 | 成年女人永久免费看片 | 亚洲国产午夜精品理论片 | 波多野结衣aⅴ在线 | 亚洲 日韩 欧美 成人 在线观看 | 久久精品99久久香蕉国产色戒 | 激情内射日本一区二区三区 | av香港经典三级级 在线 | а√资源新版在线天堂 | 午夜男女很黄的视频 | 东北女人啪啪对白 | 精品久久8x国产免费观看 | 国产熟妇另类久久久久 | 无码人妻精品一区二区三区不卡 | 精品久久久无码中文字幕 | 九九久久精品国产免费看小说 | 免费乱码人妻系列无码专区 | 精品无码国产自产拍在线观看蜜 | 色一情一乱一伦 | 日本精品人妻无码免费大全 | 免费人成网站视频在线观看 | 中文字幕亚洲情99在线 | 久久久久成人精品免费播放动漫 | aa片在线观看视频在线播放 | 捆绑白丝粉色jk震动捧喷白浆 | 精品久久久无码中文字幕 | 亚洲精品一区二区三区婷婷月 | 国产日产欧产精品精品app | 国产精品久久久 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国产欧美在线成人 | 国产97人人超碰caoprom | 亚洲精品国产第一综合99久久 | 国产一区二区三区影院 | 国产 浪潮av性色四虎 | 男女爱爱好爽视频免费看 | 永久免费观看国产裸体美女 | 国产成人午夜福利在线播放 | 亚洲熟女一区二区三区 | 亚洲成色在线综合网站 | 欧美自拍另类欧美综合图片区 | 最近中文2019字幕第二页 | 亚洲精品久久久久avwww潮水 | 国产精品a成v人在线播放 | 乱人伦中文视频在线观看 | 18无码粉嫩小泬无套在线观看 | 亚洲色欲久久久综合网东京热 | 国产在线一区二区三区四区五区 | 亚洲一区二区三区无码久久 | 中文无码成人免费视频在线观看 | 欧洲美熟女乱又伦 | 欧美熟妇另类久久久久久多毛 | 亚洲乱码国产乱码精品精 | 麻豆果冻传媒2021精品传媒一区下载 | 永久黄网站色视频免费直播 | 色综合久久久久综合一本到桃花网 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日日天日日夜日日摸 | 人人澡人人透人人爽 | 中国女人内谢69xxxx | 亚洲日韩一区二区 | 久久国语露脸国产精品电影 | 欧美激情一区二区三区成人 | 伊人久久大香线蕉av一区二区 | 99久久久国产精品无码免费 | 亚洲精品一区二区三区在线 | 亚洲娇小与黑人巨大交 | 一二三四社区在线中文视频 | 一本色道久久综合狠狠躁 | 亚洲区欧美区综合区自拍区 | 久久久久99精品成人片 | 99久久婷婷国产综合精品青草免费 | 久久综合香蕉国产蜜臀av | 麻豆成人精品国产免费 | 日本va欧美va欧美va精品 | 美女极度色诱视频国产 | 九九久久精品国产免费看小说 | 1000部啪啪未满十八勿入下载 | 欧美35页视频在线观看 | 又大又黄又粗又爽的免费视频 | 国产精品国产自线拍免费软件 | 国产黄在线观看免费观看不卡 | 高清无码午夜福利视频 | 国产亚洲tv在线观看 | 久久99热只有频精品8 | 婷婷色婷婷开心五月四房播播 | 欧美变态另类xxxx | 国产无av码在线观看 | 亚洲午夜福利在线观看 | 激情内射日本一区二区三区 | 久久久久久久女国产乱让韩 | 国产精品久久久av久久久 | 欧美xxxx黑人又粗又长 | 波多野结衣高清一区二区三区 | 久久久久亚洲精品中文字幕 | 欧美精品无码一区二区三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产一区二区三区四区五区加勒比 | 欧美精品一区二区精品久久 | 亚洲一区二区三区香蕉 | 国产猛烈高潮尖叫视频免费 | 精品无人区无码乱码毛片国产 | 精品午夜福利在线观看 | 国产黄在线观看免费观看不卡 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 久久综合九色综合97网 | 欧美国产日韩久久mv | 日本精品人妻无码免费大全 | 中文字幕av伊人av无码av |