亭亭五月天在线观看,亭亭五月天在线观看,国产最新av一区二区,国产 高清 中文字幕,99re热久久亚洲综合精品成人,熟妇 一区二区三区,一级做a爰片性色毛片武则天,美女的骚穴视频播放,国产美女午夜免费视频

首頁>國內(nèi) > 正文

答讀者問:唯一索引沖突,為什么主鍵的 Supremum 記錄會(huì)加 Next-Key 鎖?-天天觀察

2023-06-05 13:05:09來源:一樹一溪

本文緣起于一位讀者的提問:插入一條記錄,導(dǎo)致唯一索引沖突,為什么會(huì)對(duì)主鍵的 supremum 記錄加 next-key 排他鎖?

我在 MySQL 8.0.32 復(fù)現(xiàn)了問題,并調(diào)試了加鎖流程,寫下來和大家分享。


(相關(guān)資料圖)

了解完整的加鎖流程,有助于我們更深入的理解 InnoDB 的記錄鎖,希望大家有收獲。

本文基于 MySQL 8.0.32 源碼,存儲(chǔ)引擎為 InnoDB。

1、準(zhǔn)備工作

創(chuàng)建測試表:

CREATE TABLE `t6` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `i1` int unsigned NOT NULL DEFAULT "0",  PRIMARY KEY (`id`),  UNIQUE KEY `uniq_i1` (`i1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

插入測試數(shù)據(jù):

INSERT INTO `t6`(i1) VALUES  (1001), (1002), (1003),  (1004), (1005), (1006);

設(shè)置事務(wù)隔離級(jí)別:在 my.cnf 中,把系統(tǒng)變量transaction_isolation設(shè)置為REPEATABLE-READ。

2、問題復(fù)現(xiàn)

插入一條會(huì)導(dǎo)致唯一索引沖突的記錄:

BEGIN;INSERT INTO `t6`(i1) VALUES(1001);

通過 BEGIN 顯式開啟事務(wù),INSERT 執(zhí)行完成之后,我們可以通過以下 SQL 查看加鎖情況:

SELECT   OBJECT_NAME, INDEX_NAME, LOCK_TYPE,  LOCK_MODE, LOCK_STATUS, LOCK_DATAFROM `performance_schema`.`data_locks`;

結(jié)果如下:

唯一索引(uniq_i1):id = 1,i1 = 1001 的記錄,加 next-key 共享鎖。

主鍵索引(PRIMARY):supremum 記錄,加 next-key 排他鎖。

3、前置知識(shí)點(diǎn):隱式鎖

插入記錄時(shí),隱式鎖是個(gè)比較重要的概念,它存在的目的是:減少插入記錄時(shí)不必要的加鎖,提升 MySQL 的并發(fā)能力。

我們先來看一下隱式鎖的定義:

事務(wù) T 要插入一條記錄 R,只要即將插入記錄的目標(biāo)位置沒有被其它事務(wù)上鎖,事務(wù) T 就不需要申請(qǐng)對(duì)目標(biāo)位置加鎖,可以直接插入記錄。

事務(wù) T 提交之前,如果其它事務(wù)出現(xiàn)以下 2 種情況,都必須幫助事務(wù) T 給記錄 R 加上排他鎖:

其它事務(wù)執(zhí)行 UPDATE、DELETE 語句時(shí)掃描到了記錄 R。其它事務(wù)插入的記錄和 R 存在主鍵或唯一索引沖突。

未提交事務(wù) T 插入的記錄上,這種隱性的、由其它事務(wù)在需要時(shí)幫忙創(chuàng)建的鎖,就是隱式鎖

隱式鎖,就像神話電視劇里的結(jié)界。沒有觸碰到它時(shí),看不見,就像不存在一樣,一旦觸碰到,它就顯現(xiàn)出來了。

隱式鎖可能出現(xiàn)于多種場景,我們來看看主鍵索引的 2 種隱式鎖場景:

前提條件:

事務(wù) T1 插入一條記錄 R1,即將插入 R1 的目標(biāo)位置沒有被其它事務(wù)上鎖,事務(wù) T1 可以直接插入 R1。

場景 1:

事務(wù) T1 插入 R1 之后,提交事務(wù)之前,事務(wù) T2 試圖插入一條記錄 R2(主鍵字段值和 R1 相同)。

事務(wù) T2 給 R2 尋找插入位置的過程中,就會(huì)發(fā)現(xiàn) R2 和 R1 沖突,并且插入 R1 的事務(wù) T1 還沒有提交,這就觸發(fā)了 R1 的隱式鎖邏輯。

事務(wù) T2 會(huì)幫助 T1 給 R1 加上排他鎖,然后,它自己會(huì)申請(qǐng)對(duì) R1 加共享鎖,并等待事務(wù) T1 釋放 R1 上的排他鎖。

事務(wù) T1 釋放 R1 的鎖之后,如果事務(wù) T2 沒有鎖等待超時(shí),它獲取到 R1 上的鎖之后,就可以繼續(xù)進(jìn)行主鍵沖突的后續(xù)處理邏輯了。

場景 2:

事務(wù) T1 插入 R1 之后,提交事務(wù)之前,事務(wù) T3 執(zhí)行 UPDATE 或 DELETE 語句時(shí)掃描到了 R1,發(fā)現(xiàn)插入 R1 的事務(wù) T1 還沒有提交,同樣觸發(fā)了 R1 的隱式鎖邏輯。

事務(wù) T3 會(huì)幫助 T1 給 R1 加上排他鎖,然后,它自己會(huì)申請(qǐng)對(duì) R1 加排他鎖,并等待事務(wù) T1 釋放 R1 上的排他鎖。

事務(wù) T1 提交并釋放 R1 的鎖之后,如果事務(wù) T3 沒有鎖等待超時(shí),它獲取到 R1 上的鎖之后,就可以繼續(xù)對(duì) R1 進(jìn)行修改或刪除操作了。

對(duì)隱式鎖有了大概了解之后,接下來,我們回到本文主題,來看看 INSERT 執(zhí)行過程中的加鎖流程。

4、流程分析

我們先來看一下主要堆棧,接下來的流程分析圍繞這個(gè)堆棧進(jìn)行:

| > row_insert_for_mysql_using_ins_graph() storage/innobase/row/row0mysql.cc:1585| + > row_ins_step(que_thr_t*) storage/innobase/row/row0ins.cc:3677| + - > row_ins(ins_node_t*, que_thr_t*) storage/innobase/row/row0ins.cc:3559| + - x > row_ins_index_entry_step(ins_node_t*, que_thr_t*) storage/innobase/row/row0ins.cc:3435| + - x = > row_ins_index_entry() storage/innobase/row/row0ins.cc:3303| + - x = | > row_ins_sec_index_entry() storage/innobase/row/row0ins.cc:3203| + - x = | + > row_ins_sec_index_entry_low() storage/innobase/row/row0ins.cc:2926| + - x = | + - > row_ins_scan_sec_index_for_duplicate() storage/innobase/row/row0ins.cc:1894| + > row_mysql_handle_errors() storage/innobase/row/row0mysql.cc:701

這個(gè)堆棧的關(guān)鍵步驟有 2 個(gè):

row_ins_step(),插入記錄到主鍵、唯一索引。row_mysql_handle_errors(),插入失敗之后,進(jìn)行錯(cuò)誤處理。(1)插入記錄到主鍵、唯一索引
// storage/innobase/row/row0mysql.ccstatic dberr_t row_insert_for_mysql_using_ins_graph(...) {  ...  // 主要構(gòu)造用于執(zhí)行插入操作的 2 個(gè)對(duì)象:  // 1. ins_node_t 對(duì)象,保存在 prebuilt->ins_node 中  // 2. que_fork_t 對(duì)象,保存在 prebuilt->ins_graph 中  row_get_prebuilt_insert_row(prebuilt);  node = prebuilt->ins_node;  // 把 server 層的記錄格式轉(zhuǎn)換為 InnoDB 的記錄格式  row_mysql_convert_row_to_innobase(node->row, prebuilt, mysql_rec, &temp_heap);  ...  // 執(zhí)行插入操作  row_ins_step(thr);  ...  if (err != DB_SUCCESS) {  error_exit:    que_thr_stop_for_mysql(thr);    ...    // 錯(cuò)誤處理    auto was_lock_wait = row_mysql_handle_errors(&err, trx, thr, &savept);    ...    return (err);  }  ...}

這個(gè)方法的主要邏輯:

調(diào)用 row_get_prebuilt_insert_row(),構(gòu)造包含插入數(shù)據(jù)的 ins_node_t 對(duì)象、查詢執(zhí)行圖 que_fork_t 對(duì)象,分別保存到 prebuilt 的 ins_node、ins_graph 屬性中。把 server 層的記錄格式轉(zhuǎn)換為 InnoDB 的記錄格式。調(diào)用 row_ins_step(),插入記錄到主鍵索引、二級(jí)索引(包含唯一索引、非唯一索引)。
// storage/innobase/row/row0ins.ccque_thr_t *row_ins_step(que_thr_t *thr){  ...  // 重置 node->trx_id_buf 指針指向的內(nèi)存區(qū)域  memset(node->trx_id_buf, 0, DATA_TRX_ID_LEN);  // 把當(dāng)前事務(wù) ID 拷貝到 node->trx_id_buf 指針指向的內(nèi)存區(qū)域  trx_write_trx_id(node->trx_id_buf, trx->id);  if (node->state == INS_NODE_SET_IX_LOCK) {    ...    // 給表加上意向鎖    err = lock_table(0, node->table, LOCK_IX, thr);    ...  }  ...  err = row_ins(node, thr);  ...  return (thr);}

row_ins_step() 調(diào)用 row_ins() 插入記錄到主鍵索引、二級(jí)索引。

// storage/innobase/row/row0ins.cc[[nodiscard]] static dberr_t row_ins(...){  ...  // 迭代表中的索引,插入記錄到索引中  while (node->index != nullptr) {    // 只要不是全文索引    if (node->index->type != DICT_FTS) {      // 調(diào)用 row_ins_index_entry_step()      // 插入記錄到當(dāng)前迭代的索引中      err = row_ins_index_entry_step(node, thr);      switch (err) {        // 執(zhí)行成功,跳出 switch        // 會(huì)接著進(jìn)行下一輪迭代        case DB_SUCCESS:          break;        // 存在主鍵索引或唯一索引沖突        case DB_DUPLICATE_KEY:          thr_get_trx(thr)->error_state = DB_DUPLICATE_KEY;          thr_get_trx(thr)->error_index = node->index;          // 貫穿到 default 分支          [[fallthrough]];        default:          // 返回錯(cuò)誤碼 DB_DUPLICATE_KEY          return err;      }    }    // 插入記錄到主鍵索引或二級(jí)索引成功    // node->index、entry 指向表中的下一個(gè)索引    node->index = node->index->next();    node->entry = UT_LIST_GET_NEXT(tuple_list, node->entry);    ...  }  ...}

row_ins() 的主要邏輯是個(gè) while 循環(huán),逐個(gè)迭代表中的索引,每迭代一個(gè)索引,都把構(gòu)造好的記錄插入到索引中。迭代完全部索引之后,插入一條記錄到表中的操作就完成了。

接下來,我們通過示例 SQL 來看看 row_ins() 的具體執(zhí)行流程。

-- 為了方便,這里再展示下測試表和示例 SQLCREATE TABLE `t6` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `i1` int unsigned NOT NULL DEFAULT "0",  PRIMARY KEY (`id`),  UNIQUE KEY `uniq_i1` (`i1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;INSERT INTO `t6`(i1) VALUES(1001);

測試表 t6 有兩個(gè)索引:主鍵索引、uniq_i1(唯一索引),對(duì)于示例 SQL,上面代碼中的 while 會(huì)進(jìn)行 2 輪迭代:

第 1 輪,調(diào)用 row_ins_index_entry_step(),插入記錄到主鍵索引。示例 SQL 沒有指定主鍵字段值,主鍵字段會(huì)使用自增值,不會(huì)和表中原有記錄沖突,插入操作能執(zhí)行成功。

第 2 輪,調(diào)用 row_ins_index_entry_step(),插入記錄到 uniq_i1。新插入記錄的 i1 字段值為 1001,和表中原有記錄(id = 1)的 i1 字段值相同,會(huì)導(dǎo)致唯一索引沖突。

row_ins_index_entry_step() 插入記錄到uniq_i1,導(dǎo)致唯一索引沖突,它會(huì)返回錯(cuò)誤碼DB_DUPLICATE_KEY給 row_ins()。

row_ins() 拿到錯(cuò)誤碼之后,它的執(zhí)行流程到此結(jié)束,把錯(cuò)誤碼返回給調(diào)用者。

當(dāng)執(zhí)行流程帶著錯(cuò)誤碼(DB_DUPLICATE_KEY)一路返回到row_insert_for_mysql_using_ins_graph(),接下來會(huì)調(diào)用row_mysql_handle_errors()處理唯一索引沖突的善后邏輯(這部分留到4.3 回滾語句再聊)。

介紹唯一索引沖突的善后邏輯之前,我們以row_ins_sec_index_entry_low()為入口,一路跟隨執(zhí)行流程進(jìn)入row_ins_sec_index_entry_low(),來看看給唯一索引中沖突記錄加 next-key 共享鎖的流程。

這里的 next-key 共享鎖,就是下圖中LOCK_DATA = 1001,1對(duì)應(yīng)的鎖。

(2)唯一索引記錄加鎖
// storage/innobase/row/row0ins.ccdberr_t row_ins_sec_index_entry_low(...) {  ...  if (dict_index_is_spatial(index)) {    // 處理空間索引的邏輯    ...  } else {    if (index->table->is_intrinsic()) {      // MySQL 內(nèi)部臨時(shí)表      ...    } else {      // 找到記錄將要插入到哪個(gè)位置      btr_cur_search_to_nth_level(index, 0, entry, PAGE_CUR_LE, search_mode,                                  &cursor, 0, __FILE__, __LINE__, &mtr);    }  }  ...  // 索引中需要用幾個(gè)(n_unique)字段  // 才能唯一標(biāo)識(shí)一條記錄  n_unique = dict_index_get_n_unique(index);  // 如果是主鍵索引或唯一索引  if (dict_index_is_unique(index) &&      // 并且即將插入的記錄      // 和索引中的記錄相同      (cursor.low_match >= n_unique || cursor.up_match >= n_unique)) {    ...    // 判斷新插入記錄是否會(huì)導(dǎo)致沖突    // 如果會(huì)導(dǎo)致沖突,會(huì)對(duì)沖突記錄加鎖    err = row_ins_scan_sec_index_for_duplicate(flags, index, entry, thr, check,                                               &mtr, offsets_heap);    ...  }  ...}

row_ins_sec_index_entry_low() 找到插入記錄的目標(biāo)位置之后,如果發(fā)現(xiàn)這個(gè)位置已經(jīng)有一條相同的記錄了,說明有可能導(dǎo)致唯一索引沖突,調(diào)用row_ins_scan_sec_index_for_duplicate()確認(rèn)是否沖突,并根據(jù)情況進(jìn)行加鎖處理。

// storage/innobase/row/row0ins.cc[[nodiscard]] static dberr_t row_ins_scan_sec_index_for_duplicate(...){  ...  // SQL 語句是否包含解決主鍵、唯一索引沖突的邏輯  allow_duplicates = row_allow_duplicates(thr);  ...  do {    ...    if (flags & BTR_NO_LOCKING_FLAG) {      /* Set no locks when applying log in online table rebuild. */    } else if (allow_duplicates) {      ...      // 如果 SQL 語句包含解決主鍵、唯一索引沖突的邏輯      // 給沖突記錄加排他鎖(LOCK_X)      err = row_ins_set_rec_lock(LOCK_X, lock_type, block, rec, index, offsets,                                 thr);    } else /* else_1 */ {      if (skip_gap_locks) {        // 如果是數(shù)據(jù)字典表、SDI 表        // 決定加什么鎖,忽略        ...      } else if (is_supremum) {        /* We use next key lock to possibly combine the locks in bitmap.        Equivalent to LOCK_GAP. */        // next-key 鎖        lock_type = LOCK_ORDINARY;      } else if (is_next) {        /* Only gap lock is required on next record. */        // gap 鎖        lock_type = LOCK_GAP;      } else /* else_2 */ {        /* Next key lock for all equal keys. */        // next-key 鎖        lock_type = LOCK_ORDINARY;      }      ...      // SQL 語句【不包含】解決主鍵、唯一索引沖突的邏輯      // 給沖突記錄加共享鎖(LOCK_S)      err = row_ins_set_rec_lock(LOCK_S, lock_type, block, rec, index, offsets,                                 thr);    }    ...    if (is_supremum) {      continue;    }    // !index->allow_duplicates = true    // 即 index->allow_duplicates = false     // 表示不允許索引中存在重復(fù)記錄    // 調(diào)用 row_ins_dupl_error_with_rec()    // 確定新插入記錄是否會(huì)導(dǎo)致索引沖突    if (!is_next && !index->allow_duplicates) {      if (row_ins_dupl_error_with_rec(rec, entry, index, offsets)) {        // 返回 true,說明會(huì)導(dǎo)致索引沖突        // 把錯(cuò)誤碼賦值給 err 變量        // 作為方法的返回值        err = DB_DUPLICATE_KEY;        ...        goto end_scan;      }    } else /* else_3 */ {      ut_a(is_next || index->allow_duplicates);      goto end_scan;    }  } while (pcur.move_to_next(mtr));end_scan:  /* Restore old value */  dtuple_set_n_fields_cmp(entry, n_fields_cmp);  return err;}

以下 3 種 SQL,allow_duplicates = true,表示 SQL 包含解決主鍵、唯一索引沖突的邏輯:

load datafile replacereplace intoinsert ... on duplicate key update

解決沖突的方式:

load datafile replace、replace into,刪除表中的沖突記錄,插入新記錄。insert ... on duplicate key update,用 update 后面的各字段值更新表中沖突記錄對(duì)應(yīng)的字段。

如果 SQL 包含解決主鍵、唯一索引沖突的邏輯,會(huì)更新或刪除沖突記錄,所以需要加排他鎖(LOCK_X)。

對(duì)于示例 SQL,allow_duplicates =false,執(zhí)行流程會(huì)進(jìn)入else_1分支。

因?yàn)槭纠?SQL 不包含解決主鍵、唯一索引沖突的邏輯,不會(huì)更新、刪除沖突記錄,所以,只需要對(duì)沖突記錄加共享鎖(LOCK_S),加鎖的精確模式為 next-key 鎖(對(duì)應(yīng)else_2分支)。

