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

淺談.NET可逆框架設計

開發 后端
前段時間一直在學習和研究.NET事務處理,慢慢的我發現可以使用事務處理來實現一種可逆的系統框架。這種框架在一些IT社區似乎還沒有見過,但是在我們日常開發中確實有這個需求。所以我花了點時間深入的研究了一下事務的原理和使用,實現了以事務為紐帶,以資源為操作對象的可逆框架。

1. 什么是可逆的程序框架

什么叫可逆的?程序的執行是可以被無限制回滾的。

什么叫可逆的框架?實現了對可逆功能的封裝,并能通過簡單的接口調用進行使用。框架可能有大有小,我想這么稱呼它是為了表達它的整體性和重要性。

那么到底可逆的需求在哪里?其實在我們開發程序的時候經常會使用事務來進行業務的控制。比如刪除訂單,然后刪除訂單明細等等,對于這樣的要求很多,我們只能將邏輯控制在一個事務范圍內,不能在沒有事務性的邏輯代碼中編寫這種要求的業務功能。等出現未知錯誤的時候在進行事務的回滾。

你也許會問,使用原來的事務處理不是也能進行回滾嗎?當然不是這么簡單的,我們使用事務回滾時只能將資源回滾到最初未進行事務處理前的狀態。(這里不僅僅指的是數據庫事務,而是全局的事務處理) 我們用圖做個比較。

傳統的事務處理圖:

可逆的事務處理圖:

從這兩幅圖中我們可以很明顯的看出,傳統的事務處理在事務處理的過程當中無法控制中間數據,也就是說無法對事務處理進行分段,然后在進行統一的提交或回滾。

在可逆框架的事務處理里我們就可以控制事務的執行階段,在必要的時候我們只需提交或者回滾某一階段的數據。

1.1環境事務

在可逆框架的事務處理圖中,我們看到事務的開始,然后就進行下一步、下一步這樣的操作。在每進行一個下一步操作的時候,就是進入到了一個子事務里處理,在.NET中是可以進行事務的嵌套,其實也就是依賴事務Dependent Transaction實現。通過使用環境事務可以讓事務性感知代碼能自動的識別出您將要使用事務進行操作。所以在每進行下一步操作的時候,只有將當前環境事務切換為您將依賴的子事務才行。如果只是單純的使用依賴事務對象實例在使用,那么將無法進行諸多其他的事務處理。

2可逆框架的實現原理

由于我們只能控制自定義事務資源管理器的內部實現,所以我們在構建自己的數據處理時問題變的簡單多了。

實現可逆框架的核心技術就是使用依賴事務進行事務的克隆操作。將一個大的事務處理邏輯上切割成多了小的事務操作,然后在進行統一的提交或回滾。

在實現上其實就是將Committable Transaction對象進行包裝,實現簡單的調用接口。這里參照了環境代碼的概念,將對象的生命周期控制在代碼片段中。

2.1自定義資源管理器的實現

我們需要擴展IEnlistmentNotification接口的實現,加入對“上一步”、“下一步”的數據操作。

