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

Spring 事務、循環依賴八股文

開發 前端
Spring的事務隔離級別是指在并發環境下,事務之間相互隔離的程度。Spring框架支持多種事務隔離級別,可以根據具體的業務需求來選擇適合的隔離級別。

Spring 事務實現方式有哪些?

事務就是一系列的操作原子執行。Spring事務機制主要包括聲明式事務和編程式事務。

  • 編程式事務:通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
  • 聲明式事務:將事務管理代碼從業務方法中分離出來,通過aop進行封裝。Spring聲明式事務使得我們無需要去處理獲得連接、關閉連接、事務提交和回滾等這些操作。使用 @Transactional 注解開啟聲明式事務。

@Transactional相關屬性如下:

屬性

類型

描述

value

String

可選的限定描述符,指定使用的事務管理器

propagation

enum: Propagation

可選的事務傳播行為設置

isolation

enum: Isolation

可選的事務隔離級別設置

readOnly

boolean

讀寫或只讀事務,默認讀寫

timeout

int (in seconds granularity)

事務超時時間設置

rollbackFor

Class對象數組,必須繼承自Throwable

導致事務回滾的異常類數組

rollbackForClassName

類名數組,必須繼承自Throwable

導致事務回滾的異常類名字數組

noRollbackFor

Class對象數組,必須繼承自Throwable

不會導致事務回滾的異常類數組

noRollbackForClassName

類名數組,必須繼承自Throwable

不會導致事務回滾的異常類名字數組

說一下 spring 的事務隔離級別?

Spring的事務隔離級別是指在并發環境下,事務之間相互隔離的程度。Spring框架支持多種事務隔離級別,可以根據具體的業務需求來選擇適合的隔離級別。以下是常見的事務隔離級別:

  • DEFAULT(默認):使用數據庫默認的事務隔離級別。通常為數據庫的默認隔離級別,如Oracle為READ COMMITTED,MySQL為REPEATABLE READ。
  • READ_UNCOMMITTED:最低的隔離級別,允許讀取未提交的數據。事務可以讀取其他事務未提交的數據,可能會導致臟讀、不可重復讀和幻讀的問題。
  • READ_COMMITTED:保證一個事務只能讀取到已提交的數據。事務讀取的數據是其他事務已經提交的數據,避免了臟讀的問題。但可能會出現不可重復讀和幻讀的問題。
  • REPEATABLE_READ:保證一個事務在同一個查詢中多次讀取的數據是一致的。事務期間,其他事務對數據的修改不可見,避免了臟讀和不可重復讀的問題。但可能會出現幻讀的問題。
  • SERIALIZABLE:最高的隔離級別,保證事務串行執行,避免了臟讀、不可重復讀和幻讀的問題。但會降低并發性能,因為事務需要串行執行。

通過@Transactional注解的isolation屬性來指定事務隔離級別。

有哪些事務傳播行為?

在TransactionDefinition接口中定義了七個事務傳播行為:

  1. PROPAGATION_REQUIRED如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。如果嵌套調用的兩個方法都加了事務注解,并且運行在相同線程中,則這兩個方法使用相同的事務中。如果運行在不同線程中,則會開啟新的事務。
  2. PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。
  3. PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果不存在事務,則拋出異常IllegalTransactionStateException
  4. PROPAGATION_REQUIRES_NEW 總是開啟一個新的事務。需要使用JtaTransactionManager作為事務管理器。
  5. PROPAGATION_NOT_SUPPORTED 總是非事務地執行,并掛起任何存在的事務。需要使用JtaTransactionManager作為事務管理器。
  6. PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常。
  7. PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務, 則按PROPAGATION_REQUIRED 屬性執行。

PROPAGATION_NESTED 與PROPAGATION_REQUIRES_NEW的區別:

使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務是兩個獨立的事務。一旦內層事務進行了提交后,外層事務不能對其進行回滾。兩個事務互不影響。

使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常并不會導致外層事務的回滾,它是一個真正的嵌套事務。

Spring 事務傳播行為有什么用?

主要作用是定義和管理事務邊界,尤其是一個事務方法調用另一個事務方法時,事務如何傳播的問題。它解決了多個事務方法嵌套執行時,是否要開啟新事務、復用現有事務或者掛起事務等復雜情況。

