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

MySQL 全局鎖、表鎖、行鎖、間隙鎖、臨鍵鎖詳解,架構師必備高并發下的鎖優化策略

數據庫 MySQL
事務的加鎖解鎖遵循“兩階段鎖協議”,提交或回滾時釋放所有鎖。死鎖的本質是事務間形成了對鎖資源的循環等待。通過理解其原理并采用固定的資源訪問順序、使用樂觀鎖、減小事務粒度等預防措施,可以顯著降低死鎖發生概率。希望這些圖解和說明能幫助你更深入地理解 MySQL 的鎖機制。

余弦:碼哥,我今天面試被問到 “事務并發執行會帶來什么問題,并發安全如何解決呢?MySQL 有哪些鎖?”

今天我要跟你聊聊 MySQL 的鎖。數據庫鎖設計的初衷是處理并發問題。

并發事務訪問相同記錄的情況大致可以劃分以下幾種:

  • 讀-讀情況:即并發事務相繼讀取相同的記錄。讀取操作本身不會對記錄有一毛錢影響,并不會引起什么問題,所以允許這種情況的發生。
  • 寫-寫情況:即并發事務相繼對相同的記錄做出改動。

作為多用戶共享的資源,當出現并發訪問的時候,數據庫需要合理地控制資源的訪問規則。

而鎖就是用來實現這些訪問規則的重要數據結構。

根據加鎖的范圍,MySQL 的鎖可以分為全局鎖、表鎖和行鎖。

對于MyISAMMEMORYMERGE這些存儲引擎來說,它們只支持表級鎖,而且這些引擎并不支持事務,所以使用這些存儲引擎的鎖一般都是針對當前會話來說的。

全局鎖

余弦:什么是全局鎖?干嘛用的?

全局鎖就是對整個數據庫實例加鎖。MySQL 提供了一個加全局讀鎖的方法,命令是 Flush tables with read lock (FTWRL)。

當你需要讓整個庫處于只讀狀態的時候,可以使用這個命令,之后其他線程的以下語句會被阻塞

  • 數據更新語句(數據的增刪改)
  • 數據定義語句(包括建表、修改表結構等)
  • 更新類事務的提交語句。

全局鎖的適應場景之一,做全庫的邏輯備份。把整個庫的表數據都查出來存儲為文本。

余弦:讓整庫都只讀,在備份期間都不能執行更新,業務基本上就得停擺。這怎么辦?

是的。

  • 如果你在主庫上備份,那么在備份期間都不能執行更新,業務基本上就得停擺;
  • 如果你在從庫上備份,那么備份期間從庫不能執行主庫同步過來的 binlog,會導致主從延遲。

不加鎖產生的問題

比如手機卡,購買套餐信息。這里分為兩張表 u_acount (用于余額表),u_pricing (資費套餐表)。

  1. u_account 表中數據 用戶 A 余額:300;u_pricing 表中數據 用戶 A 套餐:空
  2. 發起備份,備份過程中先備份 u_account 表,備份完了這個表,這個時候 u_account 用戶余額是 300。
  3. 這個時候套用戶購買了一個資費套餐 100,餐購買完成,寫入到 u_print 套餐表購買成功,備份期間的數據。
  4. 備份完成。

可以看到備份的結果是,u_account 表中的數據沒有變, u_pricing 表中的數據 已近購買了資費套餐 100.

哪這時候用這個備份文件來恢復數據的話,用戶 A 賺了 100 ,用戶是不是很舒服啊。但是你的想想公司利益啊。

也就是說,不加鎖的話,備份系統備份的得到的庫不是一個邏輯時間點,這個數據是邏輯不一致的。

表級鎖

MySQL 里面表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(meta data lock,MDL)。

表鎖的語法是 lock tables … read/write。與 FTWRL 類似,可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放。

另一類表級的鎖是 MDL(metadata lock)。MDL 不需要顯式使用,在訪問一個表的時候會被自動加上。

當對一個表做增刪改查操作的時候,加 MDL 讀鎖;當要對表做結構變更操作的時候,加 MDL 寫鎖。

  • 讀鎖之間不互斥,因此你可以有多個線程同時對一張表增刪改查。
  • 讀寫鎖之間、寫鎖之間是互斥的,用來保證變更表結構操作的安全性。

