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

Spring聲明式事務(wù)管理源碼解讀之事務(wù)提交

開發(fā) 后端
事務(wù)是所有企業(yè)應(yīng)用系統(tǒng)的核心,之前人們使用ejb的時(shí)候,容器事務(wù)管理(CMT),是slsb最令人稱道的地方,據(jù)說很多人使用ejb,使用slsb就是為了cmt,但是spring出現(xiàn)之后,格局就變了,因?yàn)槌绦騿T又多了一種選擇,就是聲明式事務(wù)管理,聲明式事務(wù)管理是基于AOP的,及AOP是它的底層特性,本文的目的就是為了和大家探討一下spring的聲明式事務(wù)管理,從源代碼來分析它的背后的思想。

相關(guān)文章:Spring聲明式事務(wù)管理源碼解讀之事務(wù)開始

其實(shí)我的感覺就是事務(wù)提交要比事務(wù)開始復(fù)雜,看事務(wù)是否提交我們還是要回到TransactionInterceptor類的invoke方法:

Java代碼

public Object invoke(MethodInvocation invocation) throws Throwable {
    // Work out the target class: may be null.
    // The TransactionAttributeSource should be passed the target class
    // as well as the method, which may be from an interface
    Class targetClass = (invocation.getThis() != null) ? invocation.getThis().getClass() : null;
    
    // Create transaction if necessary.
    TransactionInfo txInfo = createTransactionIfNecessary(invocation.getMethod(), targetClass);
    Object retVal = null;
    try {
      // This is an around advice.
      // Invoke the next interceptor in the chain.
      // This will normally result in a target object being invoked.
      retVal = invocation.proceed();
    }
    catch (Throwable ex) {
      // target invocation exception
      doCloseTransactionAfterThrowing(txInfo, ex);
      throw ex;
    }
    finally {
      doFinally(txInfo);//業(yè)務(wù)方法出棧后必須先執(zhí)行的一個(gè)方法
    }
    doCommitTransactionAfterReturning(txInfo);
    return retVal;
  }

其中的doFinally(txInfo)那一行很重要,也就是說不管如何,這個(gè)doFinally方法都是要被調(diào)用的,為什么它這么重要呢,舉個(gè)例子:

我們還是以propregation_required來舉例子吧,假設(shè)情況是這樣的,AService中有一個(gè)方法調(diào)用了BService中的,這兩個(gè)方法都處在事務(wù)體之中,他們的傳播途徑都是required。那么調(diào)用開始了,AService的方法首先入方法棧,并創(chuàng)建了TransactionInfo的實(shí)例,接著BService的方法入棧,又創(chuàng)建了一個(gè)TransactionInfo的實(shí)例,而重點(diǎn)要說明的是TransactionInfo是一個(gè)自身關(guān)聯(lián)的內(nèi)部類,第二個(gè)方法入棧時(shí),會(huì)給新創(chuàng)建的TransactionInfo的實(shí)例設(shè)置一個(gè)屬性,就是TransactionInfo對(duì)象中的private TransactionInfo oldTransactionInfo;屬性,這個(gè)屬性表明BService方法的創(chuàng)建的TransactionInfo對(duì)象是有一個(gè)old的transactionInfo對(duì)象的,這個(gè)oldTransactionInfo對(duì)象就是AService方法入棧時(shí)創(chuàng)建的TransactionInfo對(duì)象,我們還記得在createTransactionIfNecessary方法里有這樣一個(gè)方法吧:

Java代碼

protected TransactionInfo createTransactionIfNecessary(Method method, Class targetClass) {
        // We always bind the TransactionInfo to the thread, even if we didn't create
    // a new transaction here. This guarantees that the TransactionInfo stack
    // will be managed correctly even if no transaction was created by this aspect.
    txInfo.bindToThread();
    return txInfo;
  }
就是這個(gè)bindToThread()方法在作怪:
private void bindToThread() {
      // Expose current TransactionStatus, preserving any existing transactionStatus for
      // restoration after this transaction is complete.
      oldTransactionInfo = (TransactionInfo) currentTransactionInfo.get();
      currentTransactionInfo.set(this);
    }