總結用途:

  • 控制事務的傳播和嵌套:根據具體業務需求,可以指定是否使用現有事務或開啟新的事務,解決事務的傳播問題。
  • 確保獨立操作的事務隔離:某些操作(如日志記錄、發送通知)應當獨立于主事務執行,即使主事務失敗,這些操作也可以成功完成。
  • 控制事務的邊界和一致性:不同的業務場景可能需要不同的事務邊界,例如強制某個方法必須在事務中執行,或者確保某個方法永遠不在事務中運行。

談談對Spring事務和AOP底層實現原理的區別

Spring的聲明式事務其實也是通過AOP的這一套底層實現原理實現的,都是通過同一個bean的后置處理器來完成的動態代理創建的,只是:

  1. 創建動態代理的匹配方式不一樣:  區別就是AOP的增強通常是通過切面+切點+通知來完成的, 在創建bean的時候發現bean和切點表達式匹配就會創建動態代理。  而事務內置一個增強類, 在創建bean的時候, 一旦發現你的類加了@Transactional注解 就會創建動態代理。
  2. 執行動態代理的增強不一樣:  在執行AOP的bean時會先執行動態代理的增強類, 通過責任鏈分別按順序執行通知。

在執行事務的bean的時候會先執行動態代理的增強類, 在執行目標方法前進行異常捕捉,出現異常回滾事務, 無異常提交事務。

Spring事務在什么情況下會失效?

1.應用在非 public 修飾的方法上

之所以會失效是因為@Transactional 注解依賴于Spring AOP切面來增強事務行為,這個 AOP 是通過代理來實現的。

而無論是JDK動態代理還是CGLIB代理,Spring AOP的默認行為都是只代理public方法。

2.被用 final 、static 修飾方法

和上邊的原因類似,被用 final 、static 修飾的方法上加 @Transactional 也不會生效。

static 靜態方法屬于類本身的而非實例,因此代理機制是無法對靜態方法進行代理或攔截的。

final 修飾的方法不能被子類重寫,事務相關的邏輯無法插入到 final 方法中,代理機制無法對 final 方法進行攔截或增強。

3.同一個類中方法調用

比如有一個類Test,它的一個方法A,A再調用本類的方法B(不論方法B是用public還是private修飾),但方法A沒有聲明注解事務,而B方法有。則外部調用方法A之后,方法B的事務是不會起作用的。

那為啥會出現這種情況?其實這還是由于使用Spring AOP代理造成的,因為只有當事務方法被當前類以外的代碼調用時,才會由Spring生成的代理對象來管理。

但是如果是A聲明了事務,A的事務是會生效的。

4.Bean 未被 spring 管理

上邊我們知道 @Transactional 注解通過 AOP 來管理事務,而 AOP 依賴于代理機制。因此,Bean 必須由Spring管理實例! 要確保為類加上如 @Controller、@Service 或 @Component注解,讓其被Spring所管理,這很容易忽視。

5.異步線程調用

如果我們在 testMerge() 方法中使用異步線程執行事務操作,通常也是無法成功回滾的,來個具體的例子。

假設testMerge() 方法在事務中調用了 testA(),testA() 方法中開啟了事務。接著,在 testMerge() 方法中,我們通過一個新線程調用了 testB(),testB() 中也開啟了事務,并且在 testB() 中拋出了異常。此時,testA() 不會回滾 和 testB() 回滾。

testA() 無法回滾是因為沒有捕獲到新線程中 testB()拋出的異常;testB()方法正常回滾。

在多線程環境下,Spring 的事務管理器不會跨線程傳播事務,事務的狀態(如事務是否已開啟)是存儲在線程本地的 ThreadLocal 來存儲和管理事務上下文信息。這意味著每個線程都有一個獨立的事務上下文,事務信息在不同線程之間不會共享。

6.數據庫引擎不支持事務

事務能否生效數據庫引擎是否支持事務是關鍵。常用的MySQL數據庫默認使用支持事務的innodb引擎。一旦數據庫引擎切換成不支持事務的myisam,那事務就從根本上失效了。

7.RollbackFor 沒設置對,比如默認沒有任何(設置 RuntimeException 或者 Error 才能捕獲),則方法內拋出 IOException 則不會回滾,需要配置 @Transactional(rollbackFor=Exception.class)。

8.異常被捕獲了,比如代碼拋錯,但是被 catch 了,僅打了 log 沒有拋出異常,這樣事務無法正常獲取到錯誤,因此不會回滾。

Spring多線程事務 能否保證事務的一致性