不過請盡量避免在使用InnoDB存儲引擎的表上使用LOCK TABLES這樣的手動鎖表語句,它們并不會提供什么額外的保護,只是會降低并發能力而已。

InnoDB的厲害之處還是實現了更細粒度的行鎖,關于表級別的大家了解一下就罷了。

余弦:在使用MySQL過程中,我們可以為表的某個列添加AUTO_INCREMENT屬性。之后在插入記錄時,可以不指定該列的值,系統會自動為它賦上遞增的值。

這是什么鎖?

比方說我們有一個表:

CREATE TABLE t (
    id INT NOT NULL AUTO_INCREMENT,
    c VARCHAR(100),
    PRIMARY KEY (id)
) Engine=InnoDB CHARSET=utf8;

系統實現這種自動給AUTO_INCREMENT修飾的列遞增賦值的原理主要是兩個:

  • 采用表級別AUTO-INC鎖,然后為每條待插入記錄的AUTO_INCREMENT修飾的列分配遞增的值,在該語句執行結束后,再把AUTO-INC鎖釋放掉。

這樣一個事務在持有AUTO-INC鎖的過程中,其他事務的插入語句都要被阻塞,可以保證一個語句中分配的遞增值是連續的。

如果我們的插入語句在執行前不可以確定具體要插入多少條記錄(無法預計即將插入記錄的數量),比方說使用INSERT ... SELECTREPLACE ... SELECT或者LOAD DATA這種插入語句,一般是使用AUTO-INC鎖為AUTO_INCREMENT修飾的列生成對應的值。

  • 輕量級的鎖,這種方式可以避免鎖定表,可以提升插入性能:
  • 在為插入語句生成AUTO_INCREMENT修飾的列的值時獲取一下這個輕量級鎖,然后生成本次插入語句需要用到的AUTO_INCREMENT列的值之后,就把該輕量級鎖釋放掉,并不需要等到整個插入語句執行完才釋放鎖。
  • 如果我們的插入語句在執行前就可以確定具體要插入多少條記錄,比方說我們上邊舉的關于表t的例子中,在語句執行前就可以確定要插入 2 條記錄,那么一般采用輕量級鎖的方式對AUTO_INCREMENT修飾的列進行賦值。

行鎖

行鎖,也稱為記錄鎖,顧名思義就是在記錄上加的鎖。這是最復雜的鎖,前面的只是開胃菜。

一個行鎖玩出了各種花樣,也就是把行鎖分成了各種類型。

MySQL 的行級鎖是 InnoDB 存儲引擎實現高并發的核心技術之一。它允許在保證數據一致性的同時,大幅提升數據庫的并發處理能力。

下面這張表格匯總了行級鎖的主要類型和核心特點,可以幫助你快速建立整體印象。

鎖類型

英文名

鎖定對象

主要作用

常見觸發方式

記錄鎖

Record Lock

索引中的單條記錄

防止其他事務修改或刪除被鎖定的記錄

SELECT ... FOR UPDATE

或更新語句通過索引精準匹配到一條存在記錄時

間隙鎖

Gap Lock

索引記錄之間的間隙

防止其他事務在間隙中插入新數據,從而避免“幻讀”

范圍查詢(如 WHERE id BETWEEN 5 AND 10)或查詢不存在的唯一記錄時

臨鍵鎖

Next-Key Lock

記錄鎖 + 間隙鎖

,鎖定一個左開右閉的區間

既防止幻讀,又保證當前讀的數據一致性,是 InnoDB 在可重復讀隔離級別下的默認鎖算法

范圍查詢或在非唯一索引上的等值查詢時

共享鎖與排他鎖

從鎖的互斥性來看,行級鎖分為共享鎖和排他鎖,它們的兼容關系是理解鎖沖突的基礎。

  • 共享鎖(Shared Lock, S Lock):也稱為“讀鎖”。

作用:允許多個事務同時讀取同一行數據。

互斥性:一個事務持有共享鎖后,其他事務可以繼續加共享鎖來讀取數據,但不能加排他鎖來修改數據

加鎖方式:使用 SELECT ... LOCK IN SHARE MODE;或 SELECT ... FOR SHARE;

  • 排他鎖(Exclusive Lock, X Lock):也稱為“寫鎖”。