和變量 allow_duplicates 的含義不同,if (!is_next && !index->allow_duplicates)中的index->allow_duplicates表示唯一索引是否允許存在重復(fù)記錄:

對(duì)于 MySQL 內(nèi)部臨時(shí)表的二級(jí)索引,index->allow_duplicates = true。對(duì)于其它表,index->allow_duplicates = false。

對(duì)于示例 SQL,if (!is_next && !index->allow_duplicates)條件成立,調(diào)用row_ins_dupl_error_with_rec()得到返回值true,說明新插入記錄和唯一索引中的原有記錄沖突。

執(zhí)行流程進(jìn)入if (row_ins_dupl_error_with_rec(rec, entry, index, offsets))分支,設(shè)置變量 err 的值為DB_DUPLICATE_KEY。

那么,問題來了:插入記錄到唯一索引時(shí),發(fā)現(xiàn)插入目標(biāo)位置已經(jīng)有一條相同的記錄了,這不能說明新插入記錄和唯一索引中原有記錄沖突嗎?

還真不能,因?yàn)槲ㄒ凰饕袀€(gè)特殊場景要處理,那就是 NULL 值。

InnoDB 認(rèn)為 NULL 表示未知,NULL 和 NULL 也是不相等的,所以,唯一索引中可以包含多條字段值為 NULL 的記錄。

本文中,唯一索引都是指的二級(jí)索引。InnoDB 主鍵的字段值是不允許為 NULL 的。

舉個(gè)例子:對(duì)于測試表 t6,假設(shè)某條記錄的 i1 字段值為 NULL,新記錄的 i1 字段值也為 NULL,就可以插入成功,而不會(huì)報(bào) Duplicate key 錯(cuò)誤。

(3)回滾語句

row_ins_step() 執(zhí)行結(jié)束之后,row_insert_for_mysql_using_ins_graph()從 trx->error_state 中得到錯(cuò)誤碼 DB_DUPLICATE_KEY,說明新插入記錄導(dǎo)致唯一索引沖突,調(diào)用row_mysql_handle_errors()處理沖突的善后邏輯,堆棧如下:

| > row_mysql_handle_errors(...) storage/innobase/row/row0mysql.cc:701| + > // 插入記錄導(dǎo)致唯一索引沖突,需要回滾| + > trx_rollback_to_savepoint(trx_t*, trx_savept_t*) storage/innobase/trx/trx0roll.cc:151| + - > trx_rollback_to_savepoint_low(trx_t*, trx_savept_t*) storage/innobase/trx/trx0roll.cc:114| + - x > que_run_threads(que_thr_t*) storage/innobase/que/que0que.cc:1001| + - x = > que_run_threads_low(que_thr_t*) storage/innobase/que/que0que.cc:966| + - x = | > que_thr_step(que_thr_t*) storage/innobase/que/que0que.cc:913| + - x = | + > row_undo_step(que_thr_t*) storage/innobase/row/row0undo.cc:362| + - x = | + - > row_undo(undo_node_t*, que_thr_t*) storage/innobase/row/row0undo.cc:296| + - x = | + - x > row_undo_ins(undo_node_t*, que_thr_t*) storage/innobase/row/row0uins.cc:500| + - x = | + - x = > row_undo_ins_remove_clust_rec(undo_node_t*) storage/innobase/row/row0uins.cc:118| + - x = | + - x = | > row_convert_impl_to_expl_if_needed(btr_cur_t*, undo_node_t*) storage/innobase/row/row0undo.cc:338| + - x = | + - x = | + > // 把主鍵索引記錄上的隱式鎖轉(zhuǎn)換為顯式鎖| + - x = | + - x = | + > lock_rec_convert_impl_to_expl(...) storage/innobase/lock/lock0lock.cc:5544| + - x = | + - x = | + - > lock_rec_convert_impl_to_expl_for_trx(...) storage/innobase/lock/lock0lock.cc:5496| + - x = | + - x = | + - x > lock_rec_add_to_queue(...) storage/innobase/lock/lock0lock.cc:1613| + - x = | + - x = | + - x = > lock_rec_other_has_expl_req(...) storage/innobase/lock/lock0lock.cc:900| + - x = | + - x = | + - x = > // 創(chuàng)建鎖結(jié)構(gòu)| + - x = | + - x = | + - x = > RecLock::create(trx_t*, lock_prdt const*) storage/innobase/lock/lock0lock.cc:1356| + - x = | + - x = | > // 先進(jìn)行樂觀刪除,如果樂觀刪除失敗,后面會(huì)進(jìn)行悲觀刪除| + - x = | + - x = | > btr_cur_optimistic_delete(...) storage/innobase/include/btr0cur.h:466| + - x = | + - x = | + > btr_cur_optimistic_delete_func(...) storage/innobase/btr/btr0cur.cc:4562| + - x = | + - x = | + - > lock_update_delete(...) storage/innobase/lock/lock0lock.cc:3350| + - x = | + - x = | + - x > // 剛剛插入的記錄,因?yàn)槲ㄒ凰饕龥_突需要?jiǎng)h除,讓它的下一條記錄繼承 GAP 鎖| + - x = | + - x = | + - x > lock_rec_inherit_to_gap(...) storage/innobase/lock/lock0lock.cc:2588| + - x = | + - x = | + - x = > lock_rec_add_to_queue(...) storage/innobase/lock/lock0lock.cc:1681| + - x = | + - x = | + - x = | > // 為被刪除的主鍵記錄的下一條記錄創(chuàng)建鎖結(jié)構(gòu)| + - x = | + - x = | + - x = | > RecLock::create(trx_t*, lock_prdt const*) storage/innobase/lock/lock0lock.cc:1356

