精品欧美一区二区三区在线观看 _久久久久国色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)

97久久夜色精品国产九色| 在线观看视频99| 欧洲av无码放荡人妇网站| 欧美美女色图| 国内精品伊人久久久久影院对白| 欧美黄色片在线观看| 亚洲综合网在线观看| 在线日韩三级| 欧美色欧美亚洲高清在线视频| 日韩欧美精品一区二区| 风流少妇一区二区三区91| 久久久综合网| 久久久亚洲国产| 午夜激情福利电影| 欧美人体视频| 日韩女优电影在线观看| 亚洲色图久久久| 日本蜜桃在线观看视频| 亚洲欧美成人一区二区三区| 久久人人九九| 丁香六月天婷婷| 精油按摩中文字幕久久| 日韩av毛片网| 黄色激情视频在线观看| 小说区亚洲自拍另类图片专区 | 欧美激情在线观看视频| 鲁丝一区二区三区| 校园春色另类视频| 日韩女优av电影| 午夜免费福利视频在线观看| 欧美激情喷水| 欧美日韩国产在线| 97在线国产视频| 成人在线免费看黄| 国产精品国模大尺度视频| 欧美日韩在线观看一区| 日韩专区第一页| 国产传媒久久文化传媒| 亚洲va欧美va国产综合久久| 在线观看中文字幕2021| 天堂一区二区在线| 青青草国产精品一区二区| 国产精品theporn动漫| 欧美日韩国产色综合一二三四| 日韩中文字幕视频在线| 国产一区二区三区四区在线| 一区二区三区四区在线看| 亚洲激情小视频| 日本黄色动态图| 女人抽搐喷水高潮国产精品| 精品国产免费人成在线观看| 亚洲 自拍 另类 欧美 丝袜| 奇米一区二区| 日韩视频永久免费| 欧美熟妇精品一区二区| 91蝌蚪精品视频| 日韩欧美高清dvd碟片| 日本一本在线视频| 日韩精品视频中文字幕| 日韩欧美国产麻豆| caopor在线| 国产精品高潮呻吟久久久久| 亚洲第一精品夜夜躁人人爽| 日本丰满少妇裸体自慰| 欧美猛男做受videos| 一本色道久久88综合亚洲精品ⅰ| 国产探花视频在线播放| 久久人人88| 久热99视频在线观看| 日日骚一区二区三区| 影音先锋中文字幕一区二区| 91精品国产777在线观看| 亚州国产精品视频| 日韩黄色在线观看| 国产欧洲精品视频| 性色av蜜臀av| 99久久免费精品高清特色大片| 欧美日韩国产综合在线| 在线免费看黄网站| 一区二区三区小说| 黄www在线观看| 欧美大陆国产| 精品国产99国产精品| 女~淫辱の触手3d动漫| 久久神马影院| 久久久久久有精品国产| 亚洲 欧美 中文字幕| 久久精品免费观看| 国产精品福利视频| gogogo高清在线观看免费完整版| 日韩美女精品在线| 精品这里只有精品| 天天综合91| 日韩精品视频在线免费观看| 国产传媒视频在线| 激情综合久久| 国产一区二中文字幕在线看| 免费观看黄色一级视频| 欧美国产视频在线| 国产精品69久久久| 久久91超碰青草在哪里看| 亚洲精品在线电影| 中文字幕精品亚洲| 免费一级欧美片在线播放| 91在线高清免费观看| 国模精品一区二区三区| 黄色aaa毛片| 亚洲国产精品成人综合色在线婷婷 | 亚洲丝袜制服诱惑| 99热在线这里只有精品| 成人亚洲精品| 亚洲精品在线91| 麻豆一区产品精品蜜桃的特点| 久久久国产精品一区二区中文| 92看片淫黄大片欧美看国产片| 黄色片在线免费观看| 亚洲成人综合网站| 麻豆精品国产传媒| 99久久影视| 国产精品∨欧美精品v日韩精品| 亚洲欧美另类综合| 亚洲乱码日产精品bd| 午夜免费福利在线| 亚洲深夜福利在线观看| 久久久久在线观看| 精品国产伦一区二区三| 国产精品日产欧美久久久久| 亚洲国产精品毛片av不卡在线| 中文字幕一区二区三区四区久久 | 麻豆成人免费电影| 欧美黄色直播| 蜜臀久久精品| 亚洲黄色片网站| 久久久久久激情| 国产在线国偷精品产拍免费yy| 亚洲精品美女久久7777777| 超碰国产一区| 亚洲男人天堂2019| 欧产日产国产69| 91色在线porny| 国产成人无码a区在线观看视频| 北条麻妃一区二区三区在线| 九九精品视频在线观看| 国产三级午夜理伦三级| 国产精品久久久久毛片软件| 色噜噜狠狠永久免费| 日韩伦理视频| 国产欧美日韩丝袜精品一区| 欧美精品日韩少妇| 欧美精品免费视频| 亚洲国产精品久| 福利一区二区在线观看| 黄色大片中文字幕| 亚洲精品动态| 国产成人精品久久亚洲高清不卡| yourporn在线观看视频| 欧美欧美欧美欧美| 亚洲精品卡一卡二| 国产黄色精品视频| 三上悠亚久久精品| 中文有码一区| 国产一区视频在线| 国产1区在线| 精品日韩av一区二区| 国产午夜视频在线| 91麻豆swag| 91看片在线免费观看| 中文字幕一区二区av| 国产精品久久久久久久久久久久午夜片 | 欧美激情亚洲视频| 日本天堂影院在线视频| 欧美性淫爽ww久久久久无| 欧美性x x x| www.色精品| 成人精品小视频| 99精品一区| 国产精品国产三级国产专区53 | 亚洲最大福利视频网| 三级福利片在线观看| 精品视频久久久久久| 中文字幕精品一区二区精| 一区二区三区中文字幕精品精品 | 色呦色呦色精品| 欧美日韩一区二区三区四区在线观看| 国产免费一区| 高清av一区| 久久久久久久久久久av| 国产高清在线看| 日韩一级欧美一级| 色屁屁影院www国产高清麻豆| 国产精品福利在线播放| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 无码一区二区三区| 亚洲欧美日本韩国| 美女又爽又黄视频毛茸茸| 黄页网站大全一区二区| 伊人成色综合网| 欧美一区亚洲| 色综合电影网| 免费成人三级| 91一区二区三区| 成人四虎影院| 秋霞av国产精品一区| 午夜dj在线观看高清视频完整版| 亚洲欧美日韩高清| 成人福利小视频| 日本高清免费不卡视频| 国产在线一二区| 亚洲欧美在线aaa| 成年人在线免费看片| 成人免费av资源| 无套内谢丰满少妇中文字幕| 日韩一区精品字幕| 欧美综合在线播放| 午夜久久一区| 桥本有菜av在线| 精品一二三区| 欧美日韩国产免费一区二区三区| 大桥未久女教师av一区二区| 国产精品一区二区性色av| 亚洲精品永久免费视频| 亚州欧美日韩中文视频| 欧美伦理免费在线| 欧美大胆a视频| 欧美性猛交xxx乱大交3蜜桃| 国产亚洲精品综合一区91| 午夜小视频在线播放| 精品国产一区二区三区久久影院| 国产jzjzjz丝袜老师水多| 欧美精品三级在线观看| 国产精品无码一区| 欧美午夜精品理论片a级按摩| 国产一区二区99| 欧美日韩国产色视频| 一级aaa毛片| 精品久久久国产| 日韩免费在线视频观看| 午夜激情久久久| 久久高清免费视频| 亚洲成年人影院| 西西44rtwww国产精品| 天天爽夜夜爽夜夜爽精品视频| 国产精品成人久久| 午夜视频久久久久久| 成人免费看片98欧美| 午夜av一区二区| 国产精品自拍99| 欧美日韩亚洲国产一区| 草莓视频18免费观看| 色噜噜狠狠色综合欧洲selulu| 亚洲成熟少妇视频在线观看| 色猫猫国产区一区二在线视频| 无码无套少妇毛多18pxxxx| 在线观看91精品国产入口| 中文字幕无线码一区| 欧美福利一区二区| 精品人妻aV中文字幕乱码色欲| 日韩一区二区三区观看| 欧美一区二区黄片| 精品丝袜一区二区三区| 国产高清美女一级毛片久久| 日韩一二三在线视频播| 在线看女人毛片| 992tv成人免费影院| 三级成人在线| 91久久夜色精品国产网站| heyzo欧美激情| 免费中文日韩| 99久久精品费精品国产| 99在线观看视频免费| 先锋影音久久久| 污污的网站免费| 成人激情校园春色| 亚洲精品乱码久久久久久久久久久久 | 亚洲综合精品四区| 午夜免费看视频| 成人午夜看片网址| 一级黄色性视频| 亚洲欧美日韩国产综合在线| 伊人365影院| 欧美性xxxxxx少妇| 亚洲av无码乱码国产精品久久| 日韩av在线电影网| 欧美一区二区三区| 欧美野外猛男的大粗鳮| 视频欧美精品| 久久99精品久久久久久久久久| 欧洲毛片在线视频免费观看| 日韩精品福利片午夜免费观看| 亚洲一卡久久| 亚洲女人在线观看| 国产亚洲污的网站| 久艹视频在线观看| 欧美亚洲国产一区二区三区| 亚洲va久久久噜噜噜无码久久| 在线视频精品一| av福利导福航大全在线| 国产在线日韩在线| 欧美调教网站| 91传媒免费视频| 免费成人你懂的| 给我看免费高清在线观看| 亚洲美女在线国产| 中文在线免费观看| 精品在线小视频| 欧美videos另类精品| 国产日韩一区在线| 嫩草影视亚洲| 91丨porny丨探花| 国内精品久久久久影院薰衣草| 亚洲精品国产一区黑色丝袜| 亚洲成年人影院| 性做久久久久久久久久| www亚洲欧美| 亚洲欧美在线成人| 久久精品成人一区二区三区蜜臀| 欧美日本不卡高清| 天天干天天av| 国产精品欧美一级免费| www.com亚洲| 亚洲精品美女在线观看| 草美女在线观看| 99精品在线直播| 中文字幕亚洲综合久久五月天色无吗'' | 一区二区三区四区五区视频| 日韩国产精品久久| 搡老熟女老女人一区二区| 亚洲成av人在线观看| 亚洲h视频在线观看| 欧美日韩成人网| 精品一区二区三区中文字幕| 日韩第一页在线观看| 蜜桃在线一区二区三区| 少妇av片在线观看| 欧日韩精品视频| 国产视频第一页在线观看| 热99精品里视频精品| 亚洲黄页网站| 日韩毛片在线免费看| 久久精品视频网| 亚洲大尺度在线观看| 中文字幕亚洲二区| 成人全视频免费观看在线看| 亚洲开发第一视频在线播放| 欧美a级一区二区| 一二三四国产精品| 欧美三级乱人伦电影| 日p在线观看| 亚洲专区国产精品| 欧美日韩专区| 精品一区二区视频在线观看| 亚洲成av人片在www色猫咪| 日韩中文字幕免费在线观看| 欧美一区二区三区免费观看| 综合综合综合综合综合网| 欧美伦理视频在线观看| 欧美高清在线视频| 国产精品久久影视| 久久91精品国产| 性欧美xxxx免费岛国不卡电影| 成人三级视频在线播放 | 久草精品视频在线观看| 亚洲美女www午夜| 久久精品黄色| 污污污污污污www网站免费| www.爱久久.com| 欧美一区免费看| 日韩视频一区在线| 澳门成人av| 欧美日韩在线观看不卡| 亚洲精品国产一区二区精华液| 日批免费在线观看| 国产精品扒开腿做| 99久久.com| 欧美大片免费播放器| 欧美影片第一页| 亚洲大胆人体大胆做受1| 女人一区二区三区| 狠狠色丁香久久婷婷综合_中| 在线观看成人毛片| 亚洲人a成www在线影院| 精品国产乱码一区二区三区| 欧美 日韩 国产 高清| 国产精品你懂的| 欧美视频在线观看一区二区三区| 国产精品久久久久久久久借妻 | 亚洲桃色综合影院| www.久久久久久久久久久| 午夜久久久久久| 日本成人网址| 久久国产精品高清| 精东粉嫩av免费一区二区三区| 色播视频在线播放| 久久精品国产91精品亚洲| 亚洲高清极品| 少妇熟女视频一区二区三区 | 无码人妻一区二区三区精品视频| 日韩欧美在线播放| caoprom在线| 宅男一区二区三区|