使用 SELECT ... FOR UPDATE;顯式加鎖。

自動加鎖UPDATEDELETEINSERT語句會自動對其操作的記錄加排他鎖。

作用:允許一個事務讀寫某行數據。

互斥性:一個事務持有排他鎖后,其他事務不能再對該行加任何類型的鎖(包括共享鎖和其他排他鎖),直到該鎖被釋放。

加鎖方式

它們的兼容關系可以總結為下表:

當前已持有的鎖

請求 共享鎖 (S)

請求 排他鎖 (X)

共享鎖 (S)

?? 兼容

? 沖突

排他鎖 (X)

? 沖突

? 沖突

行鎖的底層實現和特性

行鎖基于索引實現

這是理解行鎖最核心的一點。InnoDB 的行鎖是加在索引項上的,而不是直接加在物理數據行上的。這意味著:

  • 有效使用行鎖的前提:你的 WHERE條件必須能夠有效命中索引。
  • 否則退化為表鎖:如果查詢條件不能使用索引,MySQL 將進行全表掃描,從而對所有記錄加鎖,實際效果等同于鎖住了整個表,會嚴重降低并發性能

兩階段鎖協議(Two-Phase Locking, 2PL)

InnoDB 遵循此協議,鎖的操作分為兩個階段:

  • 加鎖階段:在事務執行過程中,根據需要逐步獲取鎖。
  • 解鎖階段:直到事務提交(COMMIT)或回滾(ROLLBACK)時,一次性釋放所有在該事務中獲取的鎖。
  • 重要提示:由于鎖是在事務結束后才釋放,為了減少鎖沖突和提高并發性,應盡量將最可能引起沖突的寫操作(如 SELECT ... FOR UPDATE)放在事務的后面執行,以縮短排他鎖的持有時間。

意向鎖(Intention Locks)

意向鎖是表級鎖用于快速判斷表內是否有被鎖定的行,從而避免為了檢查行鎖而需要遍歷每一行的低效操作

  • 意向共享鎖(IS):表示事務準備在表中的某些行上加共享鎖。
  • 意向排他鎖(IX):表示事務準備在表中的某些行上加排他鎖。意向鎖之間是兼容的(例如,多個事務可以同時對一個表持有 IX 鎖),但它們與表級共享鎖(S)和排他鎖(X)存在互斥關系。意向鎖由 InnoDB 自動管理,無需用戶干預

行鎖類型可視化

理解行鎖的關鍵在于區分其三種基本類型。下圖通過一個數據索引的例子,清晰展示了三種鎖的鎖定范圍差異,這是理解所有高級鎖概念的基礎。

圖片圖片

圖解說明

  • 記錄鎖(Record Lock):像一把鑰匙只鎖一個特定的座位(如id=10)。它確保在更新或刪除某條確切存在的記錄時,其他事務無法修改或刪除它。
  • 間隙鎖(Gap Lock):鎖住的是座位與座位之間的“空檔”(如(10, 15))。它的存在僅僅是為了防止插入(防止幻讀),但不會阻止其他事務修改這個區間內已存在的記錄(例如,如果id=12存在,你仍然可以修改它)。
  • 臨鍵鎖(Next-Key Lock):這是 InnoDB 在可重復讀(RR)隔離級別下默認的鎖算法。它是記錄鎖和間隙鎖的結合,鎖定一個左開右閉的區間。例如,(5, 10]意味著它鎖定了id=10這條記錄,也鎖定了510之間的間隙。這能有效防止在10之前插入新數據(解決幻讀),同時保護10這條記錄本身。

以下通過示例和場景進一步解釋這三種鎖。

記錄鎖(Record Lock)

它鎖住的是索引項。例如,執行 SELECT * FROM users WHERE id = 10 FOR UPDATE;會在 id=10這個索引項上加一個排他型的記錄鎖,防止其他事務修改或刪除這行數據。

間隙鎖(Gap Lock)

它鎖住的是索引項之間的“空隙”,以防止其他事務在這個空隙中插入新數據,從而解決“幻讀”問題。