row_mysql_handle_errors() 的核心邏輯是個(gè) switch,根據(jù)不同的錯(cuò)誤碼進(jìn)行相應(yīng)的處理。

// storage/innobase/row/row0mysql.ccbool row_mysql_handle_errors(...){  ...  switch (err) {    ...    case DB_DUPLICATE_KEY:    ...      if (savept) {        /* Roll back the latest, possibly incomplete insertion        or update */        trx_rollback_to_savepoint(trx, savept);      }      /* MySQL will roll back the latest SQL statement */      break;      ...    }    ...}

對(duì)于錯(cuò)誤碼 DB_DUPLICATE_KEY,row_mysql_handle_errors()會(huì)調(diào)用trx_rollback_to_savepoint()回滾示例 SQL 對(duì)于主鍵索引所做的插入記錄操作。

savept 是調(diào)用 row_ins_step() 插入記錄到主鍵、唯一索引之前的保存點(diǎn),trx_rollback_to_savepoint()可以利用 savept 中的保存點(diǎn),刪除 row_ins_step() 剛剛插入到主鍵索引中的記錄,讓主鍵索引回到 row_ins_step() 執(zhí)行之前的狀態(tài)。

對(duì)于示例 SQL,trx_rollback_to_savepoint() 經(jīng)過多級(jí)之后,調(diào)用row_undo_ins_remove_clust_rec()刪除已插入到主鍵索引的記錄。

// storage/innobase/row/row0uins.cc[[nodiscard]] static dberr_t row_undo_ins_remove_clust_rec(    undo_node_t *node) /*!< in: undo node */{  ...  // 把新插入到主鍵索引中的記錄上的隱式鎖  // 轉(zhuǎn)換為顯式鎖  row_convert_impl_to_expl_if_needed(btr_cur, node);  // 先進(jìn)行樂觀刪除  if (btr_cur_optimistic_delete(btr_cur, 0, &mtr)) {    err = DB_SUCCESS;    goto func_exit;  }  ...  // 如果樂觀刪除失敗,再進(jìn)行悲觀刪除  btr_cur_pessimistic_delete(&err, false, btr_cur, 0, true, node->trx->id,                             node->undo_no, node->rec_type, &mtr, &node->pcur,                             nullptr);}

刪除主鍵索引記錄之前,需要給它加鎖。因?yàn)椴迦氩僮靼[式鎖的邏輯,所以這里的加鎖操作是把即將被刪除記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

當(dāng)然,需要滿足一定的條件,row_convert_impl_to_expl_if_needed()才會(huì)把主鍵索引中即將被刪除記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

// storage/innobase/row/row0undo.ccvoid row_convert_impl_to_expl_if_needed(btr_cur_t *cursor, undo_node_t *node) {  ...  // 滿足以下 3 種條件之一,不需要把隱式鎖轉(zhuǎn)換為顯式鎖:  // 1. !node->partial = true,即 node->partial = false  //    表示整個(gè)事務(wù)回滾  // 2. node->trx == nullptr  // 3. node->trx->isolation_level < trx_t::REPEATABLE_READ  //    事務(wù)隔離級(jí)別為:讀未提交(RU)、讀已提交(RC)  if (!node->partial || (node->trx == nullptr) ||      node->trx->isolation_level < trx_t::REPEATABLE_READ) {    return;  }  ...  // 滿足以下 4 種條件,需要把隱式鎖轉(zhuǎn)換顯式鎖:  // 1. heap_no 對(duì)應(yīng)的記錄不是 supremum  // 2. 當(dāng)前索引不是空間索引  // 3. 不是用戶臨時(shí)表  // 4. 不是 MySQL 內(nèi)部臨時(shí)表  if (/* 1 */ heap_no != PAGE_HEAP_NO_SUPREMUM &&       /* 2 */ !dict_index_is_spatial(index) &&      /* 3 */ !index->table->is_temporary() &&       /* 4 */ !index->table->is_intrinsic()) {    lock_rec_convert_impl_to_expl(block, rec, index,                                  Rec_offsets().compute(rec, index));  }}

對(duì)于示例 SQL,第 1 個(gè) if 條件不成立,所以不會(huì)執(zhí)行 return,而是會(huì)繼續(xù)判斷第 2 個(gè) if 條件。

第 2 個(gè) if 條件成立,執(zhí)行流程進(jìn)入 if 分支,調(diào)用 lock_rec_convert_impl_to_expl() 把隱式鎖轉(zhuǎn)換為顯式鎖。

執(zhí)行流程回到row_undo_ins_remove_clust_rec(),調(diào)用row_convert_impl_to_expl_if_needed()把主鍵索引中即將被刪除記錄上的隱式鎖轉(zhuǎn)換為顯式鎖之后,接下就是刪除記錄了。

先調(diào)用btr_cur_optimistic_delete()進(jìn)行樂觀刪除。

樂觀刪除指的是刪除數(shù)據(jù)頁中的記錄之后,不會(huì)因?yàn)閿?shù)據(jù)頁中的記錄數(shù)量過少而觸發(fā)相鄰的數(shù)據(jù)頁合并。

如果樂觀刪除成功,直接返回 DB_SUCCESS。

如果樂觀刪除失敗,再調(diào)用btr_cur_pessimistic_delete()進(jìn)行悲觀刪除。

悲觀刪除指的是刪除數(shù)據(jù)頁中的記錄之后,因?yàn)閿?shù)據(jù)頁中的記錄數(shù)量過少,會(huì)觸相鄰的數(shù)據(jù)頁合并。

(4)主鍵索引記錄的隱式鎖轉(zhuǎn)換

上一小節(jié)中,我們沒有深入介紹主鍵索引中即將被刪除記錄上的隱式鎖轉(zhuǎn)換為顯式鎖的邏輯,接下來,我們來看看這個(gè)邏輯。

// storage/innobase/lock/lock0lock.ccvoid lock_rec_convert_impl_to_expl(...) {  trx_t *trx;  ...  // 主鍵索引  if (index->is_clustered()) {    trx_id_t trx_id;    // 獲取 rec 記錄中 DB_TRX_ID 字段的值    // 拿到插入 rec 記錄的事務(wù) ID    trx_id = lock_clust_rec_some_has_impl(rec, index, offsets);    // 判斷事務(wù)是否處于活躍狀態(tài)    // 如果事務(wù)是活躍狀態(tài),返回事務(wù)的 trx_t 對(duì)象    // 如果事務(wù)已提交,返回 nullptr    trx = trx_rw_is_active(trx_id, true);  } else { // 二級(jí)索引    ...  }  if (trx != nullptr) {    ulint heap_no = page_rec_get_heap_no(rec);    ...    // 如果事務(wù)是活躍狀態(tài)    // 把 rec 記錄上的隱式鎖轉(zhuǎn)換為顯式鎖    lock_rec_convert_impl_to_expl_for_trx(block, rec, index, offsets, trx,                                          heap_no);  }}

InnoDB 主鍵索引的記錄中,都有一個(gè)隱藏字段 DB_TRX_ID。

lock_rec_convert_impl_to_expl() 先調(diào)用lock_clust_rec_some_has_impl()讀取主鍵索引中即將被刪除記錄的 DB_TRX_ID 字段。

然后調(diào)用trx_rw_is_active()判斷 DB_TRX_ID 對(duì)應(yīng)的事務(wù)是否處于活躍狀態(tài)(事務(wù)未提交)。

如果事務(wù)處于活躍狀態(tài),調(diào)用lock_rec_convert_impl_to_expl_for_trx()把 rec 記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

// storage/innobase/lock/lock0lock.ccstatic void lock_rec_convert_impl_to_expl_for_trx(...){  ...  {    locksys::Shard_latch_guard guard{UT_LOCATION_HERE, block->get_page_id()};    ...    trx_mutex_enter(trx);    ...    // 判斷事務(wù)的狀態(tài)不是 TRX_STATE_COMMITTED_IN_MEMORY    if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) &&        // heap_no 對(duì)應(yīng)記錄上沒有顯式的排他鎖        !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, trx)) {      ulint type_mode;      // 加鎖粒度:記錄(LOCK_REC)      // 加鎖模式:寫鎖(LOCK_X)      // 加鎖的精確模式:記錄(LOCK_REC_NOT_GAP)      type_mode = (LOCK_REC | LOCK_X | LOCK_REC_NOT_GAP);      lock_rec_add_to_queue(type_mode, block, heap_no, index, trx, true);    }    trx_mutex_exit(trx);  }  trx_release_reference(trx);  ...}

lock_rec_convert_impl_to_expl_for_trx() 也不會(huì)照單全收,它還會(huì)進(jìn)一步判斷:

事務(wù)狀態(tài)不是TRX_STATE_COMMITTED_IN_MEMORY,因?yàn)樘幱谶@個(gè)狀態(tài)的事務(wù)就算是已經(jīng)提交成功了,已提交成功的事務(wù)修改的記錄不包含隱藏式鎖邏輯,也就不需要把隱式鎖轉(zhuǎn)換為顯式鎖了。記錄上沒有顯式的排他鎖。

滿足上面 2 個(gè)條件之后,才會(huì)調(diào)用lock_rec_add_to_queue()創(chuàng)建鎖對(duì)象(RecLock)并加入到全局鎖對(duì)象的 hash 表中,這就最終完成了把主鍵索引中即將被刪除記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

(5)主鍵索引記錄的鎖轉(zhuǎn)移

主鍵索引中即將被刪除記錄上的顯式鎖,只是個(gè)過渡,它是用來為鎖轉(zhuǎn)移做準(zhǔn)備的。

不管是樂觀刪除,還是悲觀刪除,刪除剛插入到主鍵索引的記錄之前,需要把該記錄上的鎖轉(zhuǎn)移到它的下一條記錄上,轉(zhuǎn)移操作由lock_update_delete()完成。

// storage/innobase/lock/lock0lock.ccvoid lock_update_delete(const buf_block_t *block, const rec_t *rec) {  ...  if (page_is_comp(page)) {    // 獲取即將被刪除的記錄的編號(hào)    heap_no = rec_get_heap_no_new(rec);    // 獲取即將被刪除記錄的下一條記錄的編號(hào)    next_heap_no = rec_get_heap_no_new(page + rec_get_next_offs(rec, true));  } else {    ...  }  ...  /* Let the next record inherit the locks from rec, in gap mode */  // 把即將被刪除記錄上的鎖轉(zhuǎn)移到它的下一條記錄上  lock_rec_inherit_to_gap(block, block, next_heap_no, heap_no);  ...}

lock_update_delete() 調(diào)用rec_get_heap_no_new()獲取即將被刪除記錄的下一條記錄的編號(hào),然后調(diào)用lock_rec_inherit_to_gap()把即將被刪除記錄上的鎖轉(zhuǎn)移到它的下一條記錄上。