如果當(dāng)前線程中已經(jīng)有了一個(gè)TransactionInfo,則拿出來放到新建的transactionInfo對(duì)象的oldTransactionInfo屬性中,然后再把新建的TransactionInfo設(shè)置到當(dāng)前線程中。

這里有一個(gè)概念要搞清楚,就是TransactionInfo對(duì)象并不是表明事務(wù)狀態(tài)的對(duì)象,表明事務(wù)狀態(tài)的對(duì)象是TransactionStatus對(duì)象,這個(gè)對(duì)象同樣是TransactionInfo的一個(gè)屬性。

接下來BService中的那個(gè)方法返回,那么該它退棧了,它退棧后要做的就是doFinally方法,即把它的oldTransactionInfo設(shè)置到當(dāng)前線程中(這個(gè)TransactionInfo對(duì)象顯然就是AService方法入棧時(shí)創(chuàng)建的,怎么現(xiàn)在又要設(shè)置到線程中去呢,原因就是BService的方法出棧時(shí)并不提交事務(wù),因?yàn)锽Service的傳播途徑是required,所以要把棧頂?shù)姆椒ㄋ鶆?chuàng)建transactioninfo給設(shè)置到當(dāng)前線程中),即調(diào)用AService的方法時(shí)所創(chuàng)建的TransactionInfo對(duì)象。那么在AServie的方法出棧時(shí)同樣會(huì)設(shè)置TransactionInfo對(duì)象的oldTransactionInfo到當(dāng)前線程,這時(shí)候顯然oldTransactionInfo是空的,但AService中的方法會(huì)提交事務(wù),所以它的oldTransactionInfo也應(yīng)該是空了。

在這個(gè)小插曲之后,接下來就應(yīng)該是到提交事務(wù)了,之前在AService的方法出棧時(shí),我們拿到了它入棧時(shí)創(chuàng)建的TransactionInfo對(duì)象,這個(gè)對(duì)象中包含了AService的方法事務(wù)狀態(tài)。即TransactionStatus對(duì)象,很顯然,太顯然了,事務(wù)提交中的任何屬性都和事務(wù)開始時(shí)的創(chuàng)建的對(duì)象息息相關(guān),這個(gè)TransactionStatus對(duì)象哪里來的,我們?cè)倩仡^看看createTransactionIfNessary方法吧:

Java代碼

protected TransactionInfo createTransactionIfNecessary(Method method, Class targetClass) {
      txInfo.newTransactionStatus(this.transactionManager.getTransaction(txAttr));
    }

再看看transactionManager.getTransaction(txAttr)方法吧:

Java代碼

public final TransactionStatus getTransaction(TransactionDefinition definition) 
throws TransactionException {
    
    else if (definition.getPropagationBehavior() == TransactionDefinition.PR
OPAGATION_REQUIRED ||
        definition.getPropagationBehavior() == TransactionDefinition.PROP
AGATION_REQUIRES_NEW ||
      definition.getPropagationBehavior() == TransactionDefinition.PROPAGA
TION_NESTED) {
      if (debugEnabled) {
        logger.debug("Creating new transaction with name [" + definition.
getName() + "]");
      }
      doBegin(transaction, definition);
      boolean newSynchronization = (this.transactionSynchronization != SYN
CHRONIZATION_NEVER);
      return newTransactionStatus(definition, transaction, true, newSynchro
nization, debugEnabled, null);
//注意這里的返回值,返回的就是一個(gè)TransactionStatus對(duì)象,這個(gè)對(duì)象表明了一個(gè)事務(wù)的狀態(tài),比
如說是否是一個(gè)新的事務(wù),事務(wù)是否已經(jīng)結(jié)束,等等,這個(gè)對(duì)象是非常重要的,在事務(wù)提交的時(shí)候還是
會(huì)用到它的。    }
      }
  }

#p#