請看代碼:

  1.  /***  
  2.   * author:深度訓練  
  3.   * blog:http://wangqingpei557.blog.51cto.com/  
  4.   * **/ 
  5.  using System;  
  6.  using System.Collections.Generic;  
  7.  using System.Text;  
  8.  using System.Transactions;  
  9.    
  10. namespace ReversibleLib  
  11. {  
  12.     /// <summary>  
  13.     /// 可逆范圍內的資源管理器。  
  14.     /// 可以使用該類對易失性資源進行事務范圍內的管理。在事務操作范圍內進行可逆操作。  
  15.     /// </summary>  
  16.     /// <typeparam name="T">需要管理的資源類型</typeparam>  
  17.     /// <typeparam name="Xcopy">資源在使用、恢復過程中的數據復制對象。</typeparam>  
  18.     public class ReResourceManager<T, Xcopy> : IEnlistmentNotification, IReversibleGetResourceData<T>  
  19.         where T : classnew()  
  20.         where Xcopy : class 
  21.     {  
  22.         /// <summary>  
  23.         /// 私有字段。資源的持久引用。  
  24.         /// </summary>  
  25.         T _commitfrontvalue;  
  26.         /// <summary>  
  27.         /// 私有字段。事務性操作數據對象。  
  28.         /// </summary>  
  29.         T _rollbackfrontvalue = new T();  
  30.         /// <summary>  
  31.         /// 保存數據復制對象。  
  32.         /// </summary>  
  33.         Xcopy _copy;  
  34.         /// <summary>  
  35.         /// 泛型約束需要,內部使用。  
  36.         /// </summary>  
  37.         public ReResourceManager() { }  
  38.         /// <summary>  
  39.         /// 資源管理器內部名稱。便于追蹤  
  40.         /// </summary>  
  41.         public string Name { getset; }  
  42.         /// <summary>  
  43.         /// 重載默認構造函數,使用資源類型和數據復制對象初始化資源管理器。  
  44.         /// </summary>  
  45.         public ReResourceManager(T t, Xcopy icopy)  
  46.         {  
  47.             (icopy as IResourceCopy<T>).Copy(_rollbackfrontvalue, t);  
  48.             _commitfrontvalue = t;  
  49.             _copy = icopy;  
  50.         }  
  51.  
  52.         #region IEnlistmentNotification 成員  
  53.         public void Prepare(PreparingEnlistment preparingEnlistment)  
  54.         {  
  55.             preparingEnlistment.Prepared();  
  56.         }  
  57.         public void Commit(Enlistment enlistment)  
  58.        {  
  59.             enlistment.Done();  
  60.         }  
  61.         public void InDoubt(Enlistment enlistment)  
  62.         {  
  63.             enlistment.Done();  
  64.         }  
  65.         public void Rollback(Enlistment enlistment)  
  66.         {  
  67.             (_copy as IResourceCopy<T>).Copy(_commitfrontvalue, _rollbackfrontvalue);//回滾事務  
  68.             enlistment.Done();  
  69.         }  
  70.         #endregion  
  71.  
  72.         #region IReversibleGetResourceData<T> 成員  
  73.         T IReversibleGetResourceData<T>.GetPreviousData()  
  74.         {  
  75.             T result = new T();  
  76.             (_copy as IResourceCopy<T>).Copy(result, _rollbackfrontvalue);  
  77.             return result;  
  78.         }  
  79.         T IReversibleGetResourceData<T>.GetNextData()  
  80.         {  
  81.             T result = new T();  
  82.             (_copy as IResourceCopy<T>).Copy(result, _commitfrontvalue);  
  83.             return result;  
  84.         }  
  85.         #endregion  
  86.     }  

2.2可逆框架的入口實現

我們需要簡單的調用就能方便的使用可逆功能,不能以一種新的方式使用。所以這里借鑒了Transaction Scope的設計思想。

請看代碼:

  1. View Code   
  2.  /***  
  3.   * author:深度訓練  
  4.   * blog:http://wangqingpei557.blog.51cto.com/  
  5.   * **/ 
  6.  using System;  
  7.  using System.Collections.Generic;  
  8.  using System.Text;  
  9.  using System.Transactions;  
  10.    
  11.  namespace ReversibleLib  
  12.  {  
  13.      /// <summary>  
  14.      /// 使代碼成為可逆框架的事務性代碼  
  15.      /// </summary>  
  16.      public class ReversibleManagerScope : IDisposable  
  17.      {  
  18.          /// <summary>  
  19.          /// 初始化ReversibleManagerScope新的實例  
  20.          /// </summary>  
  21.          public ReversibleManagerScope()  
  22.          {  
  23.              ReversibleManager._reversibleManager = new ReversibleManager();  
  24.          }  
  25.          /// <summary>  
  26.          /// 使用ReversibleManager對象構造ReversibleManagerScope使用范圍對象  
  27.          /// </summary>  
  28.          /// <param name="manager">ReversibleManager實例</param>  
  29.          public ReversibleManagerScope(ReversibleManager manager)  
  30.          {  
  31.              ReversibleManager._reversibleManager = manager;  
  32.          }  
  33.          /// <summary>  
  34.          /// 使用自定義資源管理器構造ReversibleManagerScope包裝的環境ReversibleManager.Current中的對象實例。  
  35.          /// </summary>  
  36.          /// <param name="source">IEnlistmentNotification資源管理器</param>  
  37.          public ReversibleManagerScope(IEnlistmentNotification source)  
  38.          {  
  39.              ReversibleManager._reversibleManager = new ReversibleManager(source);  
  40.          }  
  41.          /// <summary>  
  42.          /// 全局上下文ReversibleManager對象銷毀  
  43.          /// </summary>  
  44.          public void Dispose()  
  45.          {  
  46.              ReversibleManager._reversibleManager = null;  
  47.          }  
  48.          /// <summary>  
  49.          /// 完成整個操作的提交。該操作將提交事務棧中的所有依賴事務  
  50.          /// </summary>  
  51.          public void Completed()  
  52.          {  
  53.              ReversibleManager.Current.Commit();  
  54.          }  
  55.      }  
  56.      /// <summary>  
  57.      /// 可逆模塊的入口。  
  58.      /// ReversibleManager對事務對象的封裝,實現階段性的事務提交和回滾。  
  59.      /// </summary>  
  60.      public class ReversibleManager  
  61.      {  
  62.          #region 上下文靜態ReversibleManager實例  
  63.          /// <summary>  
  64.          /// 持有對可逆框架的對象引用  
  65.          /// </summary>  
  66.          internal static ReversibleManager _reversibleManager;  
  67.          /// <summary>  
  68.          /// 獲取當前上下文中可逆框架  
  69.          /// </summary>  
  70.          public static ReversibleManager Current  
  71.          {  
  72.              get { return _reversibleManager; }  
  73.          }  
  74.          #endregion  
  75.    
  76.          #region 構造對象  
  77.          /// <summary>  
  78.          /// 默認構造函數  
  79.          /// </summary>  
  80.          public ReversibleManager() { }  
  81.          /// <summary>  
  82.          /// 表示可提交的事務(主事務)  
  83.          /// </summary>  
  84.          private CommittableTransaction _commiTransaction;  
  85.          /// <summary>  
  86.          /// 支持兩階段提交協議的資源管理器(主資源管理器)  
  87.          /// </summary>  
  88.          private IEnlistmentNotification _resourceManager;  
  89.          /// <summary>  
  90.          /// 重載構造函數,使用自定義資源管理器構造可逆模塊的開始。  
  91.          /// </summary>  
  92.          /// <param name="resource">IEnlistmentNotification接口對象</param>  
  93.          public ReversibleManager(IEnlistmentNotification resource)  
  94.          {  
  95.              _resourceManager = resource;  
  96.              InitLoad(IsolationLevel.Serializable);  
  97.          }  
  98.          /// <summary>  
  99.          /// 重載構造函數,使用自定義資源管理器、內部事務范圍的事務隔離級別構造可逆模型的開始。  
  100.          /// </summary>  
  101.          /// <param name="resource">IEnlistmentNotification接口對象</param>  
  102.          /// <param name="isolationlevel">IsolationLevel枚舉成員</param>  
  103.          public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel)  
  104.          {  
  105.              _resourceManager = resource;  
  106.              InitLoad(isolationlevel);  
  107.          }  
  108.          /// <summary>  
  109.          /// 事務初始化階段的參數對象  
  110.          /// </summary>  
  111.          TransactionOptions _options;  
  112.          /// <summary>  
  113.          /// 重載構造函數,使用自定義資源管理器、內部事務范圍的事務隔離級別、事務超時時間范圍構造可逆模塊的開始。  
  114.          /// </summary>  
  115.          /// <param name="resource">IEnlistmentNotification接口對象</param>  
  116.          /// <param name="isolationlevel">IsolationLevel枚舉成員</param>  
  117.          /// <param name="span">TimeSpan時間范圍</param>  
  118.          public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel, TimeSpan span)  
  119.          {  
  120.              _options = new TransactionOptions();  
  121.              _options.Timeout = span;  
  122.              InitLoad(isolationlevel);  
  123.          }  
  124.          /// <summary>  
  125.          /// 構造CommittableTransaction對象實例。  
  126.          /// </summary>  
  127.          /// <param name="level">事務隔離級別</param>  
  128.          private void InitLoad(IsolationLevel level)  
  129.          {  
  130.              if (_options == null)  
  131.                  _options = new TransactionOptions();  
  132.              _options.IsolationLevel = level;  
  133.              _commiTransaction = new CommittableTransaction(_options);  
  134.              _commiTransaction.EnlistVolatile(_resourceManager, EnlistmentOptions.None);  
  135.              //作為事務棧的頭開始整個可逆結構。  
  136.              _tranStack.Push(_commiTransaction);//壓入事務棧  
  137.              _resourceStack.Push(_resourceManager);//壓入資源棧  
  138.              //設置環境事務,讓所有支持事務性感知框架的代碼都能執行。  
  139.              Transaction.Current = _commiTransaction;  
  140.          }  
  141.          #endregion  
  142.    
  143.          /// <summary>  
  144.          /// 事務棧,依次存放事務。  
  145.          /// </summary>  
  146.          private System.Collections.Generic.Stack<Transaction> _tranStack = new Stack<Transaction>();  
  147.          /// <summary>  
  148.          /// 資源棧,依次存放事務使用的資源。  
  149.          /// </summary>  
  150.          private System.Collections.Generic.Stack<IEnlistmentNotification> _resourceStack = new Stack<IEnlistmentNotification>();  
  151.          /// <summary>  
  152.          /// 階段性事件委托  
  153.          /// </summary>  
  154.          /// <param name="tran">Transaction環境事務</param>  
  155.          public delegate void PhaseHanlder(System.Transactions.Transaction tran);  
  156.          /// <summary>  
  157.          /// 下一步事件  
  158.          /// </summary>  
  159.          public event PhaseHanlder NextEvent;  
  160.          /// <summary>  
  161.          /// 上一步事件  
  162.          /// </summary>  
  163.          public event PhaseHanlder PreviousEvent;  
  164.          /// <summary>  
  165.          /// 開始下一步操作  
  166.          /// </summary>  
  167.          /// <typeparam name="S">IEnlistmentNotification接口實現</typeparam>  
  168.          /// <param name="level">IsolationLevel事務的隔離級別(對全局事務處理設置)</param>  
  169.          /// <param name="source">下一步操作的自定義數據管理器</param>  
  170.          public void Next<S>(IsolationLevel level, S source)  
  171.              where S : class,IEnlistmentNotification, new()  
  172.          {  
  173.              Transaction tran = _tranStack.Peek();//獲取事務棧的頂端事務  
  174.              if (tran == null)  
  175.                  tran = Transaction.Current;//主事務  
  176.              DependentTransaction depentran = tran.DependentClone(DependentCloneOption.BlockCommitUntilComplete);  
  177.              //將本次事務處理的資源管理器壓入資源棧中  
  178.              depentran.EnlistVolatile(source, EnlistmentOptions.None);  
  179.              _tranStack.Push(depentran);  
  180.              _resourceStack.Push(source);  
  181.              //切換環境事務場景  
  182.              Transaction.Current = depentran;  
  183.              if (NextEvent != null)  
  184.                  if (NextEvent.GetInvocationList().Length > 0)  
  185.                      NextEvent(Transaction.Current);  
  186.          }  
  187.          /// <summary>  
  188.          /// 返回上一步操作  
  189.          /// </summary>  
  190.          /// <typeparam name="T">需要接受的數據對象類型</typeparam>  
  191.          /// <param name="refadd">需要接受的數據對象引用</param>  
  192.          public void Previous<T>(out T refadd) where T : class,new()  
  193.          {  
  194.              Transaction tran = _tranStack.Pop();  
  195.              if (tran == null)//頂層事務  
  196.                  Transaction.Current.Rollback();  
  197.              // tran.Rollback();//回滾本事務,將觸發所有克隆事務的回滾。  
  198.              if (PreviousEvent != null)  
  199.                  if (PreviousEvent.GetInvocationList().Length > 0)  
  200.                  {  
  201.                      //設置上一步數據對象  
  202.                      refadd = (_resourceStack.Pop() as IReversibleGetResourceData<T>).GetPreviousData();  
  203.                      PreviousEvent(Transaction.Current);  
  204.                      return;  
  205.                  }  
  206.              refadd = new T();//事務處理異常  
  207.          }  
  208.          /// <summary>  
  209.          /// 提交事物堆棧中的所有事物  
  210.          /// </summary>  
  211.          public void Commit()  
  212.          {  
  213.              if (Transaction.Current is DependentTransaction)  
  214.                  (Transaction.Current as DependentTransaction).Complete();  
  215.              for (int i = 0; i < _tranStack.Count - 1; i++)  
  216.              {  
  217.                  //依賴事務  
  218.                  (_tranStack.Pop() as DependentTransaction).Complete();  
  219.              }  
  220.              //提交事務,主事務。必須進行克隆主體的提交才能完成所有階段的操作。  
  221.              (_tranStack.Pop() as CommittableTransaction).Commit();  
  222.          }  
  223.          /// <summary>  
  224.          /// 回滾事物堆棧中的所有事物  
  225.          /// </summary>  
  226.          public void RollBack()  
  227.          {  
  228.              if (Transaction.Current is DependentTransaction)  
  229.                  (Transaction.Current as DependentTransaction).Rollback();  
  230.              for (int i = 0; i < _tranStack.Count - 1; i++)  
  231.              {  
  232.                  //依賴事務  
  233.                  (_tranStack.Pop() as DependentTransaction).Rollback();  
  234.              }  
  235.              //提交事務,主事務。必須進行克隆主體的提交才能完成所有階段的操作。  
  236.              (_tranStack.Pop() as CommittableTransaction).Rollback();  
  237.          }  
  238.      }  
  239.  } 