// storage/innobase/lock/lock0lock.ccstatic void lock_rec_inherit_to_gap(...){  lock_t *lock;  ...  // heap_no 是主鍵索引中即將被刪除的記錄編號(hào)  for (lock = lock_rec_get_first(lock_sys->rec_hash, block, heap_no);       lock != nullptr; lock = lock_rec_get_next(heap_no, lock)) {    /* Skip inheriting lock if set */    if (lock->trx->skip_lock_inheritance) {      continue;    }    if (!lock_rec_get_insert_intention(lock) &&        !lock->index->table->skip_gap_locks() &&        (!lock->trx->skip_gap_locks() || lock->trx->lock.inherit_all.load())) {      lock_rec_add_to_queue(LOCK_REC | LOCK_GAP | lock_get_mode(lock),                            heir_block, heir_heap_no, lock->index, lock->trx);    }  }}

for 循環(huán)中,lock_rec_get_first() 獲取主鍵索引中即將被刪除記錄上的鎖。

能否獲取到鎖,取決于前面的row_convert_impl_to_expl_if_needed()是否已經(jīng)把記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

row_convert_impl_to_expl_if_needed()會(huì)對(duì)多個(gè)條件進(jìn)行判斷,以決定是否把記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。其中,比較重要的判斷條件是事務(wù)隔離級(jí)別:

如果事務(wù)隔離級(jí)別是READ-COMMITTED,隱式鎖不轉(zhuǎn)換為顯式鎖。如果事務(wù)隔離級(jí)別是REPEATABLE-READ,再結(jié)合其它判斷條件,決定是否把隱式鎖轉(zhuǎn)換為顯式鎖。

我們以測試表和示例 SQL 為例,來看看lock_rec_inherit_to_gap()的執(zhí)行流程。

示例 SQL 執(zhí)行于REPEATABLE-READ隔離級(jí)別之下,并且滿足其它判斷條件,row_convert_impl_to_expl_if_needed()會(huì)把記錄上的隱式鎖轉(zhuǎn)換為顯式鎖。

所以,lock_rec_get_first() 會(huì)獲取到主鍵索引中即將被刪除記錄上的鎖,并且 for 循環(huán)中的第 2 個(gè)if 條件成立,執(zhí)行流程進(jìn)入 if 分支。

對(duì)于示例 SQL,即將被刪除記錄的下一條記錄是supremum,調(diào)用 lock_rec_add_to_queue() 把即將被刪除記錄上的鎖轉(zhuǎn)移到supremum記錄上。

接下來,介紹 lock_rec_add_to_queue() 代碼之前,我們先看一下傳給該方法的第 1 個(gè)參數(shù)的值。

lock_get_mode() 會(huì)返回即將被刪除記錄上的鎖:LOCK_REC_NOT_GAP | LOCK_REC | LOCK_X。

第 1 個(gè)參數(shù)的值為:LOCK_REC | LOCK_GAP | lock_get_mode(lock)。

把 lock_get_mode() 的返回值代入其中,得到:LOCK_REC | LOCK_GAP | LOCK_REC_NOT_GAP | LOCK_REC | LOCK_X。

去重之后,得到傳給 lock_rec_add_to_queue() 的第 1 個(gè)參數(shù)(type_mode)的值:LOCK_REC | LOCK_GAP | LOCK_REC_NOT_GAP | LOCK_X。

// storage/innobase/lock/lock0lock.ccstatic void lock_rec_add_to_queue(ulint type_mode, ...) {  ...  // 對(duì) supremum 偽記錄進(jìn)行特殊處理  if (heap_no == PAGE_HEAP_NO_SUPREMUM) {    ...    // 去掉 LOCK_GAP、LOCK_REC_NOT_GAP    type_mode &= ~(LOCK_GAP | LOCK_REC_NOT_GAP);  }  ...  // 實(shí)例化鎖對(duì)象  RecLock rec_lock(index, block, heap_no, type_mode);  ...  // 把鎖對(duì)象加入全局鎖對(duì)象 hash 表  rec_lock.create(trx);  ...}

type_mode 就是 lock_rec_inherit_to_gap() 函數(shù)中傳過來的第 1 個(gè)參數(shù),它的值為:LOCK_REC | LOCK_GAP | LOCK_REC_NOT_GAP | LOCK_X。

對(duì)于示例 SQL,即將被刪除記錄的下一條記錄是supremum,執(zhí)行流程會(huì)命中if (heap_no == PAGE_HEAP_NO_SUPREMUM)分支,執(zhí)行代碼:type_mode &= ~(LOCK_GAP | LOCK_REC_NOT_GAP)。

從 type_mode 中去掉LOCK_GAP、LOCK_REC_NOT_GAP,得到LOCK_REC | LOCK_X,表示給 supremum 加 next-key 排他鎖。

5、總結(jié)

REPEATABLE-READ 隔離級(jí)別下,如果插入一條記錄,導(dǎo)致唯一索引沖突,執(zhí)行流程如下:

插入記錄到主鍵索引,成功。插入記錄到唯一索引,沖突,插入失敗。給唯一索引中沖突的記錄加鎖。對(duì)于 load datafile replace、replace into、insert ... on duplicate key update 語句,加排他鎖(LOCK_X)。對(duì)于其它語句,加共享鎖(LOCK_S)。把主鍵索引中對(duì)應(yīng)記錄上的隱式鎖轉(zhuǎn)換為顯式鎖[Not RC]。把主鍵索引記錄上的顯式鎖轉(zhuǎn)移到它的下一條記錄上[Not RC]。刪除主鍵索引記錄。

順便說一下,對(duì)于 READ-COMMITTED 隔離級(jí)別,大體流程相同,不同之處在于,它沒有上面流程中打了[Not RC]標(biāo)記的兩個(gè)步驟。

對(duì)于示例 SQL,READ-COMMITTED 隔離級(jí)別下,不會(huì)給主鍵索引的 supremum 記錄加鎖,加鎖情況如下:

最后,把示例 SQL 在 REPEATABLE-READ 隔離級(jí)別下的加鎖情況放在這里,作個(gè)對(duì)比:

本文轉(zhuǎn)載自微信公眾號(hào)「一樹一溪」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系一樹一溪公眾號(hào)。

關(guān)鍵詞:

相關(guān)新聞