在多線程環境下,Spring事務管理默認情況下無法保證全局事務的一致性。這是因為Spring的本地事務管理是基于線程的,每個線程都有自己的獨立事務。

  • Spring的事務管理通常將事務信息存儲在ThreadLocal中,這意味著每個線程只能擁有一個事務。這確保了在單個線程內的數據庫操作處于同一個事務中,保證了原子性。
  • 可以通過如下方案進行解決:

編程式事務: 為了在多線程環境中實現事務一致性,您可以使用編程式事務管理。這意味著您需要在代碼中顯式控制事務的邊界和操作,確保在適當的時機提交或回滾事務。

分布式事務: 如果您的應用程序需要跨多個資源(例如多個數據庫)的全局事務一致性,那么您可能需要使用分布式事務管理(如2PC/3PC TCC等)來管理全局事務。這將確保所有參與的資源都處于相同的全局事務中,以保證一致性。

總之,在多線程環境中,Spring的本地事務管理需要額外的協調和管理才能實現事務一致性。這可以通過編程式事務、分布式事務管理器或二階段提交等方式來實現,具體取決于您的應用程序需求和復雜性。

但在 Seata 框架中,事務一致性是通過分布式事務協調器(TC)來保證的。TC 負責協調分布式事務的各個參與者(RM),確保它們按照相同的順序執行事務操作,從而保證事務的一致性。  具體來說,當一個事務開始時,TC 會生成一個全局事務 ID(XID),并將其傳播給所有的 RM。每個 RM 在執行事務操作時,都會將自己的操作記錄到本地事務日志中,并將 XID 和操作記錄發送給 TC。TC 會根據 XID 和操作記錄,協調各個 RM 的執行順序,確保它們按照相同的順序執行事務操作。如果在執行過程中出現異常,TC 會根據事務回滾策略,決定是否回滾事務。  通過這種方式,Seata 框架可以保證分布式事務的一致性,即使在多個節點之間進行事務操作,也可以確保數據的一致性和可靠性。(了解)

@Transactional(rollbackFor = Exception.class)注解了解嗎?

Exception 分為運行時異常 RuntimeException 和非運行時異常。事務管理對于企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。

當 @Transactional 注解作用于類上時,該類的所有 public 方法將都具有該類型的事務屬性,同時,我們也可以在方法級別使用該標注來覆蓋類級別的定義。

@Transactional 注解默認回滾策略是只有在遇到RuntimeException(運行時異常) 或者 Error 時才會回滾事務,而不會回滾 Checked Exception(受檢查異常)。這是因為 Spring 認為RuntimeException和 Error 是不可預期的錯誤,而受檢異常是可預期的錯誤,可以通過業務邏輯來處理。

循環依賴

什么是循環依賴?

循環依賴(Circular Dependency)是指兩個或多個模塊,組件之間相互依賴形成一個閉環。簡而言之, 模塊A依賴模塊B,而模塊B又依賴于模塊A。這會導依賴鏈的循環,無法確定加載或初始化的順序。

Spring怎么解決循環依賴的問題?

解決步驟:

  • Spring 首先創建 Bean 實例,并將其加入三級緩存中(Factory)。
  • 當一個 Bean 依賴另一個未初始化的 Bean 時,Spring 會從三級緩存中獲取 Bean 的工廠,并生成該 Bean 的對象(若有代理則是代理對象)代理對象存入二級緩存,解決循環依賴。
  • 一旦所有依賴 Bean 被完全初始化,Bean 將轉移到一級緩存中。

詳細內容如下:

首先,有兩種Bean注入的方式。

構造器注入和屬性注入。

  • 對于構造器注入的循環依賴,Spring處理不了,會直接拋出BeanCurrentlylnCreationException異常。
  • 對于屬性注入的循環依賴(單例模式下),是通過三級緩存處理來循環依賴的。

而非單例對象的循環依賴,則無法處理。

下面分析單例模式下屬性注入的循環依賴是怎么處理的:

首先,Spring單例對象的初始化大略分為三步:

  1. createBeanInstance:實例化bean,使用構造方法創建對象,為對象分配內存。
  2. populateBean:進行依賴注入。
  3. initializeBean:初始化bean。