間隙鎖只在可重復讀(REPEATABLE READ)及以上隔離級別生效

  • 示例:假設一張表 users的 id字段有值 5, 10, 15。
  • 事務 A 執行:SELECT * FROM users WHERE id BETWEEN 10 AND 15 FOR UPDATE;
  • 它不僅會鎖住 id=10和 15的記錄,還會鎖住它們之間的間隙 (10, 15)
  • 此時事務 B 嘗試執行 INSERT INTO users (id) VALUES (12);會被阻塞,因為 12落在了被鎖定的間隙內。

臨鍵鎖(Next-Key Lock)

它是 InnoDB 在可重復讀(REPEATABLE READ)隔離級別下默認使用的鎖算法

它相當于一個 記錄鎖 + 間隙鎖,鎖定一個左開右閉的區間 (previous_index, current_index]

  • 示例:同樣對于 id值為 5, 10, 15 的表。
  • 事務 A 執行:SELECT * FROM users WHERE id > 10 FOR UPDATE;
  • 它可能鎖住的區間包括 (10, 15]和 (15, +∞)
  • 這既防止了在 (10, 15)區間內插入新的 id=12,也防止了修改或刪除 id=15的現有記錄,同時還防止了插入任何大于 15 的新 ID。

死鎖與最佳實踐

死鎖是如何產生的呢?

行級鎖雖然提升了并發度,但也帶來了死鎖的風險。當兩個或多個事務互相等待對方釋放鎖時,就會形成死鎖。

理解 MySQL 中事務的加鎖流程以及死鎖如何形成,是構建高并發應用的基石。

下面我們通過一個清晰的流程圖來展示一個安全的事務加鎖/解鎖全過程,然后深入剖析幾種典型的死鎖場景。

事務加鎖與解鎖完成流程

首先要明確一個核心概念:兩階段鎖協議。它規定鎖的操作分為兩個階段:

  1. 加鎖階段:在事務執行過程中,根據需要逐步獲取鎖。
  2. 解鎖階段:直到事務提交(COMMIT)或回滾(ROLLBACK)時,一次性釋放所有在該事務中獲取的鎖。

下面的序列圖清晰地展示了一個安全、無沖突的事務加鎖與解鎖流程。

圖片圖片

流程解讀

  • 加鎖:事務 A 首先開啟事務,然后執行一條 SELECT ... FOR UPDATE語句,意圖鎖定某行數據(例如行 1)進行更新。此時,它會向鎖管理器申請該行的排他鎖(X Lock)
  • 執行:成功獲得鎖后,事務 A 可以安全地執行修改操作。在此期間,其他事務(如事務 B)如果嘗試獲取同一行的排他鎖或共享鎖,都會被阻塞。
  • 解鎖:當事務 A 提交(COMMIT)后,進入解鎖階段,一次性釋放它持有的所有鎖。
  • 后續:鎖被釋放后,之前被阻塞的事務 B 會被喚醒,并獲得它所需要的鎖,繼續執行。

這個流程是理想狀態下的。但當多個事務并發執行且鎖的獲取順序出現環狀依賴時,死鎖就發生了。

典型死鎖場景詳解

這個流程是理想狀態下的。但當多個事務并發執行且鎖的獲取順序出現環狀依賴時,死鎖就發生了。

場景 1:共享鎖升級導致的死鎖

這是非常經典的死鎖情況,常發生在先讀后寫的業務邏輯中。

時間點

事務 A

事務 B

T1