3.示例

這里我使用了一個簡單的String Builder作為資源管理器需要管理的對象。

請看代碼:

  1. View Code   
  2.  /***  
  3.   * author:深度訓練  
  4.   * blog:http://wangqingpei557.blog.51cto.com/  
  5.   * **/ 
  6.  using System;  
  7.  using System.Collections.Generic;  
  8.  using System.Text;  
  9.  using System.Data;  
  10.  using System.Transactions;  
  11.  using ReversibleLib;  
  12.    
  13.  namespace ConsoleApplication1  
  14.  {  
  15.      class Program  
  16.      {  
  17.          static void Main(string[] args)  
  18.          {  
  19.              //構造數據  
  20.              StringBuilder strbuilder = new StringBuilder();  
  21.              strbuilder.Append("0");//初始數據為0  
  22.    
  23.              //資源管理器  
  24.              ReResourceManager<StringBuilder, StringBuilderCopy> strResource =  
  25.                  new ReResourceManager<StringBuilder, StringBuilderCopy>(strbuilder, new StringBuilderCopy());  
  26.              strResource.Name = "0資源管理器";  
  27.              //開始進入可逆框架處理環境  
  28.              using (ReversibleManagerScope reversible = new ReversibleManagerScope(strResource))  
  29.              {  
  30.                  try 
  31.                  {  
  32.                      ReversibleManager.Current.PreviousEvent += new ReversibleManager.PhaseHanlder(Current_PreviousEvent);  
  33.                      ReversibleManager.Current.NextEvent += new ReversibleManager.PhaseHanlder(Current_NextEvent);  
  34.                      strbuilder.Append("1");//***修改數據為01  
  35.    
  36.                      //獲取下一步操作的數據  
  37.                      StringBuilder strbuilder2 = (strResource as IReversibleGetResourceData<StringBuilder>).GetNextData();  
  38.                      //構造下一步操作的自定義資源管理器  
  39.                      ReResourceManager<StringBuilder, StringBuilderCopy> strResource2 =  
  40.                          new ReResourceManager<StringBuilder, StringBuilderCopy>(strbuilder2, new StringBuilderCopy());  
  41.                      strResource2.Name = "2資源管理器";  
  42.                      ReversibleManager.Current.Next<ReResourceManager<StringBuilder, StringBuilderCopy>>(  
  43.                          System.Transactions.IsolationLevel.Serializable, strResource2);  
  44.                      strbuilder2.Append("2");//第二步修改數據為012  
  45.    
  46.                      //返回上一步,也就是回滾對數據進行“2”設置的前一個狀態  
  47.                      StringBuilder strbuilder3;  
  48.                      ReversibleManager.Current.Previous<StringBuilder>(out strbuilder3);//獲取上一步使用的數據,這里應該是01  
  49.    
  50.                      reversible.Completed();//提交所有操作  
  51.                      Console.WriteLine(strbuilder3);  
  52.                  }  
  53.                  catch (Exception err)  
  54.                  { Console.WriteLine(err.Message); ReversibleManager.Current.RollBack(); }  
  55.              }  
  56.              Console.ReadLine();  
  57.          }  
  58.    
  59.          static void Current_NextEvent(Transaction tran)  
  60.          {  
  61.              Console.WriteLine("下一步:" + tran.TransactionInformation.LocalIdentifier);  
  62.              Console.WriteLine("下一步:" + tran.TransactionInformation.DistributedIdentifier);  
  63.          }  
  64.          static void Current_PreviousEvent(Transaction tran)  
  65.          {  
  66.              Console.WriteLine("上一步:" + tran.TransactionInformation.LocalIdentifier);  
  67.              Console.WriteLine("上一步:" + tran.TransactionInformation.DistributedIdentifier);  
  68.          }  
  69.      }  
  70.  } 