Spring為了解決單例的循環依賴問題,使用了三級緩存:

  • 一級緩存 singletonObjects:完成了初始化的單例對象map,bean name --> bean instance,存完整單例bean。
  • 二級緩存 earlySingletonObjects :完成實例化未初始化的單例對象map,bean name --> bean instance,存放的是早期的bean,即半成品,此時還無法使用(只用于循環依賴提供的臨時bean對象)。
  • 三級緩存 singletonFactories (循環依賴的出口,解決了循環依賴): 單例對象工廠map,bean name --> ObjectFactory,單例對象實例化完成之后會加入singletonFactories。它存的是一個對象工廠,用于創建對象并放入二級緩存中。同時,如果對象有Aop代理,則對象工廠返回代理對象。

這三個 map 是如何配合的呢?

  1. 首先,獲取單例 Bean 的時候會通過 BeanName 先去 singletonObjects(一級緩存)查找完整的 Bean,如果找到則直接返回,否則進行步驟 2。
  2. 看對應的 Bean 是否在創建中,如果不在直接返回找不到(返回null),如果是,則會去 earlySingletonObjects(二級緩存) 查找 Bean,如果找到則返回,否則進行步驟 3。
  3. 去 singletonfactores(三級緩存)通過 BeanName查找到對應的工廠,如果存著工廠則通過工廠創建 Bean,并目放置到earlySingletonObjects 中。
  4. 如果三個緩存都沒找到,則返回 null。

從上面的步驟我們可以得知,如果查詢發現 Bean 還未創建,到第二步就直接返回 null,不會繼續查二級和三級緩存。返回 null 之后,說明這個Bean 還未創建,這個時候會標記這個 Bean 正在創建中,然后再調用 createBean 來創建 Bean,而實際創建是調用方法 doCreateBean。

在調用createBeanInstance進行實例化之后,會調用addSingletonFactory,將單例對象放到singletonFactories中。

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

假如A依賴了B的實例對象,同時B也依賴A的實例對象。

  1. A首先完成了實例化,并且將自己添加到singletonFactories中
  2. 接著進行依賴注入,發現自己依賴對象B,此時就嘗試去get(B)
  3. 發現B還沒有被實例化,對B進行實例化
  4. 然后B在初始化的時候發現自己依賴了對象A,于是嘗試get(A),嘗試一級緩存singletonObjects和二級緩存earlySingletonObjects沒找到,嘗試三級緩存singletonFactories,由于A初始化時將自己添加到了singletonFactories,所以B可以拿到A對象,然后將A從三級緩存中移到二級緩存中
  5. B拿到A對象后順利完成了初始化,然后將自己放入到一級緩存singletonObjects中
  6. 此時返回A中,A此時能拿到B的對象順利完成自己的初始化

由此看出,屬性注入的循環依賴主要是通過將實例化完成的bean添加到singletonFactories來實現的。而使用構造器依賴注入的bean在實例化的時候會進行依賴注入,不會被添加到singletonFactories中。比如A和B都是通過構造器依賴注入,A在調用構造器進行實例化的時候,發現自己依賴B,B沒有被實例化,就會對B進行實例化,此時A未實例化完成,不會被添加到singtonFactories。而B依賴于A,B會去三級緩存尋找A對象,發現不存在,于是又會實例化A,A實例化了兩次,從而導致拋異常。

總結:1、利用緩存識別已經遍歷過的節點; 2、利用Java引用,先提前設置對象地址,后完善對象。

Spring有沒有解決多例Bean的循環依賴?

  • 多例不會使用緩存進行存儲(多例Bean每次使用都需要重新創建)
  • 不緩存早期對象就無法解決循環

Spring有沒有解決構造函數參數Bean的循環依賴?

  • 構造函數的循環依賴會報錯
  • 可以通過人工進行解決:@Lazy

就不會立即創建依賴的bean了

而是等到用到才通過動態代理進行創建

為什么必須都是單例

如果從源碼來看的話,循環依賴的 Bean 是原型模式,會直接拋錯:

圖片圖片

所以 Spring 只支持單例的循環依賴,但是為什么呢?

按照理解,如果兩個Bean都是原型模式的話,那么創建A1需要創建一個B1,創建B1的時候要創建一個A2,創建 A2又要創建一個B2,創建 B2又要創建一個A3,創建 A3 又要創建一個 B3.就又卡 BUG 了,是吧,因為原型模式都需要創建新的對象,不能跟用以前的對象。

如果是單例的話,創建 A 需要創建 B,而創建的 B 需要的是之前的個 A,不然就不叫單例了,對吧? 也是基于這點, Spring 就能操作操作了。