SELECT * FROM accounts WHERE id=1 LOCK IN SHARE MODE;

 (獲得 id=1 的S 鎖


T2


SELECT * FROM accounts WHERE id=1 LOCK IN SHARE MODE;

 (也獲得 id=1 的S 鎖

T3

UPDATE accounts SET balance = balance - 100 WHERE id=1;

 (嘗試將S 鎖升級為 X 鎖,但需等待事務 B 的 S 鎖釋放,阻塞


T4


UPDATE accounts SET balance = balance - 50 WHERE id=1;

 (也嘗試將S 鎖升級為 X 鎖,但需等待事務 A 的 S 鎖釋放)

死鎖形成

  1. 在 T3 時刻,事務 A 需要事務 B 釋放 S 鎖才能升級。
  2. 在 T4 時刻,事務 B 需要事務 A 釋放 S 鎖才能升級。
  3. 雙方互相等待,形成循環等待,死鎖產生。

場景 2:順序交叉訪問導致的死鎖

當多個事務以不同的順序訪問和鎖定資源時,極易發生死鎖。

時間點

事務 A

事務 B

T1

UPDATE accounts SET ... WHERE id=1;

 (成功獲得 id=1 的X 鎖)


T2


UPDATE accounts SET ... WHERE id=2;

 (成功獲得 id=2 的X 鎖)

T3

UPDATE accounts SET ... WHERE id=2;

 (嘗試獲取 id=2 的 X 鎖,被事務 B 阻塞


T4


UPDATE accounts SET ... WHERE id=1;

 (嘗試獲取 id=1 的 X 鎖,被事務 A 阻塞

死鎖形成

  • 事務 A 在等待事務 B 釋放 id=2 的鎖。
  • 事務 B 在等待事務 A 釋放 id=1 的鎖。
  • 循環等待再次形成,死鎖發生。

場景 3:Gap 鎖沖突導致的死鎖

可重復讀(REPEATABLE READ)隔離級別下,MySQL 會使用間隙鎖(Gap Lock)來防止幻讀,這也可能引發更復雜的死鎖。

假設 accounts表 id 有 1, 5, 10 三個值,存在間隙 (1,5), (5,10)。

時間點

事務 A

事務 B

T1

SELECT * FROM accounts WHERE id=3 FOR UPDATE;

 (在間隙(1,5)上加了Gap 鎖


T2


SELECT * FROM accounts WHERE id=4 FOR UPDATE;

 (同樣在間隙(1,5)上加了Gap 鎖,Gap 鎖之間不互斥,成功)

T3

INSERT INTO accounts (id, ...) VALUES (3, ...);

 (嘗試插入,需要獲取插入意向鎖,與事務 B 的 Gap 鎖沖突,阻塞


T4


INSERT INTO accounts (id, ...) VALUES (4, ...);

 (同樣需要獲取插入意向鎖,與事務 A 的 Gap 鎖沖突)

死鎖形成

  • 事務 A 的插入在等待事務 B 釋放(1,5)間隙上的鎖。
  • 事務 B 的插入在等待事務 A 釋放(1,5)間隙上的鎖。
  • 循環等待形成,死鎖發生。

死鎖的處理與預防

nnoDB 存儲引擎內置了死鎖檢測機制。當檢測到死鎖時,它會選擇一個回滾代價較小的事務(通常是影響行數較少的事務)進行回滾,并讓另一個事務繼續執行。

被回滾的事務會收到 ERROR 1213 (40001): Deadlock found錯誤。

核心預防策略

  1. 固定訪問順序:在應用設計中,保證所有事務以相同的順序訪問數據行。例如,約定更新賬戶時總是按 id 從小到大處理,可以避免場景二的死鎖
  2. 避免在事務中加鎖:如果業務允許,使用樂觀鎖(如版本號機制)替代悲觀鎖,從根本上減少鎖競爭
  3. 保持事務小巧且快速大事務會長時間持有鎖,增加死鎖概率。應將大事務拆分為小事務
  4. 為查詢創建合適的索引:如果查詢條件未使用索引,InnoDB 可能會鎖住更多記錄(甚至全表),大幅增加死鎖風險。
  5. 使用較低的隔離級別:如果業務能接受,將隔離級別設為讀已提交(READ COMMITTED),此級別下 InnoDB 不會使用間隙鎖(Gap Lock),可減少死鎖。

事務的加鎖解鎖遵循“兩階段鎖協議”,提交或回滾時釋放所有鎖。死鎖的本質是事務間形成了對鎖資源的循環等待

通過理解其原理并采用固定的資源訪問順序、使用樂觀鎖、減小事務粒度等預防措施,可以顯著降低死鎖發生概率。

希望這些圖解和說明能幫助你更深入地理解 MySQL 的鎖機制。

責任編輯:武曉燕 來源: 碼哥跳動
相關推薦

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2020-10-20 13:50:47

MySQL數據庫

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2024-11-29 07:38:12

MySQL數據庫

2018-07-31 10:10:06

MySQLInnoDB死鎖

2022-10-24 00:33:59

MySQL全局鎖行級鎖

2023-12-06 07:33:20

MySQL鎖事間隙鎖

2020-02-06 10:02:45

MySQL數據庫全局鎖

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2010-05-24 12:50:59

MySQL表級鎖

2025-02-10 09:58:48

2024-06-14 09:27:00

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2024-03-04 00:01:00

鎖表鎖行MySQL

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2022-07-20 08:06:57

MySQL表鎖Innodb

2022-10-24 08:02:14

MySQL索引類型

2021-01-15 05:12:14

Java并發樂觀鎖
點贊
收藏

51CTO技術棧公眾號

91在线云播放| 一本久道综合久久精品| 91精品国产综合久久福利| 天天做天天躁天天躁| 五月婷婷在线播放| 秋霞影院一区二区| 欧美激情按摩在线| 国产伦理片在线观看| 精品三级国产| 色狠狠av一区二区三区| 黄色网zhan| 韩日视频在线| 成人午夜电影小说| 国产精品欧美日韩一区二区| 免费人成在线观看| 视频一区在线观看| 欧美tk—视频vk| 国产一线二线三线在线观看| 欧美性爽视频| 国产精品青草综合久久久久99| 国产女人水真多18毛片18精品 | 日韩中文字幕免费在线观看| 青青草精品视频| 97**国产露脸精品国产| 免费成人深夜夜行网站| 欧美人与拘性视交免费看| 精品国产网站在线观看| 亚洲精品在线视频播放| 日韩精品第一| 日韩欧美在线网址| 分分操这里只有精品| 米奇精品一区二区三区| 日本一区二区免费在线| 久久精品国产第一区二区三区最新章节| 国产欧美日韩成人| 蜜桃av一区二区三区电影| 欧美综合国产精品久久丁香| 国产91av视频| 国产精品地址| 欧美精品做受xxx性少妇| 国产精品麻豆一区| 成人羞羞在线观看网站| 亚洲精品资源在线| 亚洲黄色免费在线观看| ccyy激情综合| 欧美mv日韩mv亚洲| 99国产精品免费视频| 国产精品麻豆| 欧美男同性恋视频网站| 亚洲综合欧美激情| 成人交换视频| 欧美日韩一区高清| 视频二区在线播放| 欧美成人三级| 欧美精品一卡二卡| 在线免费黄色网| 国产精品视频首页| 91麻豆精品国产91久久久使用方法 | 深夜国产在线播放| 一区二区三区四区在线免费观看 | 自拍偷拍亚洲天堂| 九九久久婷婷| 在线精品国产成人综合| eeuss中文字幕| 国产精品久久久久久| 久久精品国产99国产精品澳门| 99久久久无码国产精品不卡| 四虎成人av| 久久国产精品久久久久| 久久久久久久国产视频| 精品999网站| 51ⅴ精品国产91久久久久久| 啦啦啦免费高清视频在线观看| 久久国产欧美| 成人黄色激情网| 亚洲高清视频网站| 99精品久久99久久久久| 欧美一区国产一区| 女女色综合影院| 亚洲精品免费在线观看| 996这里只有精品| 乡村艳史在线观看| 欧美图片一区二区三区| 一级片黄色免费| 久久亚洲道色| 在线日韩中文字幕| www.av视频| 亚洲一区二区三区高清不卡| 国产精品视频一| 成人av无码一区二区三区| 99久久99久久精品免费观看| 日韩欧美一区二区三区四区| 麻豆网站视频在线观看| 午夜精品在线视频一区| caopor在线视频| 国产中文欧美日韩在线| 日韩电视剧在线观看免费网站| 精品手机在线视频| 91久久视频| 国产精品视频大全| 婷婷在线观看视频| 国产精品嫩草影院com| 男人添女人荫蒂免费视频| free欧美| 精品999在线播放| 国产不卡在线观看视频| 日韩午夜免费| 亚洲在线免费看| 国产中文字幕在线播放| 亚洲综合一区二区三区| av污在线观看| 网曝91综合精品门事件在线| 久久亚洲精品一区| 久久久久久无码午夜精品直播| 国产精品小仙女| 午夜精品一区二区在线观看的 | 日本成人免费在线| 性一交一乱一透一a级| 国产日韩精品视频一区| 国产极品尤物在线| 免费看日产一区二区三区| 亚洲新声在线观看| 天天爽夜夜爽夜夜爽精品| 国产一区二区女| 天堂资源在线亚洲资源| 性爽视频在线| 欧美精品一区二区精品网| 四虎884aa成人精品| 日本女优在线视频一区二区| 蜜桃视频日韩| 丁香花在线影院| 欧美一区二区三区免费在线看 | 在线一区电影| 国产精品一二三在线| 美丽的姑娘在线观看免费动漫| 亚洲国产成人91porn| 国产黄色一区二区三区| 99久久久国产精品美女| 国产精品自产拍在线观看| 免费成人av电影| 欧美日韩亚洲一区二区| www国产视频| 亚洲精品裸体| 精品999在线观看| xxxx另类黑人| 亚洲国产欧美一区| 国产精品成人免费一区二区视频| 国产乱码一区二区三区| 精品日韩在线播放| 91麻豆精品国产综合久久久| 丝袜亚洲另类欧美重口| 亚洲av无码乱码国产精品fc2| 久久精品亚洲精品国产欧美kt∨ | 亚洲免费av电影| 日本一区二区不卡在线| 99免费精品视频| 欧美黄色免费影院| 四虎影视精品| 国产精品扒开腿做爽爽爽视频| 日韩大胆视频| 欧美在线视频全部完| 麻豆一区在线观看| 国产在线视频精品一区| www.18av.com| 久久动漫网址| 日产日韩在线亚洲欧美| 岛国在线视频免费看| 欧美三级在线看| 国产老头老太做爰视频| 成人亚洲一区二区一| 青娱乐自拍偷拍| 欧美一区二区三| 国产综合在线观看视频| 欧美xxxbbb| 日韩国产一区三区| 亚洲天堂中文字幕在线| 一区二区三区欧美激情| 中文字幕乱码在线| 日韩精品乱码av一区二区| 在线成人性视频| 136福利精品导航| 日韩av免费看网站| 日本www在线观看视频| 精品久久久久99| 亚洲第一在线播放| 亚洲欧美一区二区三区极速播放| 美国黄色一级视频| 日韩在线卡一卡二| 欧美做受777cos| 久久99青青| 亚洲综合在线做性| 最新日韩精品| 欧美成人久久久| 欧美挠脚心网站| 日韩欧美在线网站| 午夜影院免费在线观看| 亚洲美女少妇撒尿| 国产麻豆天美果冻无码视频 | 国产精品一区二区婷婷| 91精品国产综合久久久久久 | 欧美喷潮久久久xxxxx| 久久久一区二区三区四区| 国产亚洲美州欧州综合国| 欧美日韩久久婷婷| 日韩 欧美一区二区三区| 国产精品无码免费专区午夜| 日本高清免费电影一区| 激情久久av| 国产午夜久久av| 国产精品福利在线观看网址| 欧美78videosex性欧美| 久久激情视频免费观看| 久久久资源网| 亚洲黄色在线看| 国产女无套免费视频| 在线精品视频免费播放| 亚洲综合一二三| 亚洲精品视频免费观看| 国产精品久久久免费看| 久久视频一区二区| 国产人成视频在线观看| 国产一区二区福利| 久久99爱视频| 视频一区国产视频| 国产h视频在线播放| 欧美日韩亚洲一区三区| 夜夜爽www精品| 啪啪亚洲精品| 欧美久久综合性欧美| av自拍一区| 国产成人精品日本亚洲11| 不卡一区视频| 国产日韩欧美另类| 日韩国产网站| 国产不卡精品视男人的天堂| 99riav视频在线观看| 久久久久久国产精品三级玉女聊斋 | 波多野结衣电影在线播放| 午夜精品久久久久| 日本a在线观看| 午夜精品视频一区| 亚洲天堂日韩av| 图片区小说区区亚洲影院| 久久精品免费在线| 亚洲一级在线观看| 国产无码精品久久久| 亚洲综合色噜噜狠狠| 九九热国产在线| 亚洲丶国产丶欧美一区二区三区| 欧美激情一区二区视频| 亚洲一级在线观看| 国产情侣在线视频| 日韩欧美在线中文字幕| 欧美日韩综合一区二区三区| 色偷偷久久一区二区三区| 亚洲精品午夜国产va久久成人| 欧美色道久久88综合亚洲精品| 亚洲精品1区2区3区| 色天天综合色天天久久| 国产又粗又猛又爽又| 欧美网站大全在线观看| 92久久精品一区二区| 欧美成人bangbros| 内射后入在线观看一区| 日韩精品免费综合视频在线播放| 天堂资源中文在线| 亚洲一区二区久久久| 亚洲视频tv| 欧美另类在线播放| 国产在线美女| 国产精品丝袜白浆摸在线 | 久久一区免费| 国内精品久久久久久久影视简单| 亚洲精品二区| 在线观看免费一区二区| 国产在线精品91| 日本伊人色综合网| 亚洲AV无码久久精品国产一区| 成人国产精品免费网站| 欧美成人午夜精品免费| 国产精品夫妻自拍| 国产一级黄色av| 日本韩国视频一区二区| 国产美女无遮挡永久免费| 日韩av一区在线观看| 亚洲欧美视频一区二区| 午夜精品一区二区三区av| 高清成人在线| 97视频热人人精品| 亚洲人成精品久久久 | 日韩一级视频免费观看在线| 天天av天天翘| 久久精品91久久久久久再现| 欧亚av在线| 成人写真福利网| 真实原创一区二区影院| 国产成人生活片| 日韩vs国产vs欧美| 91精品又粗又猛又爽| 中文在线免费一区三区高中清不卡| 久久国产精品二区| 欧美日韩在线精品一区二区三区激情 | 亚洲国产123| 欧美特黄级在线| 国产视频一二三四区| 亚洲人成在线观看网站高清| 青春草在线视频| 国产在线观看不卡| 西野翔中文久久精品国产| 女女百合国产免费网站| 欧美aaaaaa午夜精品| 日韩少妇一区二区| 综合久久给合久久狠狠狠97色| 国产成人精品777777| 欧美r级在线观看| 国产在线一区二区视频| 国产福利视频一区| 久久久免费毛片| 国产性生活免费视频| 精品一区免费av| av网在线播放| 色欧美乱欧美15图片| 天堂在线视频免费| 欧美—级高清免费播放| 999精品视频在线观看| 先锋影音欧美| 视频一区欧美精品| 熟女俱乐部一区二区| 亚洲va国产va欧美va观看| 99在线观看精品视频| 精品国产一区av| 激情小说亚洲| 亚洲高清在线观看一区| 首页亚洲欧美制服丝腿| 国产国语性生话播放| 亚洲1区2区3区4区| 深爱激情五月婷婷| 久久久亚洲成人| 亚洲一区二区电影| 久久人妻无码一区二区| 国产精品18久久久久久久久久久久 | 国产又粗又长视频| 最近中文字幕mv在线一区二区三区四区 | 国产精品久久久久久9999| 国产精品久久久久久久久免费桃花| 精品视频一二三区| 中日韩午夜理伦电影免费| 国产一区二区色噜噜| 夜夜爽www精品| 久久99精品国产麻豆不卡| 我要看黄色一级片| 日韩一区二区三区电影在线观看| 91精选在线| 国产精品污www一区二区三区| 1024成人| 免费观看av网站| 欧洲视频一区二区| 乱人伦中文视频在线| 91亚洲精品在线观看| 欧美日韩福利| 国产人妻黑人一区二区三区| 欧美日韩美女视频| 丁香婷婷在线观看| 91免费在线视频网站| 亚洲一级黄色| 不卡一区二区在线观看| 日本高清不卡一区| 日本三级视频在线播放| 亚洲一区二区三区在线免费观看| 欧美日韩精品免费观看视频完整| 色综合久久五月| 91黄色小视频| 国产黄大片在线观看画质优化| 99久久一区三区四区免费| 亚洲视频二区| 日韩欧美视频免费观看| 欧美成人三级电影在线| 亚洲深夜视频| 最新欧美日韩亚洲| 99久久精品一区二区| 中文字幕1区2区3区| 欧美高清自拍一区| 亚洲欧洲美洲国产香蕉| 亚洲最大天堂网| 黄色精品在线看| 日本成人网址| 久久99精品久久久久久三级| 麻豆极品一区二区三区| 日本学生初尝黑人巨免费视频| 在线播放国产精品| 亚洲伊人影院| 亚洲精品怡红院| 亚洲一区二区美女| yw视频在线观看| 国产美女精品久久久| 美女一区二区视频| 特级毛片www| 久久成人人人人精品欧| 少妇一区二区视频| 精品伦一区二区三区|