還有一點(diǎn)需要說明的是,AService的方法在執(zhí)行之前創(chuàng)建的transactionstatus確實(shí)是通過這個(gè)方法創(chuàng)建的,但是,BService的方法在執(zhí)行之前創(chuàng)建transactionstatus的方法就與這個(gè)不一樣了,下面會(huì)有詳解。

回顧了事務(wù)開始時(shí)所調(diào)用的方法之后,是不是覺得現(xiàn)在對(duì)spring如何處理事務(wù)越來越清晰了呢。由于這么幾個(gè)方法的調(diào)用,每個(gè)方法入棧之前它的事務(wù)狀態(tài)就已經(jīng)被設(shè)置好了。這個(gè)事務(wù)狀態(tài)就是為了在方法出棧時(shí)被調(diào)用而準(zhǔn)備的。

讓我們?cè)俅位氐紹Service中的方法出棧的那個(gè)時(shí)間段,看看spring都做了些什么,我們知道,后入棧的肯定是先出棧,BService中的方法后入棧,那它肯定要先出棧了,它出棧的時(shí)候是要判斷是否要提交事務(wù),釋放資源的,讓我們來看看TransactionInterceptor的invoke的***那個(gè)方法doCommitTransactionAfterReturning:

Java代碼

protected void doCommitTransactionAfterReturning(TransactionInfo txInfo) {
    if (txInfo != null && txInfo.hasTransaction()) {
      if (logger.isDebugEnabled()) {
        logger.debug("Invoking commit for transaction on " + txInfo.j
oinpointIdentification());
      }
      this.transactionManager.commit(txInfo.getTransactionStatus());
//瞧:提交事務(wù)時(shí)用到了表明事務(wù)狀態(tài)的那個(gè)TransactionStatus對(duì)象了。
    }
  }

看這個(gè)方法的名字就知道spring是要在業(yè)務(wù)方法出棧時(shí)提交事務(wù),貌似很簡(jiǎn)單,但是事實(shí)是這樣的嗎?我們接著往下看。

Java代碼

public final void commit(TransactionStatus status) throws TransactionException {
    DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;
    if (defStatus.isCompleted()) {
      throw new IllegalTransactionStateException(
          "Transaction is already completed - do not call commit or rollback more than once per transaction");
    }
    if (defStatus.isLocalRollbackOnly()) {
      if (defStatus.isDebug()) {
        logger.debug("Transactional code has requested rollback");
      }
      processRollback(defStatus);
      return;
    }
    if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly()) {
      if (defStatus.isDebug()) {
        logger.debug("Global transaction is marked as rollback-only but transactional code requested commit");
      }
      processRollback(defStatus);
      throw new UnexpectedRollbackException(
          "Transaction has been rolled back because it has been marked as rollback-only");
    }
    processCommit(defStatus);
  }

上面這段代碼就是transactionmanager中的commit,但是看上去,它又把自己的職責(zé)分配給別人了,從代碼里我們看到,如果事務(wù)已經(jīng)結(jié)束了就拋異常,如果事務(wù)是rollbackonly的,那么就rollback吧,但是按照正常流程,我們還是想來看一下,事務(wù)的提交,就是processCommit(status)這個(gè)方法吧。

Java代碼

