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

事務注解 @Transactional失效的3種場景及解決辦法

開發 后端
本文介紹了@Transactional 失效的3種場景及解決辦法 ,一起來看看吧。

  [[393149]]

Transactional失效場景

第一種 Transactional注解標注方法修飾符為非public時,@Transactional注解將會不起作用。例如以下代碼,定義一個錯誤的@Transactional標注實現,修飾一個默認訪問符的方法: 

  1. /**  
  2.  * @author zhoujy  
  3.  **/  
  4. @Component  
  5. public class TestServiceImpl {  
  6.     @Resource  
  7.     TestMapper testMapper;   
  8.      @Transactional  
  9.     void insertTestWrongModifier() { 
  10.         int re = testMapper.insert(new Test(10,20,30));  
  11.         if (re > 0) {  
  12.             throw new NeedToInterceptException("need intercept");  
  13.         }  
  14.         testMapper.insert(new Test(210,20,30));  
  15.     }  

在同一個包內,新建調用對象,進行訪問。 

  1. @Component  
  2. public class InvokcationService {  
  3.     @Resource  
  4.     private TestServiceImpl testService;  
  5.     public void invokeInsertTestWrongModifier(){  
  6.         //調用@Transactional標注的默認訪問符方法  
  7.         testService.insertTestWrongModifier(); 
  8.      }  

測試用例: 

  1. @RunWith(SpringRunner.class)  
  2. @SpringBootTest  
  3. public class DemoApplicationTests {  
  4.    @Resource  
  5.    InvokcationService invokcationService;  
  6.    @Test  
  7.    public void  testInvoke(){  
  8.       invokcationService.invokeInsertTestWrongModifier();  
  9.    }  

以上的訪問方式,導致事務沒開啟,因此在方法拋出異常時,testMapper.insert(new Test(10,20,30));操作不會進行回滾。如果TestServiceImpl#insertTestWrongModifier方法改為public的話將會正常開啟事務,testMapper.insert(new Test(10,20,30));將會進行回滾。

第二種失效場景

在類內部調用調用類內部@Transactional標注的方法,這種情況下也會導致事務不開啟。示例代碼如下,設置一個內部調用: 

  1. /**  
  2.  * @author zhoujy  
  3.  **/  
  4. @Component  
  5. public class TestServiceImpl implements TestService { 
  6.     @Resource  
  7.     TestMapper testMapper;  
  8.     @Transactional  
  9.     public void insertTestInnerInvoke() {  
  10.         //正常public修飾符的事務方法  
  11.         int re = testMapper.insert(new Test(10,20,30));  
  12.         if (re > 0) {  
  13.             throw new NeedToInterceptException("need intercept");  
  14.         }  
  15.         testMapper.insert(new Test(210,20,30));  
  16.     }  
  17.     public void testInnerInvoke(){  
  18.         //類內部調用@Transactional標注的方法。  
  19.         insertTestInnerInvoke();  
  20.     }  

測試用例: 

  1. @RunWith(SpringRunner.class)  
  2. @SpringBootTest  
  3. public class DemoApplicationTests {  
  4.    @Resource  
  5.    TestServiceImpl testService;  
  6.    /**  
  7.     * 測試內部調用@Transactional標注方法  
  8.     */  
  9.    @Test  
  10.    public void  testInnerInvoke(){  
  11.        //測試外部調用事務方法是否正常  
  12.       //testService.insertTestInnerInvoke();  
  13.        //測試內部調用事務方法是否正常  
  14.       testService.testInnerInvoke();  
  15.    }  

上面就是使用的測試代碼,運行測試知道,外部調用事務方法能夠征程開啟事務,testMapper.insert(new Test(10,20,30))操作將會被回滾;

然后運行另外一個測試用例,調用一個方法在類內部調用內部被@Transactional標注的事務方法,運行結果是事務不會正常開啟,testMapper.insert(new Test(10,20,30))操作將會保存到數據庫不會進行回滾。

第三種失效場景

事務方法內部捕捉了異常,沒有拋出新的異常,導致事務操作不會進行回滾。示例代碼如下。 

  1. /**  
  2.  * @author zhoujy  
  3.  **/  
  4. @Component  
  5. public class TestServiceImpl implements TestService {  
  6.     @Resource  
  7.     TestMapper testMapper;  
  8.     @Transactional  
  9.     public void insertTestCatchException() {  
  10.         try {  
  11.             int re = testMapper.insert(new Test(10,20,30));  
  12.             if (re > 0) {  
  13.                 //運行期間拋異常  
  14.                 throw new NeedToInterceptException("need intercept");  
  15.             }  
  16.             testMapper.insert(new Test(210,20,30));  
  17.         }catch (Exception e){  
  18.             System.out.println("i catch exception");  
  19.         }  
  20.     } 
  21.  

測試用例代碼如下。 

  1. @RunWith(SpringRunner.class)  
  2. @SpringBootTest  
  3. public class DemoApplicationTests {  
  4.    @Resource  
  5.    TestServiceImpl testService;  
  6.    @Test  
  7.    public void testCatchException(){  
  8.       testService.insertTestCatchException();  
  9.    }  

運行測試用例發現,雖然拋出異常,但是異常被捕捉了,沒有拋出到方法 外, testMapper.insert(new Test(210,20,30))操作并沒有回滾。

以上三種就是@Transactional注解不起作用,@Transactional注解失效的主要原因。下面結合spring中對于@Transactional的注解實現源碼分析為何導致@Transactional注解不起作用。

@Transactional注解不起作用原理分析

第一種場景分析

@Transactional注解標注方法修飾符為非public時,@Transactional注解將會不起作用。這里分析 的原因是,@Transactional是基于動態代理實現的,@Transactional注解實現原理中分析了實現方法,在bean初始化過程中,對含有@Transactional標注的bean實例創建代理對象,這里就存在一個spring掃描@Transactional注解信息的過程,不幸的是源碼中體現,標注@Transactional的方法如果修飾符不是public,那么就默認方法的@Transactional信息為空,那么將不會對bean進行代理對象創建或者不會對方法進行代理調用

@Transactional注解實現原理中,介紹了如何判定一個bean是否創建代理對象,大概邏輯是。根據spring創建好一個aop切點BeanFactoryTransactionAttributeSourceAdvisor實例,遍歷當前bean的class的方法對象,判斷方法上面的注解信息是否包含@Transactional,如果bean任何一個方法包含@Transactional注解信息,那么就是適配這個BeanFactoryTransactionAttributeSourceAdvisor切點。則需要創建代理對象,然后代理邏輯為我們管理事務開閉邏輯。

spring源碼中,在攔截bean的創建過程,尋找bean適配的切點時,運用到下面的方法,目的就是尋找方法上面的@Transactional信息,如果有,就表示切點BeanFactoryTransactionAttributeSourceAdvisor能夠應用(canApply)到bean中,

AopUtils#canApply(org.springframework.aop.Pointcut, java.lang.Class<?>, boolean) 

  1. public static boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) {  
  2.    Assert.notNull(pc, "Pointcut must not be null");  
  3.    if (!pc.getClassFilter().matches(targetClass)) {  
  4.       return false;  
  5.    }  
  6.    MethodMatcher methodMatcher = pc.getMethodMatcher();  
  7.    if (methodMatcher == MethodMatcher.TRUE) {  
  8.       // No need to iterate the methods if we're matching any method anyway...  
  9.       return true;  
  10.    }  
  11.    IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null 
  12.    if (methodMatcher instanceof IntroductionAwareMethodMatcher) {  
  13.       introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher; 
  14.    }  
  15.     //遍歷class的方法對象  
  16.    Set<Class<?>> classes = new LinkedHashSet<Class<?>>(ClassUtils.getAllInterfacesForClassAsSet(targetClass));  
  17.    classes.add(targetClass);  
  18.    for (Class<?> clazz : classes) {  
  19.       Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz);  
  20.       for (Method method : methods) {  
  21.          if ((introductionAwareMethodMatcher != null &&  
  22.                introductionAwareMethodMatcher.matches(method, targetClass, hasIntroductions)) ||  
  23.              //適配查詢方法上的@Transactional注解信息    
  24.              methodMatcher.matches(method, targetClass)) {  
  25.             return true;  
  26.          }  
  27.       }  
  28.    }  
  29.    return false;  

我們可以在上面的方法打斷點,一步一步調試跟蹤代碼,最終上面的代碼還會調用如下方法來判斷。在下面的方法上斷點,回頭看看方法調用堆棧也是不錯的方式跟蹤。

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

  •  AbstractFallbackTransactionAttributeSource#computeTransactionAttribute 
  1. protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) {  
  2.    // Don't allow no-public methods as required.  
  3.    //非public 方法,返回@Transactional信息一律是null  
  4.    if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {  
  5.       return null;  
  6.    }  
  7.    //后面省略.......  
  8.  } 

不創建代理對象

所以,如果所有方法上的修飾符都是非public的時候,那么將不會創建代理對象。以一開始的測試代碼為例,如果正常的修飾符的testService是下面圖片中的,經過cglib創建的代理對象。

如果class中的方法都是非public的那么將不是代理對象。

不進行代理調用

考慮一種情況,如下面代碼所示。兩個方法都被@Transactional注解標注,但是一個有public修飾符一個沒有,那么這種情況我們可以預見的話,一定會創建代理對象,因為至少有一個public修飾符的@Transactional注解標注方法。

創建了代理對象,insertTestWrongModifier就會開啟事務嗎?答案是不會。 

  1. /**  
  2.  * @author zhoujy  
  3.  **/  
  4. @Component  
  5. public class TestServiceImpl implements TestService {  
  6.     @Resource  
  7.     TestMapper testMapper;  
  8.     @Override  
  9.     @Transactional  
  10.     public void insertTest() {  
  11.         int re = testMapper.insert(new Test(10,20,30));  
  12.         if (re > 0) {  
  13.             throw new NeedToInterceptException("need intercept");  
  14.         }  
  15.         testMapper.insert(new Test(210,20,30));  
  16.     }    
  17.     @Transactional  
  18.     void insertTestWrongModifier() {  
  19.         int re = testMapper.insert(new Test(10,20,30));  
  20.         if (re > 0) {  
  21.             throw new NeedToInterceptException("need intercept");  
  22.         }  
  23.         testMapper.insert(new Test(210,20,30));  
  24.     }  

原因是在動態代理對象進行代理邏輯調用時,在cglib創建的代理對象的攔截函數中CglibAopProxy.DynamicAdvisedInterceptor#intercept,有一個邏輯如下,目的是獲取當前被代理對象的當前需要執行的method適配的aop邏輯。

  1. List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); 

而針對@Transactional注解查找aop邏輯過程,相似地,也是執行一次

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

  •  AbstractFallbackTransactionAttributeSource#computeTransactionAttribute

也就是說還需要找一個方法上的@Transactional注解信息,沒有的話就不執行代理@Transactional對應的代理邏輯,直接執行方法。沒有了@Transactional注解代理邏輯,就無法開啟事務,這也是上一篇已經講到的。

第二種場景分析

在類內部調用調用類內部@Transactional標注的方法。這種情況下也會導致事務不開啟。

經過對第一種的詳細分析,對這種情況為何不開啟事務管理,原因應該也能猜到;

既然事務管理是基于動態代理對象的代理邏輯實現的,那么如果在類內部調用類內部的事務方法,這個調用事務方法的過程并不是通過代理對象來調用的,而是直接通過this對象來調用方法,繞過的代理對象,肯定就是沒有代理邏輯了。

其實我們可以這樣玩,內部調用也能實現開啟事務,代碼如下。 

  1. /**  
  2.  * @author zhoujy  
  3.  **/  
  4. @Component  
  5. public class TestServiceImpl implements TestService {  
  6.     @Resource 
  7.      TestMapper testMapper;  
  8.     @Resource  
  9.     TestServiceImpl testServiceImpl;  
  10.     @Transactional  
  11.     public void insertTestInnerInvoke() {  
  12.         int re = testMapper.insert(new Test(10,20,30));  
  13.         if (re > 0) {  
  14.             throw new NeedToInterceptException("need intercept");  
  15.         }  
  16.         testMapper.insert(new Test(210,20,30));  
  17.     }  
  18.     public void testInnerInvoke(){  
  19.         //內部調用事務方法 
  20.          testServiceImpl.insertTestInnerInvoke();  
  21.     }  

上面就是使用了代理對象進行事務調用,所以能夠開啟事務管理,但是實際操作中,沒人會閑的蛋疼這樣子玩~

第三種場景分析

事務方法內部捕捉了異常,沒有拋出新的異常,導致事務操作不會進行回滾。

這種的話,可能我們比較常見,問題就出在代理邏輯中,我們先看看源碼里賣弄動態代理邏輯是如何為我們管理事務的。

TransactionAspectSupport#invokeWithinTransaction

代碼如下。 

  1. protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)  
  2.       throws Throwable {  
  3.    // If the transaction attribute is null, the method is non-transactional.  
  4.    final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);  
  5.    final PlatformTransactionManager tm = determineTransactionManager(txAttr); 
  6.    final String joinpointIdentification = methodIdentification(method, targetClass);  
  7.    if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {  
  8.       // Standard transaction demarcation with getTransaction and commit/rollback calls.  
  9.        //開啟事務  
  10.       TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);  
  11.       Object retVal = null 
  12.       try {  
  13.          // This is an around advice: Invoke the next interceptor in the chain.  
  14.          // This will normally result in a target object being invoked. 
  15.           //反射調用業務方法  
  16.          retVal = invocation.proceedWithInvocation();  
  17.       }  
  18.       catch (Throwable ex) {  
  19.          // target invocation exception  
  20.           //異常時,在catch邏輯中回滾事務  
  21.          completeTransactionAfterThrowing(txInfo, ex);  
  22.          throw ex;  
  23.       }  
  24.       finally {  
  25.          cleanupTransactionInfo(txInfo);  
  26.       }  
  27.        //提交事務 
  28.        commitTransactionAfterReturning(txInfo);  
  29.       return retVal;  
  30.    }  
  31.    else {  
  32.      //....................  
  33.    }  

所以看了上面的代碼就一目了然了,事務想要回滾,必須能夠在這里捕捉到異常才行,如果異常中途被捕捉掉,那么事務將不會回滾。 

 

責任編輯:龐桂玉 來源: Hollis
相關推薦

2023-09-28 09:07:54

注解失效場景

2023-09-27 16:22:51

SpringMySQL原子性

2023-05-05 07:39:04

Spring事務面試

2024-05-07 08:23:03

Spring@Async配置

2020-04-14 13:32:56

@Transacti失效場景

2019-08-29 14:29:42

JVM內存 Java

2025-04-07 11:20:00

KubernetesPodPod容器

2023-11-02 07:52:30

Java工具

2024-09-09 08:29:25

2012-05-29 16:30:33

Tomcat內存溢出

2009-08-18 16:45:50

Tomcat內存溢出

2024-01-29 08:28:01

Spring事務失效

2021-09-04 07:56:44

Spring事務失效

2022-02-14 16:53:57

Spring項目數據庫

2025-10-30 07:45:06

2021-06-26 14:59:13

SpringTransaction執行

2023-07-05 08:45:18

Spring事務失效場景

2022-09-20 22:27:08

事務失效public 修飾

2024-06-18 08:37:25

場景異步編程代碼

2015-03-09 15:41:08

MongoDB查詢超時異常Socket Time
點贊
收藏

51CTO技術棧公眾號

中文字幕亚洲专区| 欧美视频在线视频| 亚洲一区二区久久久久久| 亚洲女人毛茸茸高潮| 精品日韩视频| 国产精品网曝门| 91在线看www| 国产情侣在线视频| 国产精品片aa在线观看| 欧美日韩精品免费| a级片一区二区| 亚洲aaaaaaa| 麻豆精品久久精品色综合| 国产亚洲人成a一在线v站| 久久人人爽av| 女人黄色免费在线观看| 2022国产精品视频| 国产欧美日韩精品丝袜高跟鞋| 日韩成人毛片视频| 精品伊人久久久| 欧美亚洲一区二区在线| 日韩第一页在线观看| 国产成人三级在线观看视频| 丝袜美腿成人在线| 美乳少妇欧美精品| 精品人妻无码一区| 亚洲视频精选| 91国产成人在线| 男人天堂网站在线| 国产精品无码2021在线观看| 国产成人啪午夜精品网站男同| 欧美一级电影免费在线观看| 国产视频精品免费| 欧美亚洲tv| 欧美一区二区日韩一区二区| 阿v天堂2018| 性开放的欧美大片| 99精品视频在线播放观看| 91九色精品视频| 狠狠人妻久久久久久| 欧美精品首页| 日韩在线激情视频| 日本一卡二卡在线| 成人动漫视频| 欧美精品色综合| 99色精品视频| 欧美色图天堂| 中文字幕欧美一区| 蜜桃臀一区二区三区| 成人福利小视频| 日本亚洲视频在线| 国内自拍欧美激情| 少妇愉情理伦三级| 免费精品国产| 日韩av在线精品| 性高潮久久久久久| 欧美aaa大片视频一二区| 亚洲成a人片综合在线| 午夜探花在线观看| 在线观看完整版免费| 91免费国产视频网站| 丁香婷婷久久久综合精品国产| 97精品久久人人爽人人爽| 日韩中文欧美在线| 欧美黑人巨大xxx极品| 国产jjizz一区二区三区视频| 小说区图片区色综合区| 亚洲电影av在线| 95视频在线观看| 91精品短视频| 精品国产一区二区三区久久影院 | 亚洲色图另类小说| 不卡一区二区三区四区| 成人午夜电影免费在线观看| 精品久久人妻av中文字幕| 国产一区美女在线| 亚洲精品日韩av| 草逼视频免费看| 国产91在线|亚洲| 国产精品区一区| 欧美 日韩 国产 在线| 成人v精品蜜桃久久一区| 91精品国产综合久久久久久蜜臀 | 精品国产亚洲AV| 国产精品一二三| 国产高清一区视频| 亚洲欧洲综合在线| 久久综合九色综合久久久精品综合| 美女精品国产| 成年网站在线| 亚洲欧美电影院| 大地资源第二页在线观看高清版| 超碰在线免费公开| 五月天中文字幕一区二区| 97成人在线免费视频| 日韩欧美精品电影| 宅男噜噜噜66一区二区66| 中文字幕第六页| 中文无码日韩欧| 亚洲精品美女在线观看| 久久久久久久久久久久久久久| 国产一区二区在线| 另类色图亚洲色图| 国产无人区码熟妇毛片多| 日本亚洲免费观看| 国产精品国产精品| 欧美一区二区少妇| 亚洲免费电影在线| 国产欧美久久久久| 色天使综合视频| 日韩欧美电影一区| 成人国产精品久久久网站| 亚洲色图二区| 日韩av大片免费看| www夜片内射视频日韩精品成人| 国产成人综合自拍| 日韩av电影免费在线| 亚洲精品白浆| 欧美亚洲日本国产| 色悠悠在线视频| 精品免费视频| 国内精品久久久久| 中文字幕免费观看| 国产成人在线视频网站| 日韩视频一区在线| 欧美性天天影院| 日本美女在线中文版| 天天av天天翘天天综合网色鬼国产 | 欧美黑人一区二区| 国产专区综合网| 久久久久免费网| 主播国产精品| 岛国av一区二区| 日韩成人av影院| 手机在线电影一区| 欧美激情精品久久久久久蜜臀| 黑人精品无码一区二区三区AV| 久久综合狠狠| 美媛馆国产精品一区二区| 日韩精品分区| 91久久免费观看| www.日本高清| 国色天香一区二区| 亚洲一区二区免费| 激情成人四房播| 欧美午夜精品久久久久久孕妇| 中文字幕免费高清视频| 亚洲天堂偷拍| av成人免费观看| 精品自拍一区| 欧美肥妇毛茸茸| 国产中文字幕久久| 久久电影网站中文字幕| 欧洲精品久久| 电影一区二区三| 日韩欧美国产综合在线一区二区三区| 蜜桃av免费在线观看| 老牛影视一区二区三区| 亚洲综合日韩在线| 2024短剧网剧在线观看| 91精品欧美久久久久久动漫| 国产肥白大熟妇bbbb视频| 99精品久久久| 91传媒视频在线观看| 国产调教视频在线观看| 91精品久久久久久久99蜜桃| 娇妻被老王脔到高潮失禁视频| 爽好久久久欧美精品| 欧美日韩亚洲一区二区三区在线观看 | 亚洲专区中文字幕| 污污片在线免费视频| 欧美不卡一区二区| 日韩精品成人一区| 狠狠色狠狠色综合系列| 日本一区二区三区免费看| 免费在线小视频| 日韩精品一二三四区| 日韩三级一区二区三区| 91丨九色丨蝌蚪富婆spa| 激情六月丁香婷婷| 日韩欧美在线精品| 欧美中文字幕精品| 精品99又大又爽又硬少妇毛片| 欧美视频专区一二在线观看| 99精品全国免费观看| 久久69国产一区二区蜜臀| 男女激烈动态图| 亚洲国产中文在线二区三区免| 欧美精品激情blacked18| 亚洲av电影一区| 91久久精品一区二区二区| 精品成人av一区二区三区| 蜜臀久久久99精品久久久久久| 26uuu成人| 开心激情综合| 国产精品福利网站| 91啦中文在线| 精品日韩成人av| 久草手机在线视频| 国产精品电影一区二区| 少妇伦子伦精品无吗| 久久www成人_看片免费不卡| 亚洲一区三区| 国产厕拍一区| 亚洲一区免费网站| 日本在线影院| 久久久久999| 偷拍自拍在线| 欧美精品v国产精品v日韩精品| 久久亚洲AV无码| 国产欧美精品在线观看| 蜜臀视频在线观看| 麻豆精品国产传媒mv男同| 日韩三级影视基地| 97av在线播放| 成人区精品一区二区| 波多野结衣家庭教师在线播放| 农村黄色一级片| 国产一区二区三区久久久久久久久| 欧美变态凌虐bdsm| 成人黄色免费网址| 寂寞少妇一区二区三区| 男人添女人下面高潮视频| 91麻豆精品国产91久久久平台 | 一区二区视频免费完整版观看| 永久555www成人免费| 欧美 国产 小说 另类| 日韩最新av| 欧洲美女免费图片一区| 国产写真视频在线观看| 亚洲性线免费观看视频成熟| 欧美一级特黄aaaaaa大片在线观看| 欧洲精品在线观看| 国产一级片毛片| 亚洲福利电影网| 一本一道久久久a久久久精品91| 日本午夜视频在线观看| 亚洲天堂2014| 国产精成人品免费观看| 成人国产精品视频| 日韩中文字幕a| 日本va欧美va瓶| 日本成年人网址| 亚洲精品偷拍| 日韩日韩日韩日韩日韩| 一本一道久久综合狠狠老| 视频一区三区| 午夜先锋成人动漫在线| 成人av蜜桃| 午夜电影一区| 97人人模人人爽视频一区二区| 天然素人一区二区视频| 欧美—级高清免费播放| 麻豆tv在线| 最新中文字幕亚洲| 国产一级片在线| 亚洲欧美精品一区| 欧美性孕妇孕交| 亚洲欧美变态国产另类| 性感美女一级片| 亚洲精品视频网上网址在线观看| 六月婷婷综合网| 日韩大片免费观看视频播放| 欧美日韩在线精品一区二区三区激情综| 亚洲精品久久久久中文字幕二区| 日批视频在线播放| 精品国产乱码久久久久久影片| www.激情五月| 精品福利视频一区二区三区| 国模私拍视频在线| 337p日本欧洲亚洲大胆色噜噜| 高h放荡受浪受bl| 亚洲国产精品人人爽夜夜爽| 色天堂在线视频| 亚洲性av在线| 日本中文字幕在线2020| 欧美黄色小视频| а√在线天堂官网| 国产成人精品在线| 日韩专区视频| 91超碰在线电影| 午夜欧洲一区| 一级特黄录像免费播放全99| 你懂的成人av| 国产一区二区网| 丝袜美腿成人在线| 国产免费中文字幕| 成人av在线电影| 欧美激情aaa| 综合亚洲深深色噜噜狠狠网站| 一区二区成人免费视频| 疯狂欧美牲乱大交777| 中文字幕1区2区3区| 欧美一区二区三区精品| 亚洲无码久久久久久久| 亚洲福利在线视频| 高清日韩av电影| 欧美成人精品一区| 亚洲黄色免费看| 成人夜晚看av| 午夜a一级毛片亚洲欧洲| 亚洲视频sss| 亚洲成人在线| 黄色片视频在线播放| 高清成人在线观看| 欧美亚洲色综久久精品国产| 亚洲精品免费电影| 中文人妻av久久人妻18| 日韩一区二区免费视频| 神马午夜在线观看| 欧美激情极品视频| 黄色精品视频| 国产女主播一区二区三区| 少妇av在线播放| 欧美日韩视频第一区| 性中国xxx极品hd| 一区二区在线免费视频| 国产极品人妖在线观看| 国产精品久久久久7777婷婷| 亚洲精品天堂网| 国产一区二区三区亚洲综合| 国产综合在线观看视频| 精品淫伦v久久水蜜桃| 亚洲一区二区三区涩| 国产精品一区亚洲| 日本黄色大片在线观看| 国产精品人成在线观看免费 | 成年人午夜视频| 欧美久久一二区| 国产精品一区二区三区四区色| 国模极品一区二区三区| 成人影院网站ww555久久精品| 欧美三级网色| 亚洲大片在线| www.色.com| 国产精品国产三级国产专播品爱网| 日本污视频在线观看| 欧美精品高清视频| 在线激情免费视频| 国产精品xxx视频| 蜜桃成人av| 无码人妻精品一区二区三区在线| 国产福利一区在线| 97在线观看免费高| 欧美日韩性生活| 国产经典自拍视频在线观看| 欧美一级在线亚洲天堂| 美国十次av导航亚洲入口| 一本色道久久88亚洲精品综合 | 亚洲日本一区二区三区| 中文字幕免费观看视频| 国产亚洲视频在线观看| 国产极品久久久久久久久波多结野 | 亚洲人成电影在线| 综合另类专区| 精品国产乱码久久久久久久软件| 国产欧美综合一区二区三区| 蜜臀视频在线观看| 午夜精品免费在线观看| 日韩性xxxx| 97超级碰在线看视频免费在线看| 鲁大师精品99久久久| 99视频在线免费播放| 国产婷婷精品av在线| 免费观看日批视频| 一区二区成人精品| 日本久久久久| 日本在线视频www色| 国产精品一区二区久激情瑜伽| 国产97免费视频| 欧美一区二区精品| 黄色在线网站噜噜噜| 久久精品日产第一区二区三区| 久久先锋影音| 网爆门在线观看| 日韩一区二区三区三四区视频在线观看 | 免费中文字幕在线观看| 亚洲国产一区二区三区四区| 丝袜诱惑一区二区| 日韩中文字幕一区| 久久国内精品视频| 欧美xxxx黑人xyx性爽| 欧美色综合天天久久综合精品| 午夜免费精品视频| 日韩大片免费观看| 欧美韩国理论所午夜片917电影| 日韩高清一区| 日韩人妻无码精品久久久不卡| 国产福利精品一区| 夜夜爽妓女8888视频免费观看| 国产大片一区二区| 91av视频在线播放| 九九热线视频只有这里最精品| 日本在线免费观看一区| 激情成人综合网| 精品人妻在线播放| 亚洲欧洲国产伦综合| 2024最新电影免费在线观看| 91精品国产一区二区人妖| 欧美寡妇性猛交xxx免费|