這里我使用0作為資源的初始數據,然后進入到***個環節,我將它附加了1,然后進入到第二個環節,我將它附加了2,這里應該是012了,但是下面我突然又返回到了上一步,所以***的數據應該是01。如果我們需要使用復雜的數據對象,如常用的Data Table類型,我們一般都是用它來展現一組數據,然后對這組數據進行一系列的操作。

總結:

這篇文章主要是想介紹一下事務的另一種使用方式,對可逆框架的設計方向算是一個拋磚引玉吧,希望大家用的著。

源碼地址:http://files.cnblogs.com/wangiqngpei557/Reversible.zip

 

 

 

原文:http://www.cnblogs.com/wangiqngpei557/archive/2012/06/24/2560576.html

【編輯推薦】

  1. 如何解決京東商城的性能瓶頸?
  2. ASP.NET性能優化之反向代理緩存
  3. .NET程序員不要錯過如此強大的T4模板
  4. ASP.NET MVC會成為ASP.NET未來主流的UI平臺?
  5. AgileEAS.NET實現醫院信息系統的解決方案
責任編輯:彭凡 來源: 博客園
相關推薦

2012-06-25 12:43:26

.NET框架

2009-07-22 13:24:24

ASP.NET MVC

2016-03-23 11:05:58

Socket開發框架分析