Copyright 2015-2020   三好網(wǎng)  版權(quán)所有 聯(lián)系郵箱:435 22 640@qq.com  備案號(hào): 京ICP備2022022245號(hào)-21
十八禁黄色免费污污污亚洲| 色999日韩偷自拍拍免费| 一区二区三区国产在线成人av| 日韩三级精品电影久久久久| 狂操鸡巴小骚逼视频免费观看| 亚洲午夜熟女在线观看| 亚洲熟女一区二区六区| 天天看片天天摸天天操| 99久久国语露脸国产精品| 老司机免费视频福利0| 免费看超污视频在线观看| 一区二区三区国产在线成人av| 精品国模一区二区三区欧美| 91九色91在线视频| 污网址在线观看视频| 国产成人情侣激情视频| 亚洲蜜桃久久久久久| 日本欧美视频在线免费| 一区二区三区av免费天天看| 97人妻av人人澡人人爽| 亚洲宅男噜噜噜66在线观看| 亚洲第一区av中文字幕| 岳的大肥屁熟妇五十路| 美女扒开逼逼给你看| 国产男女无套?免费网站下载| 欧美一区二区三区爽爽| 狠狠操狠狠操狠狠插| 亚洲永远av在线播放| 欧美最新一区二区三区| 免费在线观看视频啪啪| 2021国产剧情麻豆| 国产精品美女免费视频观看| 荣立三等功退休有什么待遇| 91九色91在线视频| 中文字幕 中文字幕 亚洲| 中文字幕熟女乱一区二区| 不卡一二三区别视频| 色网站在线观看免费| 亚洲熟女乱一区二区精品成人 | 偷拍熟女大胆免费视频| 久久免费视频ww一区| 夜夜躁av麻豆男| 美女福利视频一区二区三区四区| 熟女人妻精品视频一区| 日本韩国欧美在线视频| 日本一区二区三区的资源| 91porny九色视频偷拍| 91九色国产在线视频| 国产91精品福利系列| 久久无码高清免费视频| www一区二区91| 亚洲成年人精品国产| 九九热精品视频在线播放| 最新国产精品拍在线观看| 国产自拍偷拍视频在线免费观看| 国产漂亮白嫩美女在线图片| 免费在线观看视频啪啪| 亚洲男人的天堂最新网址| 美女激情久久久久久久| 亚洲一区二区三区国产精品电影| 日韩国产欧美久久一区| av资源中文字幕在线观看| 欧美情色av在线观看| 中国特黄色性生活片| 日本东京热最新中文字幕| 国产福利三级在线观看| 一区二区三区不卡免费视频网站| 免费在线小视频你懂的| 日韩在线 中文字幕| 国色天香一二三期区别大象| 男女啪啪啪啪91av日韩| 99久久人人爽亚洲精品美女| 欧美最新一区二区三区| 性感美女极品18禁网站在线| 欧美啪啪一区二区三区| av福利免费体验观看| 中文字幕在线观看av观看| 不卡一区二区视频在线| 青娱乐这里只有精品| 涩涩黄片在线免费观看| 干逼又爽又黄又免费的视频| 国内精品一区二区2021在线| 中文字幕 首页 人妻| 人妻中文字幕亚洲在线 | 99久久人人爽亚洲精品美女| 亚洲一区亚洲二区成人福利| 国际日韩日韩日韩日韩日韩| 韩国资源视频一区二区三区| 青青青青午夜手机国产视频| 东京热日韩av影片| 欧美成人红桃视频在线观看| 松本菜奈实最新av在线| 丰满少妇高潮喷水视频| 熟女阿高潮合集一区二区| 黄很色很在线免费视频网站| 日韩无码国产一区二区| 日韩人妻精品久久久久| tobu8日本高清| 丰满少妇_区二区三区| 68福利精品在线视频| 手机视频在线观看一区| 日日夜夜免费视频精品| 人妻系列中文字幕大乳丰满人妻| 亚洲在线免费观看18| 亚洲色视频在线播放网站| 男人和女人的逼视频| 91 精品视频在线看| 99久久久久久久久久久久久| 黄色片黄色片黄色片黄色片黄色| 2026天天操天天干| 人妻在线中文视频视频| 强乱人妻中文字幕日本| 亚洲美女午夜激情视频在线观看| 精品人妻人人做人人爽| 自拍偷拍亚洲综合第一页| 视频在线+欧美十亚洲曰本 | 国产精品午夜无码AV体验区| 亚洲免费午夜污福利| av大尺度一区二区三区| 免费的啪啪视频软件| 妈妈的朋友中字在线免费观看| 日本人妻熟妇丰满成熟HD系列| 68视频在线免费观看| 精品一区二区三区免费毛片W| 欧美成人短视频在线播放| 日韩黄色在线观看网站上| 熟女国内精品一区二区三区| 亚洲永远av在线播放| av在线男人的天堂亚洲| 综合久久伊人久久88| 日本免费人爱做视频在线观看不卡 | 蜜臀一区二区日韩美女少妇视频| 成人资源中文在线观看| 天天透天天舔天天操| 亚洲欧美日韩中文视频| 一区二区三区av免费天天看| 天天看天天爱天天日| 国产资源在线观看二区| 国产漂亮白嫩美女在线图片 | 国产精品黄色片大全| 国产亚洲综合5388| 亚洲欧美不卡专业视频| 欧美黑人1区2区3区| 日本韩国福利在线播放| 911精产国品一二三产区区| 最新中文字幕久久久久| 女人扒开逼让男人操| 丰满人妻被猛烈进入中文字幕| 日韩少妇免费在线播放| 啊不行啊操逼好爽大鸡吧视频| 欧美一级aaaaaaa片| 91亚洲精品久久蜜桃| 免费绝清毛片a在线播放| 91麻豆精品国产在线| 91超碰九色porny| 亚洲国产精品自拍偷拍视频在线 | 日本五六十路熟女视频| 亚洲无人区乱码中文字幕一区| ass亚洲熟女ass| tobu8日本高清| 日韩无码国产一区二区| 另类欧美激情校园春色| 伊人网在线免费观看| 色屁屁一区二区三区在线观看| 亚洲综合色一区二区三区| 99色在线观看免费观看| 成人人妻h在线观看| 顶级欧美色妇xxxx| 97精品视频,全部免费| 99福利一区二区视频| 欧美性受黑人猛交裸体视频| 日韩美精品成人一区二区三区四区| 欧美黄色一区二区三区视频| 日本黄色一级电影网址| 中文字幕一区二区人妻视频| 色999日韩偷自拍拍免费| 在线视频自拍第三页| 99re这里是国产精品首页| av里面的动作是真进去吗 | 天天日天天亲天天操| 欧美色区国产日韩亚洲区| 新亚洲天堂男子av| 男女爱爱好爽视频免费看| 日本一道中文字幕99| 正在播放麻豆精品一区二区 | 欧美成人久久久桃色aa| 伊人精品成人综合网| 午夜精品久久久久久久精品乱码| 亚洲欧美国产一本综合首页| 日韩一级视频一区二区三区| 琪琪日本福利伦理视频| 日韩少妇免费在线播放| 午夜精品久久久久久久久久蜜桃| 精品日本少妇久久久| 美女妩媚午夜诱惑网站| 日韩人妻精品久久久久| 东京热日韩av影片| 60路70路日本熟妇| 亚洲一区二区在线视频观看免费| 亚洲韩精品一区二区三区| 九热精品视频在线观看| 91偷拍被偷拍在线播放| 91香蕉国产亚洲一二三区| a级黄片免费观看| 久久久国产精品免费视频网| 69视频在线精品国自产拍| 91精品91久久久久| 亚洲同性同志一二三专区| 亚洲欧美综合另类最新| 成人大片男人的天堂| 亚洲一区二区三区国产精品电影 | 亚洲图片另类综合小说| 69精品人妻久久久久久久久久久| 91大神在线免费观看视频| 天天日夜夜操人人爽| 亚洲免费在线不卡视频| 美国男的操女孩的小嫩逼| 东北老女人熟女啪啪视频| 干逼又爽又黄又免费的视频| 天天操天天日天天碰| 丰满少妇_区二区三区| 精品国产污污污污免费观看| xxxx69在线观看视频| 人妻免费视频黄片在线视频| 黄很色很在线免费视频网站| 久久一级片三上悠亚| 午夜精品久久秘?18免费观看| 69国产精品成人aaaaa片| 男人的天堂av中文字幕| 国产91免费在线观看| 国产精品igao为爱寻找激情| 91人妻人人爽色啊啊啊| 亚洲精品综合欧美精品综合| 天天摸天天干夜夜操| 亚洲女人自熨在线视频| avtt中文字幕手机版| 人妻激情偷乱一区二区三区av| 91九色人妻在线播放| 亚洲第一成年偷拍视频| 欧美一级特黄大片做受99| 91人妻人人做人人爽高清| 2020国产成人精品视频| julia人妻av一区二区三区| 亚洲乱熟女一区二区三区山| 亚洲欧美韩国日本一区二区| 午夜偷拍的视频久久久免费大全| 98热视频精品在线观看| 免费绝清毛片a在线播放| 国产福利小视频在线观看网站| 中文字幕精品人妻久久久久| www国产亚洲精品久久久| 农村大炕有肉大屁股熟妇| 熟女阿高潮合集一区二区| 亚洲av中文无码网站| 最近中文字幕免费视频一| 97精品国产91久久久| 久久精品四虎夜夜拍拍拍| 国模伊人久久精品一区二区三区| 日韩免费黄色片在线观看| 欧美性感美女热舞视频| 骚穴被阴茎插免费视频| 加勒比不卡在线视频| 欧美亚洲国产一区二区| www,日韩av,com| 久久午夜免费鲁丝片| 国产激情视频在线观看的| 亚洲国产精品久久久久久无码| 欧美第一激情综合网欧美激情| 中文字幕亚洲乱码精品无限| 一区二区三区五区六区| 最新日韩中文字幕啪啪啪| 在线中文字幕人妻av| 中文字幕观看中文字幕免费 | 久久久国产精品免费视频网| 久久精品国产亚洲av热软件| 蜜臀一区二区日韩美女少妇视频| 国语对白性爱三级片免费看| 九色porny91国产| 亚洲午夜精品视频节目| 日韩美精品成人一区二区三区四区| 亚洲欧美一级特黄大片| 亚欧洲乱码视频一二三区| 亚洲乱熟女一区二区三区山| 日韩一级欧美一级片| 91精品国产成人久久久久久| 国产激情免费在线视频| 男生用大肌巴操美女骚穴| 亚洲欧美另类丝袜另类自拍| 懂色av之国产精品| 奇米网首页神马久久| 东京热日韩av在线| 福利美女视频在线观看| 国产精品视频网站污污污| 青青操天堂在线观看视频| 自拍偷拍视频亚洲一区| 男人av一区二区三区| 人妻超清中文字幕在线乱码| 国语精品视频自产自拍| 美女把逼扒开让男人桶| 中文字幕观看中文字幕免费 | 天堂av国产av伦理av| 九十九步都是爱最后一步是尊严| 国产精品久久久久精品三级18| 午夜精品小视频在线播放 | 天天摸天天干夜夜操| 啪啪啪网站免费看视频| 日本不卡 中文字幕| 一区二区三区av免费天天看| 又爽又粗又猛又色又黄视频| 成人免费电影二区三区| 天天干天天操天天日天天日| 蜜桃臀少妇白色紧身裤细高跟| 国产精品网站亚洲发布| 4438全国成人免费视频| 麻豆国产精品777777在| 99久久久久久久久久久久久| 夜夜躁av麻豆男| 2021国产剧情麻豆| 夜夜人人干人人爱人人操| 911精产国品一二三产区区| 天天综合久久无人区| 一区二区三区五区六区| 欧美成人红桃视频在线观看| 亚洲中文字幕在线视频观看二区 | 看女人大BB群伦交| 91美女在线观看视频| 黑吊操欧美极品美女| av 一区二区三区 熟女| 亚洲成人五月婷婷久久综合| 911精产国品一二三产区区| 男女啪啪啪啪91av日韩| 欧美 日韩 精品 中文| 最近最新最好看的中文字幕| 伊人网在线免费观看| 美女把逼扒开让男人桶| 九九六视频,这里只有精品| 成人十欧美亚洲综合在线| 欧美日韩一区二区三区成人影院| 在线观看2022av| 99免费观看在线视频| 不卡一区二区视频在线| 日韩一级欧美一级片| 日本香港韩国三级黄色| 天天夜夜久久精品综合| 欧洲精品在线免费观看| 国产熟女五十路一区二区三区| 亚洲一区二区精品在线播放| v天堂国产精品久久| 天天干夜夜操夜夜骑| 精品欧美乱码久久久| 日本福利视频网站导航| 中文乱码字幕人妻熟女人妻| 国产精品igao为爱寻找激情| 68福利精品在线视频| av无限看熟女人妻另类av| 1区3区4区产品乱入视频| 东京热日本一区二区三区| ass亚洲熟女ass| avtt中文字幕手机版| 91色哟哟视频在线观看| 国产黄色主播网址大全在线播放 | 涩涩黄片在线免费观看| 在线观看中文字幕视频成人| 欧美啪啪一区二区三区| 黄版视频在线免费观看| 欧美成人久久久桃色aa| 免费在线观看视频啪啪| 最新国产午夜激情视频| 核xp工厂精品久久亚洲| 国产精品网站的黄色| 91色哟哟视频在线观看| 成人资源中文在线观看| 成人精品动漫一区二区| 日韩女同与成人用品电影免费看| 日韩三级精品电影久久久久| 91进入蜜桃臀在线播放| 亚洲国产美女主播在线观看| ysl蜜桃色7425| 亚洲欧美激情久久久| 夜夜操夜夜爱夜夜摸| 一区二区三区资源视频| 亚洲欧美日韩电影一区| 国产精品视频网站污污污| 国产精品成人免费电影| 久久久人妻免费视频| 中文字幕欧美人妻在线.| 国长拍拍视频免费孕妇| 操操操操操操操操操网| 国产成人91色精品免费看片| 在线人成视频免费观看尤物| 日韩一级欧美一级片| 日本黄页在线观看视频| 欧美男男在线观看视频网站| 欧美区日本区国产区| 日本高清 中文字幕| 男女啪啪啪啪91av日韩| 国产精品国产三级在线高清观看| 天天爽天天操天天插| 在线视频国产精品欧美| 女同大尺度视频网站在线观看| 久久亚洲国产成人精品麻豆 | 日韩久久九九精品视频| 中文字幕人妻精品精品| 国产做A爱免费视频在线观看| 日本高清久久人人爽| 欧美丝袜亚洲国产日韩| 大乳丰满人妻中文字幕韩国hd| 亚洲欧洲无码一区2区无码| 老司机免费视频福利0| 日本久久久久久黄色| 桃色成人开心激情网| 青青在线免费手机播放视频| 亚洲午夜精品一级毛片app| caopeng97在线观看视频| 中文人妻av一区二区三区| 黑人侵犯人妻森泽佳奈| 精久久久久久久久久久久| av成人三级高清日韩| 户外露出视频在线观看| 99久久久久久亚洲精品免费| 91色乱一区二区三区| 91精品一区一区三区| 自拍偷拍亚洲综合第一页| 欧美精品激情在线不卡| 七色福利视频在线观看| 日韩最近中文在线观看| 中文字幕 首页 人妻| 手机看片福利一区二区三区四区| 美女把腿张开给男的捅| 日本一区二区三区调教性奴视频| 操操操操操操操操操网| 中日韩又粗又硬又大精品| avgo成人短视频| av天堂hezyo| 大香焦一道本一区二区三区| 天天在线播放日韩av| 性感美女人妻久久久| av天堂a亚洲va天堂va里番| 熟妇人妻av无码中文字幕| 天天想要天天操天天干| 亚洲av毛片在在线播放| 东京热男人的天堂视频| 看女人大BB群伦交| 亚洲中文字幕无线乱码人妻精品 | 中出小骚货在线观看| 精品国产人伦一区二区三区| 亚洲黑人欧美二区三区| www一区二区91| 51精品视频在线免费观看| 9420高清视频在线观看国语版| 真人一进一出抽搐大尺度视频| 日本熟女0930视频| 青娱乐免费最新视频| 男人和女人的逼视频| 九十九步都是爱最后一步是尊严| 女人高潮潮呻吟喷水网站| ass亚洲熟女ass| 久久久久国产精品二区| 国产人妻熟女ⅹxx丝袜| 欧美第一激情综合网欧美激情| 日本一本午夜在线播放| 在线 激情 亚洲 视频| 又爽又粗又猛又色又黄视频| 美女激情久久久久久久| 精久久久久久久久久久久 | 99久久99九九九99九| 91精品久久久久久久99蜜月| 欧美大鸡吧男操女啊啊啊视频| 欧美一区二区三区爽爽| 超碰在线pro中文字幕| 999精品视频免费在线观看| 天天想要天天操天天干| 成人精品影视一区二区| 老司机在线视频福利观看| 亚洲综合色一区二区三区| 亚洲乱熟女一区二区三区山| 天天碰天天摸天天搞| av资源中文字幕在线观看| 亚洲制服丝袜资源网| 干逼又爽又黄又免费的视频| 伊人免费观看视频一| 桃色成人开心激情网| 欧美色视频网址大全| 欧美日韩高清片在线观看| 50熟妇一区二区三区| 亚洲精品国品乱码久久久久| 69久久夜色精品国产69乱电影| 美国十次了亚洲天堂网国产| 97人妻人人揉人人躁人人夜夜爽| 18岁禁一二三区免费体验| 午夜精品老牛av一区二区三区| 久久99国产中文丝袜| 免费中文字幕a级激情| 日韩av水蜜桃一区二区三区| 人妻少妇的va视频| 欧美区一区二区三视频| 9久re热视频在线精品| 东北老女人熟女啪啪视频| 亚洲精品色图1234| 天天干夜夜操91视频网站| 欧美性感美女热舞视频| 岳母的诱惑电影在线观看| 天天搞天天操天天干| 日本少妇三级交换做爰做| 91精品麻豆91夜夜骚| 99久久99九九九99九| av大尺度一区二区三区| 亚洲综合天堂av网站在线观看| av网页免费在线观看| 国产经典精品欧美日韩| 人人妻人人爽人人摸| 男人和女人的逼视频| 欧美性感美女热舞视频| 九九六视频,这里只有精品| 99久久99九九九99九| 欧美日韩福利视频网| 欧美亚洲另类精品第一页| 最新免费在线观看污视频| 91佛爷视频在线观看| 日本少妇人妻凌辱在线| 亚洲色图日韩在线视频观看| 午夜福利国产精品久久久久| 亚洲宅男噜噜噜66在线观看| 黑人3p日本女优中出| 免费成人av麻豆| 中字幕人妻熟女人妻a62v网| 午夜久久人妻一级内射av网址| 国产清纯一区二区在线观看| 熟女国内精品一区二区三区| 9662av在线视频| 成人午夜av电影网| 九一精品人妻一区二区三区| av在线中文字幕在线| 人妻被强av系列一区二区| 日韩欧美国产一区二区在线观看 | 一区二区在线观看视频观看| 黑人侵犯人妻森泽佳奈| 蜜臀一区二区日韩美女少妇视频| av在线免费在线观看| 国产美女视频带a∨黄色片| 欧美在线观看视频欧美| 九九视频在线观看全部| 99热这里只有精品免费播放| 91精品资源在线观看| 2020国产激情视频在线观看| 丰满少妇_区二区三区| 91porny九色视频偷拍| 青青在线视频看看| 天天操天天舔天天射天天日天天干 | 欧美日本在线免费视频| 天天透天天舔天天操| 亚洲中文字幕无线乱码人妻精品 | 久操资源在线免费播放| 天天早上头和脸出汗是怎么办| 青青青免费手机视频在线观看| av在线中文字幕在线| 天天日天天玩天天摸| av激情四射五月婷婷| 亚洲韩精品一区二区三区| 亚洲唯美激情综合四射| 人妻超清中文字幕在线乱码| 奇米网首页神马久久| 亚洲制服丝袜美腿在线| 日本美女爱爱视频网站| 欧美大胆a级视频秒播| 中文字幕亚洲无线乱码| 欧美精品激情在线不卡| 日本亚洲精品视频在线观看| av男人站在线观看| 国产中文亚洲熟女日韩| 超级黄肉动漫在线观看| 久久人妻诱惑我视频| 国产精品性感美女视频| 国产精品福利久久久久| 欧洲成熟女人色惰片| 日韩av水蜜桃一区二区三区| 97cao在线视频| 精久久久久久久久久久久| —区二区三区女厕偷拍| 97人妻在线视频自拍| 亚洲国产电影的一区| 国产精品中文字幕丝袜| 丝袜美女诱惑佐佐三上| 4438全国成人免费视频| 全国熟妇精品一区二区免费视频| 熟女人妻aⅴ一区二区三| 久久亚洲国产成人精品麻豆| 夜夜人人干人人爱人人操| 都市激情校园春色 亚洲| 中文字幕欧美人妻在线.| 有码一区二区三区四区五区| 欧美日韩精品aaa| 麻豆午夜激情在线观看| 人妻女侠被擒受辱记| 成人资源中文在线观看| 国产91九色视频在线观看| 1区3区4区产品乱入视频| 天天干天天色综合久久| 色视频在线播放免费观看| 最新日韩中文字幕免费在线观看| 亚洲天堂色综合久久| 96在线观看免费播放| 精品人妻在线激情视频| 欧美日本国产一区二区| 男人的天堂aⅴ在线| 天天干天天操天天日天天日| 亚洲宅男噜噜噜66在线观看| 精品国产污污污免费入口| 老牛影视在线一区二区三区| 性感美女人妻久久久| 欧美黄色性视频网站| 人妻中文字幕亚洲在线| 两个奶被揉得又硬又翘怎么回事 | 午夜8050免费小说| 青青草成人免费自拍视频| 91精品国产欧美在线| 伊人免费观看视频一 | 有码一区二区三区四区五区| tobu8日本高清| 亚洲综合熟女乱中文| 夏目彩春av在线看| 精品人妻 色中文熟女 oo| 午夜情色一区二区三区| 国产精品午夜无码AV体验区| 最近最新欧美日韩精品| 欧美亚洲另类精品第一页| 亚洲综合第一区二区| 免费在线观看黄色小网站| av天堂hezyo| 久久人人爽人人爽人人av东京热| 伊人精品成人综合网| 伊人久久综合国产精品 | 亚洲av三级电影在线观看| 国产夫妻视频在线观看免费| 美女网站视频久久精品| 可在线免费观看av| 亚洲欧美不卡专业视频| caopeng97在线观看视频| 日韩国产欧美一区二区三区粉嫩| av在线播放观看h| jizzjizz国产精品传媒| 91麻豆精品国产在线| 天天操天天日天天插天天舔| 3344永久在线观看视频下载| 大乳丰满人妻中文字幕韩国hd| xxoo福利视频导航| 日本男女免费福利视频| 午夜久久人妻一级内射av网址 | 一区二区在线观看视频网站| 女同性恋av在线播放| 男女啪啪啪网站在线观看免费| 青青操久久综合激情| 国产熟妇色xxⅹ交白浆视频| 大秀成年人国产精品视频| 亚洲熟女少妇中文字幕系列| 国产精品久久人人添| 神马不卡视频在线视频| 久久午夜免费鲁丝片| 日本丰满熟妇浓密多毛| 久久久人妻免费视频| 人妻在线中文视频视频| 天天日 天天舔 天天射| 69久久夜色精品国产69乱电影 | 成人做爰av在线观看网站| 国产资源网站在线播放| 国产熟妇色xxⅹ交白浆视频| 老司国产精品视频免费观看| 一区二区三区不卡免费视频网站| 5d蜜桃臀女无痕裸感| 98热视频精品在线观看| 亚洲一区视频中文字幕在线播放| 青青青免费手机视频在线观看| 少妇熟女天堂网av| 国产天堂av不卡网| 亚洲午夜精品视频节目| 9久re热视频在线精品| 精品美女洗澡一区二区| 在线观看网站伊人网| 亚洲一区二区偷拍女厕所| 伊人久久综合国产精品| 亚洲欧美国产人成在线| 美女福利视频一区二区三区四区| 欧洲成熟女人色惰片| 3344永久在线观看视频下载| 日韩人妻中文字幕二区| 91久久精品美女高潮喷水白浆| 四虎国产精品国产精品国产精品| 中文字幕观看中文字幕免费 | 亚洲av日韩久久网站| 国产亚洲综合5388| 色老头一区二区三区四区五区 | 亚洲高清一区二区三区久久| 97精品人妻免费视频| 美女精品久久久久久久久| 老司国产精品视频免费观看| 天天操天天舔天天做| 福利在线国产小视频| 果冻麻豆一区二区三区| 黄片操操操操操操c| 夜夜躁婷婷av蜜桃妖| 精品久久久久久久久久久久久| 一区二区三区观看在线| 欧美日韩成人高清中文网| 青青青免费手机视频在线观看| 亚洲人人爽人人澡起碰av| 免费啪啪啪网站在线观看| 日本不卡视频一二三区| 在线视频国产精品欧美| 97成人老师在线视频| 大香蕉尹人在线最新| 老鸭窝在线毛片观看免费播放| 亚洲第一成年偷拍视频| 午夜美女福利视频在线| 中国精品人妻一区二区| 一区二区三区四区影片| 性感美女极品18禁网站在线| 好看的日本中文字幕在线观看二区| 午夜3p福利视频合集| 最新国产精品综合网高清| 日韩av水蜜桃一区二区三区| 日本熟女0930视频| 新亚洲天堂男子av| avjpm亚洲伊人久久| 一区二区在线观看视频网站| 蜜乳av一区二区三区免费观看| 夜夜爽夜夜操夜夜爱| 精品不卡一区二区三区| 国产成人av在线你懂得| av在线中文字幕在线| 2018中文字字幕人妻| 最新日韩中文字幕免费在线观看 | 中文字幕久久久国产| 亚洲乱码av一区二区蜜桃av | 亚洲精品一区二区gif| 亚洲乱熟女一区二区三区山| 91九色91在线视频| 女人的天堂av在线网| 国产精品乱码高清在线观看h| 国产igao激情在线视频入口| av资源中文字幕在线观看| 日本清纯中文字幕版| 91超碰国产在线观看| 久久99热精品免费观看视| 天天插天天干天天狠| 色狠狠色综合久久久绯色| 欧美大鸡吧男操女啊啊啊视频| 亚洲自拍偷拍一区二区中文字幕| 天天操天天舔天天射天天日天天干 | 97香蕉久久国产超碰| 久久久久久a女人处女| 男人的天堂在线2025| 白白色在线免费视频发布视频| 日本少妇人妻凌辱在线| 国产av高清二区三区| 男人的天堂在线2025| 麻豆国产精品777777在| 新亚洲天堂男子av| 日韩国产欧美久久一区| 亚洲avav天堂av在线网毛片| 国际日韩日韩日韩日韩日韩| av男人站在线观看| av 资源在线播放| 亚洲美女黄色福利视频网站大全| 亚洲精品久久久人妻| 久草久热这里只有精品| 男生用大肌巴操美女骚穴| 日韩av熟妇在线观看| 亚洲人人爽人人澡起碰av| 午夜在线成人免费电影| 5d蜜桃臀女无痕裸感| 国产视频1区2区3区| 欧美一区二区三区视频看| 神马不卡视频在线视频| 久久国产精品久精国产爱| 国产成人91色精品免费看片| 青青操久久综合激情| 国产激情视频在线观看的| 婷婷一区二区三区五月丁| 久久久视频在线播放| 国产激情一区二区视频| 大乳人妻一区二区三区| av大尺度一区二区三区| 99久久国产精品免费热| 夜夜躁av麻豆男| 人人妻人人爽人人爽欧美一区| 大尺度av毛片在线网址| 日本高清有码在线视频| 亚洲av在线免费播放| 97精品视频,全部免费| 日本不卡 中文字幕| 乱子伦国产一区二区三区| 911美女片黄在线观看| 日本不卡 中文字幕| av 一区二区三区 熟女| 精品av天堂毛片久久久| av在线男人的天堂亚洲| 亚洲 自拍 激情 另类| 超碰在线免费观看视频97| 91麻豆精品国产在线| 2026天天操天天干| 中文字幕福利视频在线一区| 最新免费在线观看污视频| 国产高清视频www夜色资源| 老司国产精品视频免费观看| 欧美成人久久久桃色aa| 九九六视频,这里只有精品 | 欧美国产精品久久久免费| 国产夫妻视频在线观看免费| 亚洲综合天堂av网站在线观看 | 凹凸视频一区二区在线观看 | 裸日本资源在线午夜| 亚洲av中文免费在线| 国产精品久久久久久成人久| 全彩漫画口工18禁| 91九色pony蝌蚪| 亚洲欧美成人激情在线| 黄在线看片免费人成视频| 天天干天天操天天日天天日| 亚洲一区二区偷拍女厕所| 亚洲 综合 欧美 一区| 91精品视频在线观看视频| 最新国产精品拍在线观看| 一区二区三区免费版在线| 亚洲一区视频中文字幕在线播放| 国产极品气质外围av| 亚洲国产电影的一区| 亚洲最大的自拍偷拍网| 国内精品一区二区2021在线| 女生裸体视频免费网站| 天天在线播放日韩av| 老熟妇一区二区三区v∧88| 青青青在线视频免费播放| 天天操天天射天天操天天日| 欧美在线观看视频欧美| 国产精品免费看一区二区三区| 大鸡扒操大逼大片免费关看| 黄版视频在线免费观看| av中文字幕国产精品| 精品一区二区三区喷水内射高潮 | 91精品视频在线观看视频| 久久人妻诱惑我视频| 日韩加勒比精品在线看| 在线免费视频999| 青青青青午夜手机国产视频| 午夜国产成人精品视频观看| 色就色综合偷拍区欧美在线| 亚洲欧美国产一本综合首页| 亚洲自拍偷拍一区二区中文字幕| 熟妇高潮久久久久久久| 欧美日韩高清片在线观看| 欧美一级日韩一级亚洲一级va| 日本人妻熟妇丰满成熟HD系列| 99国产精品久久99久久久| 亚洲成人动漫av在线| 中文字幕熟女人妻丝袜丝在线| alisontyler和黑人| 欧美区日本区国产区| 国产av在线免费视频| 不卡视频在线 欧美日韩| 顶级欧美色妇4khd| 在线有码人妻自拍视频| 中文人妻av一区二区三区| 乌克兰美女操逼高清内射视频| 九九九九九久久久国产 | 性色蜜桃臀x88av天美传媒| 4438全国成人免费视频| 宅男噜噜噜66国产在线观看| 久久久久国产精品二区| 天天看片天天摸天天操| 美国十次了亚洲天堂网国产| 国产成人综合久久婷婷| 港台美女明星av天堂| 2020国产成人精品视频| 九九热视频1这里只有精品| 人妻人妻在线视频网站| 琪琪日本福利伦理视频| 自拍偷自拍亚洲精品10p| 欧美 日韩 精品 中文| 亚洲第一成年偷拍视频| 一区二区在线观看视频网站| 天天躁狠狠躁狠狠躁性色| 亚洲黑人欧美二区三区| 精品美女洗澡一区二区| 日韩人妻中文字幕区| 亚洲成人中文无码在线| 91在线九色porny| 中出小骚货在线观看| 色哟哟亚洲乱码国产乱码精品精| 亚洲美女露隐私av一区二区精品| 人妻激情综合久久久久蜜桃| 欧美精品乱码99久久蜜桃免费| 亚洲少妇视频在线观看| 岛国av成人午夜高清| 亚洲精品9999蜜桃| 亚洲春色av中文字幕| 欧美精品一区二区三区观看| 可以免费观看日韩av| 91精品视频在线观看视频| 蜜臀一区二区日韩美女少妇视频| v天堂国产精品久久| av中文字幕国产精品| 五月天色婷婷狠狠爱| 日本不卡 中文字幕| 欧美日韩精品aaa| 人妻熟女 亚洲 一页二页| 国产高清在线观看av| 亚洲一区视频中文字幕在线播放 | 日本有码精品一区二区三区| 欧美第一激情综合网欧美激情| 国长拍拍视频免费孕妇| 欧美精品一区二区三区观看| 亚洲女人自熨在线视频| 亚洲一区二区在线激情| 天天干夜夜撸天天操| avtt中文字幕手机版| 日本香港韩国三级黄色| 欧美视频免费观看777| 91 精品视频在线看| 中文字幕熟女乱一区二区| 天天曰天天摸天天爽| 欧美国产精品久久久免费| 欧美日韩黄片免费在线观看| 日本一本午夜在线播放| 午夜一区二区三区视频在线观看| 91九色91在线视频| 黄色片黄色片黄色片黄色片黄色| 夜夜人人干人人爱人人操| 9999久久久久老熟妇二区| 亚洲国产精品 久久久| 人妻免费视频黄片在线视频| 2020国产成人精品视频| 天天日夜夜操人人爽| 69精品人妻久久久久久久久久久 | 免费在线观看黄色小网站| 黑人黄色免费一级av| 中文字幕久久久国产| 国产精品网站亚洲发布| 强乱人妻中文字幕日本| 视频在线 一区二区| 首页欧美日韩中文字幕| avgo成人短视频| 91色老久久精品偷偷蜜臀| 久草久热这里只有精品| 亚洲在线免费观看18| 97香蕉久久国产超碰| 丝袜美腿日韩av一区| 国产探花自拍亚洲av| 在线免费视频999| 欧美黑人性猛交小矮人| 亚洲成人偷拍自拍在线| 国际精品熟女一区二区| 男女插鸡巴视频软件| 久久精品国产亚洲av热软件| 亚洲欧美精品日韩偷拍| 天天透天天舔天天操| 亚洲avav天堂av在线网毛片| 日本午夜福利免费在线播放| 亚洲综合一区二区三区四区| 中文字幕欧美人妻在线.| 92麻豆一区二区三区| 欧美成人屋影院在线视频观看| 91超碰九色porny| 青娱乐免费视频一二三| 天天看天天爱天天日| 日韩加勒比精品在线看| 69视频在线精品国自产拍| 另类欧美激情校园春色| 亚洲欧美激情国产综合久久久| 精品不卡一区二区三区| 中文字幕麻绳捆绑的人妻| 国产精品成人免费电影| 欧美黄色性视频网站| 亚洲精品激情视频在线观看| 亚洲综合另类欧美久久| 亚洲人妻系列在线视频| 亚洲综合熟女乱中文| 精品精品精品精品精品污污污污| 青青操91美女国产| 亚av一二三在线观看| 99999久久久精品| 亚洲熟女人妻自拍在线视频| 国产成人91色精品免费看片| 久久视频 在线播放| 2021国产在线视频| 亚洲高清免费在线观看视频| 全彩漫画口工18禁| 91精品资源在线观看| 啪啪啪网站免费在线看| 超peng视频在线免费播放97| 亚洲熟妇丰满多毛xxxx网站| 手机看片1024精品国产| 自拍偷拍亚洲综合第一页| 精品高潮呻吟久久av| 亚洲综合天堂av网站在线观看| 2026天天操天天干| 蜜乳av一区二区三区免费观看| 亚洲成人五月婷婷久久综合| 九色91操最新在线观看网址| xxoo福利视频导航| 日韩久久九九精品视频| 一区二区三区av免费天天看| avtt中文字幕手机版| www国产亚洲精品久久久| 五月的婷婷综合视频| 新亚洲天堂男子av| 欧美成人短视频在线播放| 日韩免费黄色片在线观看| 91人妻人人做人人爽高清| 国产精品中文字幕丝袜| 青青青在线视频观看97| 国产男人的天堂一区| 欧美一级特黄大片在线| 亚洲欧美一级特黄大片| 成人av在线视频免费| 嗯~嗯~啊啊啊~高潮了软件| 快进来插我的逼嗯啊视频| 羞羞漫画无限免费观看秋蝉| 五十岁熟妇高潮喷水| 国产自拍偷拍视频在线免费观看 | 亚洲在线观看中文字幕av| 亚洲人精品午夜射精日韩| 美女网站视频久久精品| 亚洲在线观看中文字幕av| 4日日夜夜精品视频免费| 放荡人妻极品少妇全集| 天天操天天干天天舔天天| 538欧美在线观看一区二区三区| 久久久亚洲熟女一区二区| 亚洲天堂色综合久久| 狠狠操深爱婷婷综合一区| 松本菜奈实最新av在线| 午夜美女福利视频在线| 中国精品人妻一区二区| 360偷拍蜜桃臀69式| 青青操久久综合激情| 一二三四区国产在线观看| 久久久久久免费观看av| 天天看天天爱天天日| 日韩黄色在线观看网站上| yellow在线亚洲精品一区| 夜夜爽夜夜操夜夜爱| 亚洲精品激情视频在线观看| 国产中文亚洲熟女日韩| 午夜福利片无码10000| 中文字幕熟女乱一区二区| 人妻熟女 亚洲 一页二页| 男生和女生羞羞91在线看| 大乳人妻一区二区三区| av福利免费体验观看 | 麻豆午夜激情在线观看| 视频免费在线观看网站| 精产国品一二三产品区别91| 午夜国产成人精品视频观看| 欧美久久蜜臀蜜桃资源吧| 97香蕉久久国产超碰| 干逼又爽又黄又免费的视频| 亚洲av三级电影在线观看| 亚洲制服丝袜网站中文字幕| 国产成人av在线你懂得| 成年人免费福利在线| 5566熟女人妻人妻| 欧美成人少妇人妻精品| 自拍偷自拍亚洲精品10p| 一区二区三区四区 在线播放| 99999久久久精品| 凹凸视频一区二区在线观看| 久久内射天天玩天天懂色| 亚洲高清一区二区三区久久| 高潮喷水在线视频观看| 在宿舍强奷两个清纯校花| 91精品夜夜夜一区二区蜜桃| 免费的啪啪视频软件| 久久久久久久岛国免费观看| 国产午夜在线播放视频| 亚洲熟女乱一区二区精品成人| 亚洲乱码av一区二区蜜桃av| 午夜国产成人精品视频观看| 中文字幕熟女人妻一区| 女人扒开逼让男人操| 欧美精品999不卡| 精品人妻 色中文熟女 oo| 天天夜夜久久精品综合| 成人大片男人的天堂| 国产自拍偷拍视频在线免费观看| 久久久久久久岛国免费观看| 国产精品内射婷婷一级| 国产精品久久久久久成人久| av激情四射五月婷婷| 欧美成人少妇人妻精品| 午夜久久久久欠久久久久| 综合久久伊人久久88| 大秀成年人国产精品视频| 色网站在线观看免费| 精品av天堂毛片久久久| 99999久久久精品| 91超碰九色porny| 午夜92福利1000| 欧美最新一区二区三区| 一二区二区不卡视频| 男插女视频大全免费| 欧美黄色性视频网站| 国产黑色丝袜 在线日韩欧美| 久久国产精品久精国产爱| 92午夜免费福利视频www| 天天插天天透天天爽| 欧美三区四区在线视频| 2021国产剧情麻豆| 在宿舍强奷两个清纯校花| 国产 少妇 一区二区| 午夜在线成人免费电影| 亚洲av综合av一去二区三区| 天堂网免费在线电影| 日韩一级视频一区二区三区| 99久久99九九九99九| 凹凸视频一区二区在线观看| 欧美熟女xx00视频| 男女69视频在线观看免费| 亚洲最强的25个城市| 在线免费观看欧美小视频| 久久久久夜色国产精品电影| av人摸人人人澡人人超碰小说| 国产激情免费在线视频| 国产精品剧情在线亚洲| 网站在线观看蜜臀91| 成人精品影视一区二区| 91色老久久精品偷偷蜜臀| 无码人妻丰满熟妇区五路| 亚洲精品9999蜜桃| 精品免费一区二区三区四区视频| 日本小视频一区二区| 在线 激情 亚洲 视频| 91色老久久精品偷偷蜜臀| 国产中年夫妇激情高潮| 青青青在线观看国产| 啊~插得好快别揉我胸了视频| 中文字幕观看中文字幕免费 | 欧美性受黑人猛交裸体视频| 亚洲成人av在线一区二区| 色老头一区二区三区四区五区 | 午夜美女福利视频在线| 国产男人的天堂一区| 中文字幕中文字幕在线中…一区| 天天在线播放日韩av| 91精品一区一区三区| 久久99国产中文丝袜| 情趣视频在线观看91| 天海翼亚洲一区在线观看| 夜夜爽夜夜操夜夜爱| 免费在线小视频你懂的| 综合激情网,激情五月| 欧美男女一区二区三区| 亚洲va999天堂va| 99久9在线视频播放| 老熟妇一区二区三区v∧88| 一区二区三区国产在线成人av| 操烂你的骚逼天天欧美| 国产又粗又长又大视频| 99久久久久久亚洲精品免费| 亚洲另类激情视频在线看| 秋霞成人午夜鲁丝一区二区三区| 快色视频在线观看免费| 亚洲美女午夜激情视频在线观看| 99精品视频在线在线观看| 亚洲精品国品乱码久久久久| 国产av高清二区三区| 日本少妇人妻凌辱在线| 亚洲美女色www色| 超peng视频在线免费播放97| 日韩无码国产一区二区| 熟妇高潮久久久久久久| 日本不卡 中文字幕| 女人的天堂av在线网| 欧美成人性生活视频播放| 国产三级自拍视频在线观看网站| 东京热日韩av影片| 男女插鸡巴视频软件| 欧美情色av在线观看| 日本亚洲午夜福利一区二区三区| 又粗又长又硬又黄又爽| 天天日天天亲天天操| 亚洲国产综合久久精品| 欧美三区四区在线视频| 18在线观看免费观看| 亚洲av毛片在在线播放| 国产极品气质外围av| 欧美熟女xx00视频| av天堂新资源在线| 亚洲人人爽人人澡起碰av| 久草视频在线视频在线视频| 欧美区日本区国产区| 婷婷六月天在线视频| 快进来插我的逼嗯啊视频| 黄色片黄色片黄色片黄色片黄色| 久久国产半精品99精品国产| 久久无码高清免费视频| 久久午夜免费鲁丝片| 欧美激情视频第一页| 东京热日韩av在线| 国产精品久久人人添| 呻吟求饶的人妻中文字幕| 99久久国产精品免费消防器材| 免费在线观看黄色小网站| 182tv精品免费在线观看| 99精品视频在线在线观看| 国产天堂av不卡网| 男女啪啪啪网站在线观看免费| 亚洲少妇色小说综合| 亚洲精品综合欧美精品综合| 欧美成人少妇人妻精品| 天天摸天天干夜夜操| 中文字幕亚洲乱码精品无限| 亚洲精品中文字幕手机在线免费看| 亚洲激情噜噜噜久久久| 亚洲一区二区在线视频观看免费 | 网友自拍第一页99热| jizzjizz国产精品传媒| 人妻少妇精品二三区| 国产成人在线观看hd| yellow在线亚洲精品一区| 欧美vs亚洲vs日韩| 不卡高清一区二区三区| 亚洲熟妇丰满多毛xxxx网站| 日韩欧美国产一区二区在线观看| 中文字幕在线免费观看人妻 | 国际精品熟女一区二区| 欧美性感美女热舞视频| 全国熟妇精品一区二区免费视频| 91超碰九色porny| 欧美精品激情在线不卡| 99免费观看在线视频| 午夜福利在线不卡视频| 久久久久久免费观看av| 老司机伊人99久久精品| 操人妻人妻天天爽天天偷| 亚洲黄色成人一级片| 性感美女人妻久久久| 欧美激情视频第一页| 极品风骚人妻3p视频| av天堂新资源在线| 人妻在线中文视频视频| av丝袜免费在线观看| av天堂新资源在线| 亚洲宅男噜噜噜66在线观看| 亚洲成人五月婷婷久久综合| jizzjizz国产精品传媒| 亚洲少妇视频在线观看| 小妹妹爱大棒棒免费观看视频| 狠狠干狠狠操免费视频| 琪琪日本福利伦理视频| 伊人精品久久一区二区| 精品视频一区二区三区◇| 懂色av之国产精品| 68福利精品在线视频| 美女露阴道让男人捅| 18在线观看免费观看| 男女啪啪啪网站在线观看免费| 日本老女人日比视频| 亚洲乱码av一区二区蜜桃av| 久久99热精品免费观看视| 网站在线观看蜜臀91| 抽插小穴啊啊啊视频| 68福利精品在线视频| 熟女国内精品一区二区三区| 亚洲激情噜噜噜久久久| 日本四十路人妻熟女| 丰满少妇人妻一区二区三区蜜桃| 国模伊人久久精品一区二区三区| 黑人大巨屌操美女逼| 日韩精品视频一区二区三区在线| 亚洲午夜高清在线观看| 99色在线观看免费观看| 免费看一级高潮喷水片| 美国伦理片午夜理论片| 亚欧洲乱码视频一二三区| 加勒比东京热绿帽人妻多人操| 在线能看视频你懂的| 欧美日韩久久丝袜在线| 亚洲另类激情视频在线看| 中文字幕福利视频在线一区| 亚洲精品9999蜜桃| 国产91九色视频在线观看| 亚洲理论在线a中文字幕97| 国产成人深夜福利短视频99| 亚洲精品色图1234| 不卡在线一区二区三区| 大尺度av毛片在线网址| 亚洲欧美小说中文字幕| 91精品91久久久久| 高潮喷水一区二区三区| 亚洲欧美韩国日本一区二区| 一区二区九日韩美女| 黄色网络中文字幕日本| 女女抠逼白虎白丝袜| 第一福利视频在线观看| 福利小视频免费在线| 亚洲制服丝袜美腿在线| 黄色片黄色片黄色片黄色片黄色| 性感人妻 中文字幕| 天天做天天日天天搞| 黄色av日韩在线观看| 日本成人福利电影网| 91精品一区一区三区| 久久sm人妻中出精品一区二区| 欧美性感美女热舞视频| 99久久人人爽亚洲精品美女| 老牛影视在线一区二区三区| 福利在线国产小视频| 福利小视频免费在线| 97人妻在线视频自拍| 人妻激情综合久久久久蜜桃| 日韩美精品成人一区二区三区四区| 制服丝袜中文字幕熟女人妻| 五月的婷婷综合视频| 国产 亚洲 欧美 自拍| 色老头一区二区三区四区五区| 国产精品乱码高清在线观看h| 懂色av之国产精品| 亚洲欧美日韩中文在线观看| 丰满放荡熟妇在线播放| 中文字幕熟女人妻丝袜丝在线| 一区二区三区观看在线| 男女啪啪啪网站在线观看免费| 亚洲乱熟女一区二区三区山| 亚洲av中文无码网站| 中文字幕人妻精品精品| 青娱乐免费视频一二三| 蜜乳视频一区二区三区| 国产农村乱子伦精精品视频| 啊~插得好快别揉我胸了视频| 国内精品一区二区2021在线| 亚洲成人,国产精品| 欧美日韩国产在线中文字幕| 大乳人妻一区二区三区| 美国男的操女孩的小嫩逼| 91精品综合久久久久久五月天| 岳母的诱惑电影在线观看| 亚洲成人自拍图片网站| 欧美不卡一二三区精品| 92在线播放观看视频| 国产激情免费在线视频| 大陆中文字幕视频在线| 99热99这里免费的精品| av大尺度一区二区三区| 妈妈的朋友中字在线免费观看| 午夜精品视频免费观看 | 午夜美女福利视频在线| 亚洲成人三级黄色片| 亚洲码av一区二区三区| 干逼又爽又黄又免费的视频| 精品视频一区二区三区◇| 亚洲制服丝袜资源网| 亚洲国内精品久久久久久久| 瑟瑟干视频在线观看| 77亚洲视频在线观看| 亚洲国产综合久久精品| 亚洲 综合 欧美 一区| 在线视频国产精品欧美| 亚洲全国精品女人久久久| 国产精品网站亚洲发布| 亚洲在线观看中文字幕av| 日本高清 中文字幕| 夜夜骚av一二三区| 香港日本台湾经典三级| —区二区三区女厕偷拍| 亚洲美女色www色| 啊不行啊操逼好爽大鸡吧视频| 琪琪日本福利伦理视频| 天天日天天亲天天操| 精品国产无乱码一区二区三区| 日本福利片在线播放| 久久亚洲国产成人精品麻豆| 自拍丝袜国产欧美日韩| 国产精品无码无卡免费观| 最新福利二区三区视频| 一区二区三区五区六区| 91偷拍被偷拍在线播放| 不卡一区二区视频在线| 亚洲午夜国产末满十八岁勿进网站| 在线 制服 中文字幕 日韩| 中文在线字幕免费观看日韩视频| 久久午夜免费鲁丝片| 中文字幕日韩首页欧美在线激情| 日韩久久不卡免费视频| 亚洲av三级电影在线观看| 国产精品久久久久久成人久| 欧美啪啪一区二区三区| 精品人妻人人做人人爽| 一区二区三区婷婷中文字幕| 青娱乐不卡视频在线| 一区二区在线观看视频网站| 午夜3p福利视频合集| 久久热在线免费观看| 精品国产无乱码一区二区三区| 亚洲一区在线视频观看地址| 精品免费一区二区三区四区视频| 丝袜美女诱惑佐佐三上| 中文字幕 一区二区在线观看| 少妇被中出一区二区| 河北全程露脸对白自拍| 亚洲欧美成人午夜一区二区| 亚洲av激情综合网| 久久久久国产精品二区| 午夜夫妻性生活视频| 欧美日韩黄片免费在线观看| 国产一区二区三区四区精| 日本亚洲午夜福利一区二区三区| 1级黄色片在线观看| 国产av在线免费视频| 99re这里是国产精品首页| av丝袜免费在线观看| 亚洲天堂色综合久久| 超级黄肉动漫在线观看| 亚洲成人欧洲成人在线| 精品视频一区二区三区◇| 国际日韩日韩日韩日韩日韩| 亚洲中文字幕在线av| 日本福利网站一区二区| 亚洲精品乱码久久久久app| 日本熟女0930视频| 中文字幕在线免费观看人妻| 天天日天天干天天日天天干天天 | 性色蜜桃臀x88av天美传媒| 夏目彩春av在线看| 男女啪啪啪网站在线观看免费| 日韩三级精品电影久久久久| 一区二区三区四区久久久久韩日| 黑吊操欧美极品美女| 免费成人av麻豆| 人妻超清中文字幕在线乱码| 国产精品无码无卡免费观| 操烂你的骚逼天天欧美| 色视频在线播放免费观看| 日本人妻熟妇丰满成熟HD系列 | 夜夜骚av一二三区| 日韩无码国产一区二区| 亚州av嫩草av极品在线观看| 久久久久性感美女偷拍视频| 色999日韩偷自拍拍免费| 精品国产无乱码一区二区三区| 我爱搞在线观看视频| 亚洲人人爽人人澡起碰av| 在线能看视频你懂的| 国产精品网站的黄色| 二十四小时日本高清在线观看| 国产激情免费在线视频| 国产天堂av不卡网| 天天干天天日天天弄| 中文字幕欧美人妻在线.| 亚洲午夜精品视频节目| 午夜亚洲国产精品中字| 国产一区二区手机在线观看| 午夜国产精品免费视频| 可在线免费观看av| 青青青青午夜手机国产视频| 亚欧洲乱码视频一二三区| 日韩国产欧美一区二区三区粉嫩| 桃色成人开心激情网| 玖辛奈18禁同人污本子| 一二区二区不卡视频| 成人大片男人的天堂| 欧美一级特黄大片做受99| 91精产国品一二三产区区别网站| 亚洲欧美精品日韩偷拍| 涩涩黄片在线免费观看| 最新日韩中文字幕啪啪啪| 免费的啪啪视频软件| 干逼又爽又黄又免费的视频| 久久久久九九九九九12| 特级aaaaa黄色片| 国产精品久久久99| 狠狠干狠狠操免费视频| 亚洲av日韩久久网站| 夜夜爽夜夜操夜夜爱| 亚洲熟女人妻自拍在线视频 | 国产91精品福利系列| 五十岁熟妇高潮喷水| 日韩激情亚洲国产欧美另类激情 | 欧美肥妇久久久久久| 午夜国产免费视频亚洲| 亚洲国内精品久久久久久久 | 国产激情一区二区视频|