具體做法就是:先創建A,此時的A是不完整的(沒有注入B),用個 map 保存這個不完整的A,再創建B,B需要A,所以從那個map 得到“不完整”的A,此時的B就完整了,然后A就可以注入B,然后A就完整了,B也完整了,且它們是相互依賴的。

圖片圖片

為什么不能全是構造器注入?一個set注入,一個構造器注入一定能成功?

為什么不能全是構造器注入?

在 Spring 中創建 Bean 分三步:

  1. 實例化,createBeanlnstance,就是 new 了個對象
  2. 屬性注入,populateBean, 就是 set 一些屬性值
  3. 初始化,initializeBean,執行一些 aware 接口中的方法,initMethod,AOP代理等

明確了上面這三點,再結合上面說的“不完整的”,我們來理一下。

如果全是構造器注入,比如A(B b),那表明在 new的時候,就需要得到B,此時需要 new B,但是B也是要在構造的時候注入A,即B(A a),這時候B需要在一個 map 中找到不完整的A,發現找不到。

為什么找不到?因為A 還沒 new 完呢,所以找不到完整的 A,因此如果全是構造器注入的話,那么 Spring 無法處理循環依賴。

一個set注入,一個構造器注入一定能成功?

假設我們 A 是通過 set 注入 B,B 通過構造函數注入 A,此時是成功的。

我們來分析下:實例化A之后,此時可以在 map中存入A,開始為A進行屬性注入,發現需要B,此時 new B,發現構造器需要A,此時從 map中得到A,B構造完畢,B進行屬性注入,初始化,然后A注入B完成屬性注入,然后初始化 A。

整個過程很順利,沒毛病。

圖片圖片

假設 A 是通過構造器注入 B,B 通過 set 注入 A,此時是失敗的。

我們來分析下:實例化A,發現構造函數需要B,此時去實例化B,然后進行B 的屬性注入,從 map 里面找不到A,因為 A 還沒 new 成功,所以B也卡住了,然后就 循環了。

圖片圖片

看到這里,仔細思考的小伙伴可能會說,可以先實例化 B,往 map 里面塞入不完整的 B,這樣就能成功實例化 A 了。確實,思路沒錯但是 Spring 容器是按照字母序創建 Bean 的,A 的創建永遠排在 B 前面。

現在我們總結一下:

  • 如果循環依賴都是構造器注入,則失敗
  • 如果循環依賴不完全是構造器注入,則可能成功,可能失敗,具體跟BeanName的字母序有關系,

二級緩存能不能解決循環依賴?

Spring 之所以需要三級緩存而不是簡單的二級緩存,主要原因在于AOP代理和Bean的早期引用問題。

  • 如果只是循環依賴導致的死循環的問題: 一級緩存就可以解決 ,但是無法解決在并發下獲取不完整的Bean。
  • 二級緩存雖然可以解決循環依賴的問題,但在涉及到動態代理(OP)時,直接使用二級緩存不做任問處理會導致我們拿到的 Bean 是未代理的原始對象。如果二級緩存內存放的都是代理對象,則違反了 Bean 的生命周期

Spring一二級緩存和MyBatis一、二級緩存有什么關系?

沒有關系!

  • MyBatis一、二級緩存是用來存儲查詢結果的, 一級緩存會在同一個SqlSession中的重復查詢結果進行緩存, 二級緩存則是全局應用下的重復查詢結果進行緩存。
  • 而Spring的一、二級緩存是用來存儲Bean的! 一級緩存用來存儲完整最終使用的Bean,二級緩存用來存儲早期臨時bean。 當然還有個三級緩存用來解決循環依賴的。
責任編輯:武曉燕 來源: SevenCoding
相關推薦

2021-11-04 14:32:17

Spring 面試作用域

2021-10-26 14:40:03

MySQL SQL 語句數據庫

2021-10-21 14:43:23

Java 語言 Java 基礎

2021-07-26 14:59:23

面試Redis內存數據庫

2021-09-07 14:46:42

面試網絡HTTP 協議

2023-11-28 18:09:49

Java多態

2021-10-26 17:05:55

Redis字符串復雜度

2022-09-03 11:36:11

Python文件網絡

2021-08-01 22:59:43

Object八股文quals

2021-04-14 10:02:59

網絡八股文協議

2021-05-20 11:43:57

操作系統硬件軟件

2024-02-23 19:17:12

構造函數C++開發