private void processCommit(DefaultTransactionStatus status) throws TransactionException {
    try {
      boolean beforeCompletionInvoked = false;
      try {
        triggerBeforeCommit(status);
        triggerBeforeCompletion(status);
        beforeCompletionInvoked = true;
        if (status.hasSavepoint()) {
          if (status.isDebug()) {
            logger.debug("Releasing transaction savepoint");
          }
          status.releaseHeldSavepoint();
        }
        else if (status.isNewTransaction()) {//這個(gè)判斷非常重要,下面會(huì)詳細(xì)講解這個(gè)判斷的作用
          if (status.isDebug()) {
            logger.debug("Initiating transaction commit");
          }
          boolean globalRollbackOnly = status.isGlobalRollbackOnly();
          doCommit(status);
          // Throw UnexpectedRollbackException if we have a global rollback-only
          // marker but still didn't get a corresponding exception from commit.
          `````````````````````
  }

我們注意到,在判斷一個(gè)事務(wù)是否是新事務(wù)之前還有一個(gè)status.hasSavepoint()的判斷,我認(rèn)為這個(gè)判斷事實(shí)上就是嵌套事務(wù)的判斷,即判斷這個(gè)事務(wù)是否是嵌套事務(wù),如果不是嵌套事務(wù),則再判斷它是否是一個(gè)新事務(wù),下面這段話就非常重要了,BService的中的方法是先出棧的,也就是說在調(diào)用BService之前的創(chuàng)建的那個(gè)事務(wù)狀態(tài)對(duì)象在這里要先被判斷,但是由于在調(diào)用BService的方法之前已經(jīng)創(chuàng)建了一個(gè)Transaction和Session(假設(shè)我們使用的是hibernate3),這時(shí)候在創(chuàng)建第二個(gè)TransactionInfo(再?gòu)?qiáng)調(diào)一下吧,TransactionInfo并不是Transaction,Transaction是真正的事務(wù)對(duì)象,TransactionInfo只不過是一個(gè)輔助類而已,用來記錄一系列狀態(tài)的輔助類)的TransactionStatus的時(shí)候就會(huì)進(jìn)入下面這個(gè)方法(當(dāng)然在這之前會(huì)判斷一下當(dāng)前線程中是否已經(jīng)有了一個(gè)SessionHolder對(duì)象,不清楚SessionHolder作用的同學(xué)請(qǐng)看***篇文章):

Java代碼

private TransactionStatus handleExistingTransaction(
      TransactionDefinition definition, Object transaction, boolean debugEnabled)
      throws TransactionException {
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {
      throw new IllegalTransactionStateException(
          "Transaction propagation 'never' but existing transaction found");
    }
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {
      if (debugEnabled) {
        logger.debug("Suspending current transaction");
      }
      Object suspendedResources = suspend(transaction);
      boolean newSynchronization = (this.transactionSynchronization == SYNCHRONIZATION_ALWAYS);
      return newTransactionStatus(
          definition, null, false, newSynchronization, debugEnabled, suspendedResources);
    }
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
      if (debugEnabled) {
        logger.debug("Suspending current transaction, creating new transaction with name [" +
            definition.getName() + "]");
      }
      Object suspendedResources = suspend(transaction);
      doBegin(transaction, definition);
      boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);
      return newTransactionStatus(
          definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
    }
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
      if (!isNestedTransactionAllowed()) {
        throw new NestedTransactionNotSupportedException(
            "Transaction manager does not allow nested transactions by default - " +
            "specify 'nestedTransactionAllowed' property with value 'true'");
      }
      if (debugEnabled) {
        logger.debug("Creating nested transaction with name [" + definition.getName() + "]");
      }
      if (useSavepointForNestedTransaction()) {
        // Create savepoint within existing Spring-managed transaction,
        // through the SavepointManager API implemented by TransactionStatus.
        // Usually uses JDBC 3.0 savepoints. Never activates Spring synchronization.
        DefaultTransactionStatus status =
            newTransactionStatus(definition, transaction, false, false, debugEnabled, null);
        status.createAndHoldSavepoint();
        return status;
      }
      else {
        // Nested transaction through nested begin and commit/rollback calls.
        // Usually only for JTA: Spring synchronization might get activated here
        // in case of a pre-existing JTA transaction.
        doBegin(transaction, definition);
        boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);
        return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);
      }
    }
    // Assumably PROPAGATION_SUPPORTS.
    if (debugEnabled) {
      logger.debug("Participating in existing transaction");
    }
    boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);
    return newTransactionStatus(definition, transaction, false, newSynchronization, debugEnabled, null);
  }

我們看到這個(gè)方法其實(shí)很明了,就是什么樣的傳播途徑就創(chuàng)建什么樣的transactionstatus,這個(gè)方法是在事務(wù)開始時(shí)被調(diào)用的,拿到我們之前舉的例子中來看下,我們就恍然大悟了,原來,如果之前已經(jīng)創(chuàng)建過事務(wù),那個(gè)這個(gè)新建的transactionstauts就不應(yīng)該是屬于一個(gè)newTransaction了,所以第3個(gè)參數(shù)就是false了。

也就是說,在BService的方法出棧要要執(zhí)行processcommit,但是由于BService的那個(gè)TransactionStatus不是一個(gè)newTransaction,所以它根本不會(huì)觸發(fā)這個(gè)動(dòng)作:

Java代碼

else if (status.isNewTransaction()) {//這個(gè)判斷非常重要,下面會(huì)詳細(xì)講解這個(gè)判斷的作用
          if (status.isDebug()) {
            logger.debug("Initiating transaction commit");
          }
boolean globalRollbackOnly = status.isGlobalRollbackOnly();
          doCommit(status);
}

也就是說在BService的方法出棧后,事務(wù)是不會(huì)提交的。這完全符合propragation_required的模型。

而在AService的方法出棧后,AService的方法所對(duì)應(yīng)的那個(gè)TransactionStatus對(duì)象的newTransaction屬性是為true的,即它會(huì)觸發(fā)上面這段代碼,進(jìn)行真正的事務(wù)提交。讓我們回想一下AService方法入棧之前創(chuàng)建TransactionStatus對(duì)象的情形吧:

newTransactionStatus(definition, transaction, true, newSynchronization, debu
gEnabled, null);

看到第3個(gè)參數(shù)為true沒有。

那么事務(wù)該提交了吧,事務(wù)的提交我想使用過hibernate的人都知道怎么提交了:

txObject.getSessionHolder().getTransaction().commit();

從當(dāng)前線程中拿到SessionHolder,再拿到開始事務(wù)的那個(gè)Transaction對(duì)象,然后再commit事務(wù)。在沒有用spring之前,我們經(jīng)常這么做。

【編輯推薦】

  1. Spring聲明式事務(wù)管理源碼解讀之事務(wù)開始
  2. Spring框架將推出企業(yè)級(jí)Web服務(wù)器
  3. Spring MVC框架的高級(jí)配置
責(zé)任編輯:楊鵬飛 來源: javaeye
相關(guān)推薦

2009-02-11 11:14:31

事務(wù)管理事務(wù)開始Spring

2024-11-13 19:03:14

2009-06-22 09:01:57

Spring聲明式事務(wù)

2023-10-08 08:28:10

Spring事務(wù)管理

2009-06-17 14:57:11

Spring事務(wù)管理

2009-06-30 16:57:42

Spring事務(wù)管理

2009-06-08 17:56:00

SpringJDBC事務(wù)

2023-03-27 10:40:09

2014-08-25 09:12:47

Spring事務(wù)管理

2023-05-06 07:29:49

Spring事務(wù)傳播

2021-09-06 13:42:14

Spring聲明式事務(wù)

2010-03-29 13:34:15

ibmdwSpring

2009-09-25 12:59:53

Hibernate事務(wù)

2010-03-23 08:46:40

Spring

2009-06-17 14:43:47

Spring框架Spring事務(wù)管理

2025-02-08 10:56:18

2009-06-03 10:20:11

Hibernate事務(wù)管理配置

2009-09-23 17:48:00

Hibernate事務(wù)

2009-09-29 09:44:52

Hibernate事務(wù)

2023-04-28 08:21:36

SpringBoot聲明式事務(wù)編程式事務(wù)
點(diǎn)贊
收藏

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

偷拍自拍在线| 国产精品 欧美 日韩| 成人在线黄色| 中文字幕欧美国产| 国产精品亚洲欧美导航| 国产免费一区二区三区四区| 国内精品视频| 亚洲一二三级电影| 久久国产精品免费一区| 制服丝袜在线一区| 亚洲欧美综合久久久| 精品国产青草久久久久福利| 日韩小视频在线播放| 国产精品一区二区婷婷| 激情久久五月天| 欧美激情视频网址| 欧美 日韩 国产 成人 在线观看| 国产成人毛片| 亚洲综合在线视频| 免费精品视频一区| 亚洲影院一区二区三区| 国内自拍一区| 伊人av综合网| 中文字幕一区二区三区人妻在线视频| 无码小电影在线观看网站免费 | 日韩成人精品视频在线观看| 三级网站视频在在线播放| www日韩大片| 国产一区玩具在线观看| 粉嫩aⅴ一区二区三区| 日韩精品欧美| 亚洲精品国精品久久99热一| 欧美婷婷精品激情| av3级在线| 亚洲色欲色欲www| 欧美日韩在线一区二区三区| 国产福利视频导航| 日韩av中文字幕一区二区三区| 欧美猛男性生活免费| 变态另类ts人妖一区二区| www国产精品| 欧美浪妇xxxx高跟鞋交| 国产成人无码精品久久久性色| 91麻豆国产福利在线观看宅福利| 久久精品一区二区三区不卡牛牛| av资源站久久亚洲| 一级黄色片视频| 美日韩精品视频| 久久久亚洲精品视频| a在线视频播放观看免费观看| 国产欧美日韩影院| 亚洲黄一区二区| 女同性αv亚洲女同志| 欧美天堂一区| 欧美性色黄大片| 欧美性久久久久| 多野结衣av一区| 亚洲已满18点击进入久久| 91九色国产ts另类人妖| 五月天婷婷在线视频| 日本一区二区三区四区| 神马影院一区二区| 理论视频在线| 91麻豆福利精品推荐| 国产原创精品| 高清一区二区三区四区| 国产宾馆实践打屁股91| 99电影在线观看| www.天天干.com| 国产精品123| 51国产成人精品午夜福中文下载| 国产伦理一区二区| 国产精品18久久久久久久久 | 91精品在线观| 一区二区三区免费观看视频| 久久99精品久久久久婷婷| 国产精品自产拍在线观| 中文字幕av第一页| 美国av一区二区| 91久久精品国产91性色| 国产乱码精品一区二三区蜜臂 | 一区二区三区黄色| 99国产精品免费| 日韩啪啪电影网| 久久网福利资源网站| 九九热精品免费视频| 亚洲久久在线| 国产99在线|中文| 波多野结衣av无码| 久久av老司机精品网站导航| 成人性生交xxxxx网站| 国产浮力第一页| 99视频国产精品| 免费av在线一区二区| 第九色区av在线| 最近日韩中文字幕| cao在线观看| 国产超碰精品| 91精品国产综合久久精品性色 | 成人国产在线观看| 欧美资源一区| 黄色精品免费看| 午夜欧美一区二区三区在线播放| 国产性xxxx18免费观看视频| 国产91在线精品| 精品av久久707| 成年人在线免费看片| 欧美不卡高清| 欧美一区深夜视频| 国产农村妇女毛片精品| av在线播放不卡| 亚洲欧美成人一区| 2020av在线| 欧美午夜电影一区| 久久久久无码国产精品一区李宗瑞| 亚洲丝袜美腿一区| 欧美成人第一页| 伊人手机在线视频| 国产乱人伦精品一区二区在线观看 | 亚洲欧美色图小说| 无码人妻丰满熟妇区96| 曰本一区二区| 日韩电影免费观看在线观看| 人人干在线观看| 亚洲一区成人| 91久久久一线二线三线品牌| 国产一区精品| 亚洲午夜电影在线观看| 色啦啦av综合| 亚洲尤物av| 欧美国产日产韩国视频| 怡春院在线视频| 26uuu精品一区二区| 成年人视频大全| 欧美成人aaa| 亚洲精品综合久久中文字幕| 精品视频一区二区在线观看| 久久精品999| 日韩精品电影网站| 性xxxxfreexxxxx欧美丶| 日韩欧美一二区| 日本激情视频一区二区三区| 久久午夜精品一区二区| 精品在线不卡| 999福利在线视频| 日韩欧美国产高清| 欧美 日韩 国产 一区二区三区| 青青草视频一区| 欧美精品与人动性物交免费看| 久久免费电影| 欧美刺激午夜性久久久久久久| 51精品免费网站| 老司机精品视频一区二区三区| 欧美一区二区三区在线免费观看 | 懂色av中文字幕| 久久女同精品一区二区| 男人操女人逼免费视频| 久久99国产精品久久99大师| 久久久久久久久久久人体 | 在线āv视频| 717成人午夜免费福利电影| 精品国产aaa| 麻豆成人免费电影| 一区二区免费在线视频| 日韩午夜电影免费看| 日韩视频精品在线| 国产精品免费无遮挡| 亚洲欧洲国产日韩| 伊人精品视频在线观看| 女同性一区二区三区人了人一| 亚洲jizzjizz日本少妇| 欧美家庭影院| 亚洲国产中文字幕在线观看| 欧美一级片免费在线观看| 91一区二区三区在线观看| 日本精品一区在线观看| 精品国产91| 91精品久久久久久久久青青| 久久久久久国产精品免费无遮挡| 91精品国产一区二区| 久久精品国产亚洲av麻豆色欲| 成人精品在线视频观看| 精品少妇人妻av免费久久洗澡| 日韩激情毛片| 国产精品第三页| 日韩三级影院| 欧美夫妻性生活| 青青草原免费观看| 92国产精品观看| 久久精品一区二| 成人写真视频| 亚洲永久在线观看| 无码小电影在线观看网站免费 | 国产三级在线| 欧美日韩1区2区| 久久久久久久久久久久久久免费看 | 天天综合网站| 日韩最新免费不卡| 亚洲国产剧情在线观看| 日韩欧美高清在线视频| 日韩在线不卡av| eeuss国产一区二区三区| 成人亚洲视频在线观看| 欧美一区二区三区久久精品茉莉花| 国产九色91| 成人交换视频| 久久久女人电视剧免费播放下载 | 成人在线观看免费完整| 91在线你懂得| 久久久久xxxx| 国产精品美女久久久| 中文网丁香综合网| 私拍精品福利视频在线一区| 91色中文字幕| 亚洲www.| 欧美激情一区二区三区高清视频| 久久经典视频| 精品国产露脸精彩对白| 亚洲熟妇无码久久精品| 疯狂做受xxxx高潮欧美日本| 免费在线观看a级片| 国产香蕉久久精品综合网| 国产精品偷伦视频免费观看了| 日韩精品乱码免费| 久操网在线观看| 国产精品久久久久久久久久10秀 | 国产99久久| 国产区欧美区日韩区| 色成人综合网| 日韩免费精品视频| 91丝袜在线| 欧美刺激性大交免费视频| www.在线播放| 国产婷婷成人久久av免费高清| 精品人妻一区二区三区麻豆91 | 亚洲精品国产嫩草在线观看| 久久人人爽人人爽人人片av高清| 毛片在线播放a| 国产亚洲欧美日韩精品| 无码国产色欲xxxx视频| 日韩免费高清av| 一卡二卡三卡在线| 欧美主播一区二区三区| 精品免费囯产一区二区三区 | 亚洲精品97久久| 国产精品毛片久久久久久久av| 在线观看亚洲精品视频| 国产视频1区2区| 岛国精品视频在线播放| 日韩欧美亚洲一区二区三区| 亚洲精品成人悠悠色影视| 欧美性生交大片| 中文字幕一区二区三区视频| 林心如三级全黄裸体| 中文字幕+乱码+中文字幕一区| 毛茸茸多毛bbb毛多视频| 97久久超碰精品国产| v天堂中文在线| 99国产精品国产精品毛片| 国产精品一区二区人妻喷水| 成人黄色综合网站| 影音先锋人妻啪啪av资源网站| www.性欧美| 黄色网址在线视频| 久久久久国产精品麻豆ai换脸 | 亚洲欧洲高清| 欧美中文在线观看| 国产精品粉嫩| 日韩美女中文字幕| 色999韩欧美国产综合俺来也| 成人精品在线观看| 亚洲性视频在线| 国产精品国模大尺度私拍| 美国十次av导航亚洲入口| 免费看国产精品一二区视频| 国产99久久| 国产精品夜夜夜爽张柏芝| 欧美三级网页| 久色视频在线播放| 日韩国产精品大片| 国产一级片自拍| 国产成人精品一区二| 亚洲の无码国产の无码步美| 国产亚洲午夜高清国产拍精品| 四虎影视1304t| 亚洲精品成人在线| 4438国产精品一区二区| 欧美另类一区二区三区| 精品人妻午夜一区二区三区四区 | 神马亚洲视频| 一区二区三欧美| 国产激情视频在线| 国产91成人在在线播放| 成人午夜毛片| 99影视tv| 精品国产一区二区三区小蝌蚪| 秋霞在线一区二区| 亚洲综合社区| 国产无遮挡猛进猛出免费软件| 国产成人免费视频网站 | 亚洲第一综合网站| 夜久久久久久| 性生生活大片免费看视频| av中文字幕一区| 日韩av网站在线播放| 亚洲成人午夜电影| 波多野结衣一区二区在线| 日韩无一区二区| 精品美女视频在线观看免费软件| 久久综合88中文色鬼| 美女的胸无遮挡在线观看| 国产日本欧美一区二区三区| 久久99偷拍| 中文字幕中文字幕99| 亚洲尤物在线| 女人扒开双腿让男人捅| 中文字幕精品在线不卡| 日本亚洲欧美在线| 欧美日韩精品欧美日韩精品一| 日韩在线一区二区三区四区| 最近中文字幕日韩精品| 免费看男女www网站入口在线| 亚洲一区二区三区视频| 精品久久精品| 色欲色香天天天综合网www| 狠狠色丁香九九婷婷综合五月| 亚洲区免费视频| 亚洲一二三专区| 国产精品久久影视| 国产一区二区日韩精品欧美精品| 成人一级福利| 99国内精品久久久久久久软件| 日韩国产在线| 国产成人久久婷婷精品流白浆| 国产成人精品免费看| 国产精品视频看看| 欧美视频三区在线播放| 涩爱av在线播放一区二区| 欧美激情视频一区二区三区不卡 | 444亚洲人体| 久久久久久久久久久久久久| 成人黄色一区二区| 26uuu国产电影一区二区| 久久免费视频精品| 91精品在线一区二区| 在线播放麻豆| 国产精品久久久| 国产一区二区三区站长工具| 亚洲中文字幕无码专区| gogo大胆日本视频一区| 日韩av免费网址| 精品免费视频.| 欧美videossex另类| 5566中文字幕一区二区| 综合久久十次| 国产伦精品一区二区三区妓女下载| 亚洲欧洲av在线| 国产又粗又长又大视频| 久久精品免费电影| 国产专区精品| 成人在线视频一区二区三区| 国产成人亚洲综合色影视| 免费看一级一片| 精品国产乱码久久久久久蜜臀| 日韩另类在线| 国产精品日韩二区| 亚洲精品在线二区| 精品黑人一区二区三区观看时间| 欧美日韩在线免费观看| 久久电影视频| 国产欧美精品一区二区三区-老狼| 精品久久影视| 亚洲一级片av| 一区二区三区免费看视频| 亚洲男人第一天堂| 91国内揄拍国内精品对白| 天堂av一区二区三区在线播放| 国产aaa一级片| 中文字幕成人在线观看| 国产极品久久久| 国模精品系列视频| 欧美人与物videos另类xxxxx| 制服丝袜综合网| 亚洲日本一区二区| 日本精品久久久久| 国产99在线|中文| 亚洲精品tv久久久久久久久久| 中国免费黄色片| 91久久精品午夜一区二区| 麻豆影视国产在线观看| 国产精品免费在线| 日韩影院精彩在线| 麻豆天美蜜桃91| 精品视频中文字幕| 日韩久久99| 国产一线二线三线女| 国产午夜亚洲精品不卡 | 欧美精品一区男女天堂| 欧美极品免费| 妞干网视频在线观看|