2009-09-08 09:12:12

LINQ構建框架設計

2020-07-30 10:35:32

Java反射框架設計

2012-01-18 10:20:42

框架設計

2009-08-10 10:19:47

ASP.NET組件設計

2009-04-24 09:43:09

.NETASP.NET框架

2010-09-25 13:09:39

UISymbian

2012-01-10 10:04:43

Node.js

2022-06-15 11:01:59

自定義SPIJava

2011-04-22 09:26:57

MVC設計

2021-02-23 08:18:04

Java 反射機制

2022-10-10 09:11:12

互聯網存儲系統云計算

2022-09-15 18:32:13

SPI模型框架

2012-04-24 09:55:29

.NET

2009-07-27 17:20:05

2022-09-25 21:45:54

日志平臺

2017-04-12 23:33:38

DevOps平衡計分卡框架

2022-04-03 15:44:55

Vue.js框架設計設計與實現
點贊
收藏

51CTO技術棧公眾號

久久亚洲精品人成综合网| 国精产品乱码一区一区三区四区| 久久不见久久见国语| 欧美在线一区二区| 制服国产精品| 神马一区二区三区| 日韩国产精品大片| 欧美成年人视频| 熟女人妻在线视频| 日本午夜精品久久久久| 亚洲二区在线视频| 亚洲国产一区二区三区在线| 国产福利第一页| 男女av一区三区二区色多| 日韩视频免费在线| 黄色录像a级片| 日韩一区二区三区四区五区| 亚洲国产成人精品视频| 日韩女优中文字幕| 丰满岳乱妇国产精品一区| 轻轻草成人在线| 久久久久久国产精品美女| 亚洲第一综合网| 国产+成+人+亚洲欧洲在线| 欧美日韩精品一区二区| 免费观看美女裸体网站| 国内精品不卡| 国产日韩成人精品| 国产在线精品一区二区中文| 国产农村老头老太视频| 视频一区二区国产| 992tv在线成人免费观看| 欧美爱爱免费视频| 秋霞欧美视频| 亚洲天堂av综合网| 中文字幕影片免费在线观看| av成人资源| 91精品午夜视频| 手机在线成人免费视频| **在线精品| 姬川优奈aav一区二区| 国产精品日韩三级| 欧美69xxx| 国产精品久久久久国产精品日日| 欧美一区二区三区电影在线观看| 秋霞网一区二区| 懂色av中文字幕一区二区三区 | 欧美一区二区三区电影在线观看| 免费激情视频网站| 国产91精品入口| 99国产超薄丝袜足j在线观看 | 亚洲成人黄色网| 国产老头和老头xxxx×| 亚洲精品大片| 欧美丰满一区二区免费视频| 欧美伦理片在线观看| 久久人体av| 欧美精品v日韩精品v韩国精品v| 亚洲色图久久久| 少妇精品视频一区二区免费看| 在线欧美小视频| 少妇黄色一级片| 久久91视频| 欧美另类久久久品| 天天色天天综合网| 国产精一区二区| 日韩小视频在线观看专区| 91人人澡人人爽| 欧美wwwsss9999| 日韩精品福利在线| 在线免费观看视频| 日韩在线综合| 久久91超碰青草是什么| 国产午夜视频在线播放| 性欧美xxxx大乳国产app| 国产成人涩涩涩视频在线观看| 最近中文字幕免费在线观看| 久国产精品韩国三级视频| 91欧美激情另类亚洲| 蜜臀av中文字幕| www亚洲一区| 亚洲精品视频一二三| 男人天堂手机在线| 午夜久久久久久电影| 成人小视频在线看| 91丨精品丨国产| 欧美一二三区精品| 亚洲精品视频大全| 999国产精品视频| 欧美激情精品久久久久久变态| 欧美特黄aaaaaa| 男人的j进女人的j一区| 999视频在线观看| 清纯唯美亚洲色图| 亚洲婷婷在线视频| 9久久9毛片又大又硬又粗| 在线成人视屏 | 欧美黄色一区| 97香蕉超级碰碰久久免费的优势| 九九热最新视频| 国产福利精品导航| 日韩经典在线视频| av毛片在线播放| 日韩欧美国产骚| 午夜福利123| 少妇久久久久| 九九精品在线播放| 一级黄色av片| 成人国产视频在线观看| 亚洲成人蜜桃| 九色porny丨首页入口在线| 欧美日本视频在线| 中文字幕精品视频在线| 99精品网站| 日韩av手机在线观看| 精品人妻伦一二三区久久| 国产嫩草影院久久久久| www插插插无码视频网站| 久久91视频| 亚洲欧洲在线免费| 日韩少妇高潮抽搐| 国产69精品久久久久777| 午夜精品区一区二区三| 午夜激情在线播放| 精品国产露脸精彩对白| 免费看特级毛片| 亚洲伊人网站| 不卡视频一区二区| 成年人网站在线| 精品久久久久久久久久久久| 可以看的av网址| 91九色精品| 国产美女精品免费电影| 二区在线观看| 91福利社在线观看| 亚洲熟妇无码av| 国产偷自视频区视频一区二区| 999精品在线观看| 在线网址91| 91精品国产91热久久久做人人| 亚洲一二三精品| 日韩和的一区二区| 日本一区二区三区视频在线播放| 欧美无毛视频| 亚洲美女动态图120秒| 97人人澡人人爽人人模亚洲| 成人不卡免费av| 丰满的少妇愉情hd高清果冻传媒| 亚洲超碰在线观看| 久久国产精彩视频| www.精品视频| 一区二区三区av电影| 欧美久久久久久久久久久| 欧美日韩网站| 国产欧美一区二区三区另类精品| 欧美aaaxxxx做受视频| 日韩一级欧美一级| 中文字幕影音先锋| 成人精品视频网站| 国产视频九色蝌蚪| 免费看成人哺乳视频网站| 国产成人综合久久| av中文在线| 欧美精品 日韩| 久久午夜无码鲁丝片| 粉嫩绯色av一区二区在线观看| 国产一区二区四区| 自拍偷拍一区| 国产精品久久久精品| 欧美一区二区三区| 日韩精品一区二区三区中文不卡| 伊人国产在线观看| 久久免费电影网| 日本激情综合网| 综合亚洲视频| 精品视频导航| 久久国产三级| 久久久久久久久国产| 日本福利午夜视频在线| 欧美日韩情趣电影| 久久久久久久极品内射| 91伊人久久大香线蕉| 欧美性猛交xxx乱久交| 欧美精品色网| 欧美日韩高清免费| 国产精品亚洲四区在线观看| 国内成人精品一区| 成人好色电影| 亚洲成人黄色在线观看| 亚洲 小说区 图片区| 一区二区三区日本| www.狠狠爱| 国产精品99久久久| 99精品视频播放| 中文精品电影| 欧美午夜欧美| 一区二区中文字幕在线观看| 国产成人精品优优av| 日本一本在线免费福利| 亚洲天堂第二页| 黄色一级大片在线免费看国产一 | 欧洲成人一区二区三区| 欧美综合色免费| 国产香蕉在线视频| 日韩理论片中文av| 免费污网站在线观看| 成人毛片老司机大片| 在线不卡一区二区三区| 久久久久国产精品午夜一区| 欧美中日韩在线| 久久国产精品亚洲人一区二区三区| 国产精品夜夜夜一区二区三区尤| 欧美123区| 57pao精品| 色在线视频网| yw.139尤物在线精品视频| 免费在线高清av| 亚洲二区中文字幕| 精品区在线观看| 777久久久精品| 中文字幕一二三四| 色偷偷久久人人79超碰人人澡| 精品无码人妻一区二区三区品 | 成人国产亚洲欧美成人综合网| 国产日韩欧美久久| 天堂蜜桃91精品| 91精品91久久久中77777老牛| 亚洲一区在线| 国产精品h视频| 日韩美女一区二区三区在线观看| 欧美激情论坛| 日韩在线麻豆| 国产亚洲自拍偷拍| 亚洲国产欧美在线观看| 成人免费视频网| 欧美性www| 国产精品视频精品| 欧美日韩在线精品一区二区三区激情综合| 91爱视频在线| 天堂在线中文网官网| 午夜精品久久久久久久久久久久久| 在线看女人毛片| 欧美另类暴力丝袜| 午夜成年人在线免费视频| 欧美成人精品xxx| 国产美女福利在线| 久久亚洲精品一区| 性欧美高清come| 欧美成人免费在线视频| 羞羞污视频在线观看| 欧美激情xxxx性bbbb| 成人影音在线| 992tv成人免费视频| 69久成人做爰电影| 国产999在线观看| 精品国模一区二区三区| 国产精品久久久久久久9999| 国产成+人+综合+亚洲欧美| 国产精品自拍偷拍| 九九99久久精品在免费线bt| 亚洲伊人第一页| 精品欧美午夜寂寞影院| 久久久久久草| 不卡在线一区| 中文字幕一区综合| 欧美日本二区| 欧美牲交a欧美牲交| 首页欧美精品中文字幕| 五月婷婷丁香综合网| 久久av老司机精品网站导航| 91网址在线观看精品| 国产91丝袜在线18| 搡老熟女老女人一区二区| 国产亚洲一本大道中文在线| 男女全黄做爰文章| 亚洲在线视频网站| 激情视频网站在线观看| 欧美精品xxxxbbbb| 特级丰满少妇一级aaaa爱毛片| 亚洲天堂av在线免费| free性欧美hd另类精品| 午夜精品久久久久久久久久久久久| 日韩在线影院| 18成人免费观看网站下载| 老司机凹凸av亚洲导航| 亚洲精品一区二区三区樱花| 欧美日韩岛国| 三级a在线观看| 成人国产电影网| 手机看片国产日韩| 亚洲自拍偷拍欧美| 少妇又紧又色又爽又刺激视频| 日韩久久久久久| 国产鲁鲁视频在线观看免费| 欧美日韩高清在线观看| 国产精品高清乱码在线观看| 亚洲一区二区三区在线免费观看| 婷婷成人综合| 日本黄网站色大片免费观看| 老色鬼久久亚洲一区二区| aaaaaaaa毛片| 国产清纯美女被跳蛋高潮一区二区久久w | 日本黄色福利视频| 99久久综合国产精品| fc2ppv在线播放| 色婷婷综合视频在线观看| 99视频在线观看免费| 国产亚洲欧洲在线| 华人av在线| 亚洲伊人一本大道中文字幕| 国产精品一区高清| 黄页免费在线观看视频| 国内久久婷婷综合| 91激情视频在线观看| 五月天国产精品| 超碰在线观看99| 最近更新的2019中文字幕| 亚洲黄色中文字幕| 高清一区二区三区视频| 99久久综合| 三级a在线观看| 久久久美女毛片| 国产一级做a爱片久久毛片a| 欧美大胆一级视频| 好吊日视频在线观看| 国产精品视频在线观看| 欧美日本成人| 18岁网站在线观看| 成人免费av资源| 欧美日韩在线视频免费播放| 欧美日韩亚洲不卡| 992tv免费直播在线观看| 欧美一级大片视频| 欧美福利在线播放网址导航| 无码人妻精品一区二区蜜桃百度| 精品一区二区三区久久久| 手机毛片在线观看| 91福利在线看| 成年人在线观看网站| 国产精品观看在线亚洲人成网| 综合亚洲自拍| 成年人视频在线免费| 久久夜色精品国产欧美乱极品| 久久夜靖品2区| 精品视频在线播放免| 在线视频超级| 欧美日韩精品久久| 日本欧美久久久久免费播放网| 婷婷色一区二区三区| 日韩欧美亚洲成人| 亚洲三区在线观看无套内射| 热久久99这里有精品| 美女视频亚洲色图| 久久99久久久久久| 99久久99久久久精品齐齐| 青青青国产在线| 亚洲桃花岛网站| 国产原创一区| 久久av喷吹av高潮av| 国产99久久精品| 久久久久久久久久久久久久av| 日韩精品中文字幕在线播放| 性欧美1819sex性高清| 日韩av一区二区三区在线| 久久精品国产精品亚洲综合| 日本高清一二三区| 精品成a人在线观看| 制服丝袜专区在线| 亚洲精品一区国产精品| 国产精品一区免费在线观看| 国产亚洲精品成人| 国产丝袜一区视频在线观看| 天堂久久午夜av| 青青草影院在线观看| 99麻豆久久久国产精品免费优播| 波多野结衣黄色| 久久国产精品久久久久久久久久| 国产精品巨作av| 亚洲激情在线观看视频| 亚洲欧美二区三区| 亚州精品国产精品乱码不99按摩| 国产精品吊钟奶在线| 一本到12不卡视频在线dvd| www国产视频| 欧美日韩在线不卡| 2020av在线| 亚洲欧美日韩精品久久久 | 久久99精品国产麻豆婷婷洗澡| 看片网站在线观看| 亚洲片av在线| 在线一区二区三区视频| 国产a级片免费观看| 一区二区在线观看视频| 免费在线观看一级毛片| 97超级碰碰| 日本午夜精品视频在线观看| 久久久香蕉视频| 日韩中文字幕在线观看| 国产人妖ts一区二区| 色噜噜狠狠一区二区|