2021-08-12 09:28:24

Java多線程變量

2025-08-07 09:17:37

2024-10-12 09:26:32

線程池系統核心線程

2021-05-06 07:27:57

面試任務調度器

2023-11-29 17:28:07

2022-05-27 14:43:45

JVM字節碼指令

2022-05-19 08:41:09

JVM虛擬機架構

2023-01-13 18:04:03

面試題消息中間件
點贊
收藏

51CTO技術棧公眾號

蜜臀久久久久久999| 日本美女黄色一级片| 高清精品在线| 国产三区在线成人av| 国产精品永久免费视频| 日韩影院一区二区| 校园春色另类视频| 欧美精选在线播放| 北条麻妃在线视频观看| 91激情在线| 成人av影院在线| 国产欧美一区二区三区久久人妖| 91免费看片网站| 我要看一级黄色大片| 天堂8中文在线| 国产性色一区二区| 国产成人免费观看| 亚洲一区 中文字幕| 极品中文字幕一区| 中文字幕不卡av| 国产精品一区二区人妻喷水| 国产私拍福利精品视频二区| 亚洲超碰精品一区二区| 亚洲午夜精品久久| 日韩一二三四| 国产91精品免费| 国产精品第一区| 亚欧视频在线观看| 欧美成人中文| 综合网中文字幕| 国精品无码人妻一区二区三区| 精品一级视频| 欧美三级日韩三级国产三级| 久久黄色片视频| 国产区美女在线| 亚洲欧美日本韩国| 亚洲欧洲国产精品久久| 欧洲毛片在线| 不卡一区二区三区四区| www.一区二区三区| 国产后入清纯学生妹| 国产一区日韩二区欧美三区| 国产精品久久久久久久av大片| 韩国av中文字幕| 亚洲高清成人| 久久久亚洲福利精品午夜| www.av成人| 五月开心六月丁香综合色啪| 中文字幕日韩av综合精品| 妺妺窝人体色WWW精品| 亚洲精品aaaaa| 亚洲精品99久久久久中文字幕| 亚洲成人精品在线播放| 精品国产一区二区三区2021| 欧美一卡二卡三卡四卡| 亚洲第一成肉网| 精品视频91| 日韩色在线观看| 国产老头和老头xxxx×| 亚洲成人影音| 精品国产91洋老外米糕| 男人网站在线观看| 欧美黑人做爰爽爽爽| 亚洲经典中文字幕| 波多野吉衣中文字幕| 国产一区二区三区四区大秀| 亚洲人成在线观看网站高清| 亚洲а∨天堂久久精品2021| 成人免费在线播放| 精品国产欧美一区二区五十路| 欧美在线视频第一页| 午夜精品久久99蜜桃的功能介绍| 欧美高跟鞋交xxxxxhd| 欧美日韩免费一区二区| 在线不卡欧美| 欧美亚洲国产另类| 波多野结衣高清在线| 首页欧美精品中文字幕| 国产欧美日韩亚洲精品| 国产chinasex对白videos麻豆| 国产成人av电影| 久久人人九九| 777电影在线观看| 亚洲激情男女视频| 国产av麻豆mag剧集| 一呦二呦三呦精品国产| 欧美精品第1页| 不许穿内裤随时挨c调教h苏绵| 香蕉人人精品| 久久综合国产精品台湾中文娱乐网| 久久久久无码精品国产| 国产美女精品| 91亚洲国产成人久久精品网站| 亚洲国产精彩视频| 国产亚洲精品中文字幕| 国产日韩欧美大片| 亚洲欧洲高清| 91麻豆精品国产无毒不卡在线观看 | 欧美一级一区二区三区| 国产午夜精品一区二区| 欧美日韩视频免费在线观看| 国产夫妻在线| 欧美伦理视频网站| 熟妇高潮精品一区二区三区| 婷婷综合视频| 欧美一区二区三区艳史| 国产精品视频在线观看免费| 91看片淫黄大片一级| 中文字幕一区二区三区精彩视频| av成人福利| 欧美日韩大陆在线| 久久久精品人妻无码专区| 亚洲欧美色图| 国产精品久久久久999| 无码精品在线观看| 亚洲精品乱码久久久久久| 国产精品99久久免费黑人人妻| 在线播放中文一区| av一区二区三区免费观看| 中文字幕资源网在线观看免费| 欧美人伦禁忌dvd放荡欲情| japanese在线观看| 欧美精品网站| 国产日韩专区在线| 韩国免费在线视频| 性欧美疯狂xxxxbbbb| 中文字幕一区二区三区四| 成人6969www免费视频| 91福利视频网| 天堂在线观看视频| 亚洲一区在线观看免费| 日本高清一区二区视频| 成人免费电影网址| 国产精品第3页| 免费人成在线观看网站| 婷婷丁香激情综合| 第一页在线视频| 国产精品九九| 动漫精品视频| 男人天堂亚洲天堂| 精品国产电影一区二区| 免费在线观看国产精品| 国产精品一区二区视频| 操bbb操bbb| 亚洲日日夜夜| 久久久精品一区| 国产精品福利电影| 亚洲欧洲精品成人久久奇米网| 中文字幕av不卡在线| 国产影视一区| 国产精品老女人视频| a黄色在线观看| 欧美在线三级电影| 国产免费嫩草影院| 老司机一区二区| 大地资源第二页在线观看高清版| 四虎国产精品成人免费影视| 日韩视频第一页| 国产视频一区二区三| 一片黄亚洲嫩模| 亚洲911精品成人18网站| 亚洲性感美女99在线| 国产一区在线观| 一根才成人网| 亚洲天堂第二页| 亚洲一区二区人妻| 亚洲精品伦理在线| 人妻 丝袜美腿 中文字幕| 999在线观看精品免费不卡网站| 精品在线视频一区二区| 国产精品一区二区av影院萌芽| 国产亚洲精品久久久优势| 亚洲性生活大片| 亚洲国产日韩一级| 野花社区视频在线观看| 青青草97国产精品免费观看无弹窗版| 亚洲欧美丝袜| 日韩成人在线观看视频| 91av在线网站| 69久久精品| 日韩女优av电影| 日韩视频在线观看一区| 亚洲国产经典视频| www.黄色网| 亚洲欧美日韩国产一区二区| 亚洲日本精品| 粉嫩一区二区三区四区公司1| 欧美在线视频观看| 黄网页在线观看| 亚洲国产欧美一区二区三区同亚洲| 69视频免费在线观看| 国产精品的网站| 中文字幕天堂网| 蜜臀久久久久久久| 久久黄色片视频| 亚洲成av人电影| 精品国产乱码久久久久久郑州公司 | 精品久久久久久无码国产| 久久精品不卡| 狠狠色狠狠色综合人人| 亚洲精品自拍| 欧美整片在线观看| 国产黄色在线网站| 亚洲欧洲偷拍精品| 丰满人妻一区二区三区无码av| 色噜噜狠狠成人网p站| 久久免费视频6| 国产精品高清亚洲| 国产精品无码午夜福利| 国精品**一区二区三区在线蜜桃 | 欧美成人aa大片| 免费黄色一级大片| 五月天亚洲精品| 动漫性做爰视频| 欧美极品xxx| 在线播放av网址| 狠狠色狠狠色综合日日91app| 国产中文字幕免费观看| 欧美片第1页综合| 一区二区视频在线观看| 国产精品嫩草影院在线看| 51国偷自产一区二区三区的来源| 国产成人精选| 欧美在线日韩在线| a天堂资源在线| 萌白酱国产一区二区| 一级毛片视频在线| 亚洲小视频在线| 无码国产精品高潮久久99| 日韩欧美在线不卡| 国产精品九九九九| 欧美视频完全免费看| 亚洲色成人www永久网站| 香港成人在线视频| 久久综合综合久久| 亚洲乱码中文字幕| 男人的天堂久久久| 成人免费一区二区三区视频 | 欧美freesextv| 神马影院一区二区三区| 国产一区二区三区四区五区| 免费在线国产精品| 日韩精品免费一区二区三区竹菊| 国产日韩欧美二区| 丁香5月婷婷久久| 国产欧美韩日| 日韩在线麻豆| 久久国产精品一区二区三区| 另类图片第一页| 高清视频一区二区三区| 88久久精品| 国产欧美韩日| 免费看日本一区二区| 欧美一进一出视频| 欧美日韩在线播放视频| 亚洲精品在线视频观看| 欧美激情欧美| dy888午夜| 国模大胆一区二区三区| 日韩av中文字幕第一页| 亚洲一区二区伦理| 国产三级三级三级看三级| 人人超碰91尤物精品国产| 911福利视频| 国产成人在线视频网址| 五月天丁香社区| 91老师片黄在线观看| 中字幕一区二区三区乱码| 中文字幕亚洲不卡| 国产无遮挡裸体免费视频| 精品久久久久久久久中文字幕 | 欧美精品一区二区三区蜜臀| 欧美熟妇乱码在线一区| 亚洲男人的天堂网站| 91网在线播放| 色在人av网站天堂精品| aaa在线播放视频| 国产精品激情av在线播放| 成人精品在线| 国产一区在线免费| 久久免费大视频| www.av片| 美女视频黄免费的久久 | 中文字幕在线播放av| 欧美一区二区三区在线电影| 少妇精品视频一区二区| 一区二区三区美女xx视频| 中文字幕中文字幕在线十八区 | 亚洲精品18| 欧美一区1区三区3区公司 | 亚洲欧美日韩精品久久久久| 国产精品成人免费一区二区视频| 色综合一区二区| 国产强伦人妻毛片| 亚洲欧美另类在线观看| 粗大黑人巨茎大战欧美成人| 欧美中文字幕在线视频| 青青伊人久久| 久久人人97超碰人人澡爱香蕉| 五月精品视频| 亚洲综合在线网站| 成人小视频免费在线观看| 国产激情av在线| 午夜精品福利一区二区三区蜜桃| 在线视频1卡二卡三卡| 亚洲精品av在线| 欧美精品videossex少妇| 国产精品91视频| 日本在线中文字幕一区| 91大学生片黄在线观看| 免费久久精品视频| 自拍偷拍中文字幕| 亚洲成人第一页| 国产农村妇女毛片精品| 伊人久久精品视频| 色综合桃花网| 成人片在线免费看| 国产精品二区不卡| 亚洲激情在线观看视频| 26uuu欧美| 久久无码精品丰满人妻| 7777女厕盗摄久久久| 国产中文在线视频| 青青草国产精品一区二区| 国产精品17p| 国产性生活免费视频| 久久99久国产精品黄毛片色诱| 国产av自拍一区| 黑人巨大精品欧美一区二区免费| 亚洲伦理在线观看| 久久天天躁夜夜躁狠狠躁2022| 日本a人精品| 亚洲精品自在在线观看| 日韩不卡在线观看日韩不卡视频| 亚洲AV无码国产精品| 午夜一区二区三区视频| 人人妻人人澡人人爽人人欧美一区| 伦伦影院午夜日韩欧美限制| 国产精品日本一区二区不卡视频| 黄色一级片网址| 精品无码三级在线观看视频| 国产一二三四视频| 欧美日韩国产高清一区二区| 99免在线观看免费视频高清| 国产精品精品国产| 欧美日韩水蜜桃| 色婷婷一区二区三区av免费看| 国产精品久久久久久久蜜臀| 国产精品第6页| 中文字幕九色91在线| 精品美女一区| 在线观看成人一级片| 精品一区二区影视| 中国毛片直接看| 日韩精品专区在线影院重磅| 欧美xxxx黑人又粗又长| 粉嫩精品一区二区三区在线观看| 激情久久一区| brazzers精品成人一区| 欧美亚洲国产bt| 欧美私人网站| 97人人模人人爽人人少妇| 精品二区久久| 极品白嫩丰满美女无套| 欧美中文字幕一二三区视频| 老司机福利在线视频| 国产精品成人一区二区三区| 在线日韩欧美| 成人免费无遮挡无码黄漫视频| 欧美日韩视频在线一区二区| 中文字幕在线观看网站| 精品久久久久久一区二区里番| 美女网站久久| 永久免费看mv网站入口| 精品国产区一区| 欧洲一区二区三区精品| 一区精品在线| av不卡免费电影| 中文字幕日本视频| 欧美激情2020午夜免费观看| 宅男在线一区| 亚洲欧美日韩三级| 亚洲成人自拍网| av在线女优影院| 成人av影视在线| 日日摸夜夜添夜夜添亚洲女人| 手机在线免费看毛片| 精品视频久久久久久久| 四虎影视成人精品国库在线观看| www精品久久| 国产精品三级av| 欧美一级做性受免费大片免费| 国产成人精品一区二区| 欧美va天堂| 精品国产成人亚洲午夜福利| 日韩欧美在线观看一区二区三区| 国产精品高清乱码在线观看| 欧美极品少妇无套实战| 国产欧美日韩激情| 欧美在线 | 亚洲|