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

再深一點:面試工作兩不誤,源碼級理解Spring事務

開發 架構
Spring有5種隔離級別,7種傳播行為。這是面試常問的內容,也是代碼中經常碰到的知識點。這些知識枯燥而且乏味,其中有些非常的繞。如果栽在這上面,就實在是太可惜了。

 Spring有5種隔離級別,7種傳播行為。這是面試常問的內容,也是代碼中經常碰到的知識點。這些知識枯燥而且乏味,其中有些非常的繞。如果栽在這上面,就實在是太可惜了。

 

xjjdog在一些事務的基礎上,再探討幾個容易淡忘的概念,從源碼層面找原因,加深我們的理解,問題大概包括:

  1. Spring的事務和數據庫的事務隔離是一個概念么?
  2. Spring是如何實現事務的?
  3. 事務隔離機制都有哪些?
  4. 事務傳播機制都有哪些?
  5. 查詢語句需要開事務么?
  6. private方法加事務注解有用么?

1、Spring的事務和數據庫的事務隔離是一個概念么?

先來第一個問題,Spring的事務隔離級別和數據的事務隔離級別,是一回事么?

其實,數據庫一般只有4種隔離機制,Spring抽象出一種default,根據數據設置來變動。

 

  • read uncommitted(未提交讀)
  • read committed(提交讀、不可重復讀)
  • repeatable read(可重復讀)
  • serializable(可串行化)
  • default (PlatformTransactionManager默認的隔離級別,使用的就是數據庫默認的)

這是因為,Spring只提供統一事務管理接口,具體實現都是由各數據庫自己實現(如MySQL)。Spring會在事務開始時,根據當前環境中設置的隔離級別,調整數據庫隔離級別,由此保持一致。

在DataSourceUtils文件中,代碼詳細的輸出了這個過程。

  1. // Apply specific isolation level, if any
  2. Integer previousIsolationLevel = null
  3. if (definition != null && definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) { 
  4.     if (logger.isDebugEnabled()) { 
  5.         logger.debug("Changing isolation level of JDBC Connection [" + con + "] to " + 
  6.                 definition.getIsolationLevel()); 
  7.     } 
  8.     int currentIsolation = con.getTransactionIsolation(); 
  9.     if (currentIsolation != definition.getIsolationLevel()) { 
  10.         previousIsolationLevel = currentIsolation; 
  11.         con.setTransactionIsolation(definition.getIsolationLevel()); 
  12.     } 

結論:三種情況,如果Spring沒有指定事務隔離級別,則會采用數據庫默認的事務隔離級別;當Spring指定了事務隔離級別,則會在代碼里將事務隔離級別修改為指定值;當數據庫不支持這種隔離級別,效果則以數據庫的為準(比如采用了MyISAM引擎)。

我們會使用如下的方式進行聲明。如果不是有性能和需求問題,就不要瞎改。事務處理弄不好是會鎖表的,而鎖表在大并發的情況下是會死人的。

  1. @Transactional(isolation = Isolation.READ_UNCOMMITTED) 

2、Spring事務的7種傳播機制

只要寫代碼,代碼總會存在嵌套,或者循環,造成了事務的嵌套或者循環。那么事務在這些情況下,根據配置會有不同的反應。

 

  • REQUIRED 這是默認的。表示當前方法必須在一個具有事務的上下文中運行,如有客戶端有事務在進行,那么被調用端將在該事務中運行,否則的話重新開啟一個事務。(如果被調用端發生異常,那么調用端和被調用端事務都將回滾)
  • REQUIRE_NEW 表示當前方法必須運行在它自己的事務中。如果存在當前事務,在該方法執行期間,當前事務會被掛起
  • NESTED 如果當前方法正有一個事務在運行中,則該方法應該運行在一個嵌套事務中,被嵌套的事務可以獨立于被封裝的事務中進行提交或者回滾。如果封裝事務存在,并且外層事務拋出異?;貪L,那么內層事務必須回滾,反之,內層事務并不影響外層事務。如果封裝事務不存在,則同required的一樣
  • SUPPORTS 表示當前方法不必需要具有一個事務上下文,但是如果有一個事務的話,它也可以在這個事務中運行
  • NOT_SUPPORTED 表示該方法不應該在一個事務中運行。如果有一個事務正在運行,他將在運行期被掛起,直到這個事務提交或者回滾才恢復執行
  • MANDATORY 表示當前方法必須在一個事務中運行,如果沒有事務,將拋出異常
  • NEVER 表示當方法務不應該在一個事務中運行,如果存在一個事務,則拋出異常

一般用得比較多的是REQUIRED , REQUIRES_NEW,用到其他的,你就要小心了,搞懂再用。

最怕如果這倆字了,它會將事情搞的很復雜,尤其是代碼量大的時候,你永遠不知道你寫的service會被誰用到。這就很尷尬了。

我們會采用下面的方式進行聲明。鑒于Spring的事務傳播非常的繞,如果功能滿足需求,那么就用默認的就好,否則會引起不必要的麻煩。

  1. @Transactional(propagation=Propagation.REQUIRED) 

3、事務傳播機制是怎么實現的?

事務傳播機制看似神奇,實際上是使用簡單的ThreadLocal的機制實現的。所以,如果調用的方法是在新線程調用的,事務傳播實際上是會失效的。這不同于我們以前講到的透傳,Spring并沒有做這樣的處理。

所以事務傳播機制,只有翻一遍源代碼,才能印象深刻。僅靠文字去傳播,很多東西會變得不可描述。

 

如圖,PlatformTransactionManager只有簡單的三個抽象接口,定義了包含JDBC在內的Spring所有的事務操作。

 

我們平常說的JDBC,只是占到其中一部分。

實現的方式,依然是使用AOP來實現的,具體的實現類是由TransactionAspectSupport來實現的??梢钥吹?,代碼定義了一個叫做transactionInfoHolder的ThreadLocal變量,當用到它的時候,就能夠確保在同一個線程下,獲取的變量是一致的。

  1. /** 
  2.     * Holder to support the {@code currentTransactionStatus()} method, 
  3.     * and to support communication between different cooperating advices 
  4.     * (e.g. before and after advice) if the aspect involves more than a 
  5.     * single method (as will be the case for around advice). 
  6. */ 
  7. private static final ThreadLocal<TransactionInfo> transactionInfoHolder = 
  8.         new NamedThreadLocal<>("Current aspect-driven transaction"); 

具體的業務邏輯,是在invokeWithinTransaction中實現的。如果你繼續向下跟蹤的話,會找到AbstractPlatformTransactionManager類中的getTransaction方法。

  1. @Override 
  2. public final TransactionStatus getTransaction(@Nullable TransactionDefinition definition) 
  3.         throws TransactionException { 
  4.  
  5.  
  6.     // Use defaults if no transaction definition given. 
  7.     TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults()); 
  8.  
  9.  
  10.     Object transaction = doGetTransaction(); 
  11.     boolean debugEnabled = logger.isDebugEnabled(); 
  12.  
  13.  
  14.     if (isExistingTransaction(transaction)) { 
  15.         // Existing transaction found -> check propagation behavior to find out how to behave. 
  16.         return handleExistingTransaction(def, transaction, debugEnabled); 
  17.     } 
  18.  
  19.  
  20.     // Check definition settings for new transaction
  21.     if (def.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) { 
  22.         throw new InvalidTimeoutException("Invalid transaction timeout", def.getTimeout()); 
  23.     } 
  24.  
  25.  
  26.     // No existing transaction found -> check propagation behavior to find out how to proceed. 
  27.     if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) { 
  28.         throw new IllegalTransactionStateException( 
  29.                 "No existing transaction found for transaction marked with propagation 'mandatory'"); 
  30.     } 
  31.     else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || 
  32.             def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || 
  33.             def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) { 
  34.         SuspendedResourcesHolder suspendedResources = suspend(null); 
  35.         if (debugEnabled) { 
  36.             logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def); 
  37.         } 
  38.         try { 
  39.             return startTransaction(def, transaction, debugEnabled, suspendedResources); 
  40.         } 
  41.         catch (RuntimeException | Error ex) { 
  42.             resume(null, suspendedResources); 
  43.             throw ex; 
  44.         } 
  45.     } 
  46.     else { 
  47.         // Create "empty" transactionno actual transaction, but potentially synchronization. 
  48.         if (def.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) { 
  49.             logger.warn("Custom isolation level specified but no actual transaction initiated; " + 
  50.                     "isolation level will effectively be ignored: " + def); 
  51.         } 
  52.         boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS); 
  53.         return prepareTransactionStatus(def, nulltrue, newSynchronization, debugEnabled, null); 
  54.     } 

不用我做過多解釋了吧,一切明顯的邏輯,都在代碼里。事務就是在這里創建的。

4、查詢方法可以不開啟事務么?

事務有個readonly,控制了事務的只讀屬性,和事務是否開啟沒半毛錢關系。

在以前的一篇文章中,談到通過設置readonly屬性來控制語句的路由:”MySQL官方驅動“主從分離的神秘面紗(掃盲篇),這其中就用到了事務的其中一個屬性readonly,它最終是體現在數據庫連接層面的。

  1. connection.setReadOnly(true); 

在Spring中的使用方式如下:

  1. @Transactional(readOnly=true

值得注意的是,這個屬性設置之后,并不是每個底層的數據庫都支持。中間層的ORM或者驅動,也可能會拿這個屬性做一些文章,所以與其說這個readonly是功能性的,不如說是一種暗示。

拿MySQL來說,有兩種提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交
  • SET AUTOCOMMIT=1 開啟自動提交

這都是實打實的SQL語句,所以如果開啟了事務,AUTOCOMMIT要為false。我們可以看到Spring做了以下幾個操作。

  1. con.setAutoCommit(false); 

如果是只讀事務,還不忘手動設置一下。

  1. if (isEnforceReadOnly() && definition.isReadOnly()) {    try (Statement stmt = con.createStatement()) { 
  2.         stmt.executeUpdate("SET TRANSACTION READ ONLY"); 
  3.     } 

這種操作是很昂貴的,如果不加Transaction注解,默認是不開啟事務的。單條的查詢語句也是沒有必要開啟事務的,數據庫默認的配置就能滿足需求。

但如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢SQL必須保證整體的讀一致性,否則,在前條SQL查詢之后,后條SQL查詢之前,數據被其他用戶改變,就會造成數據的前后不一。

也僅有在這種情況下,要開啟讀事務。

5、private方法加事務注解有用么?

@Transaction注解加在private上,并沒有什么卵用。

這倒不是事務處理的代碼去寫的特性。由于事務的這些功能,是通過AOP方式強加進去的,所以它收到動態代理的控制。

private和final修飾的方法,不會被代理。

但是,你卻可以把private方法放在帶有事務功能的public方法里。這樣,它看起來也有了事務的一些功能特性,但它并沒有。

End

互聯網中,用到的事務并不多,很多都是非常小、速度非??斓慕涌?,對于開發人員來說,事務是個累贅。

但在一些帶有金融屬性的業務中,或者一些企業級開發應用中,事務確實一個繞不過的坎。一旦深入其中,就會發現這個知識點,露著血盆大口,等君入甕。

xjjdog從源碼層次,聊到了幾個面試常問的問題。不要覺得奇怪,有的人確實一直在拿著臟讀、幻讀這樣的名詞來面試。

而這些東西,都屬于當時看了恍然大悟,第二天就繼續懵逼的內容。

什么時候,才能務實一點呢?

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2020-09-01 07:36:29

分布式鎖分布式進程

2009-02-10 09:33:00

DNS網絡訪問

2014-06-20 19:07:54

云存儲聯想企業網盤

2010-01-13 08:55:31

Windows 7音頻播放

2011-10-08 12:21:19

華碩臺式機

2015-04-27 13:29:24

2013-06-03 17:17:14

Android開發Android程序Android手機平板

2022-01-26 00:41:58

程序員學習型工作

2016-08-26 13:51:50

聯想系統搬遷服

2016-07-07 17:29:40

企業辦公

2009-04-03 08:22:40

聯想楊元慶拳擊手

2015-10-29 17:58:57

安全WiFi瑞星

2010-05-25 14:11:49

酷睿I3HTPC

2012-04-19 15:52:29

投影機推薦

2009-04-28 11:19:17

電腦保險PICC金山毒霸

2025-02-13 08:36:52

2014-06-23 14:31:34

信鴿企業IM

2020-08-18 11:26:57

巴菲特韭菜股票

2011-10-26 11:26:27

筆記本評測
點贊
收藏

51CTO技術棧公眾號

国产极品在线播放| 久久久久久无码精品人妻一区二区| 免费一级在线观看| 日本不卡一二三区黄网| 色婷婷综合久久久久| 日本中文字幕精品| 不卡av影片| 亚洲三级在线播放| 精品久久久久久综合日本 | 欧美军人男男激情gay| 欧美精品久久久久久久多人混战| 日本男女交配视频| 天堂国产一区二区三区| 免费成人在线观看| 亚州欧美日韩中文视频| 国产精品国产三级国产传播| 国产精品zjzjzj在线观看| 在线观看日韩国产| 久久久久免费看黄a片app| 成人欧美亚洲| 成人免费观看视频| 成人国产精品久久久| 国产毛片aaa| 国产精品chinese| 亚洲女人被黑人巨大进入| 国产人妻精品久久久久野外| 欧美人体一区二区三区| 亚洲国产成人va在线观看天堂| 台湾成人av| 日韩专区一区二区| 成人一区二区三区中文字幕| 91久久精品国产| 国产真人无遮挡作爱免费视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 在线看欧美日韩| 国产一级av毛片| 在线看成人短视频| 精品国产百合女同互慰| 国产传媒免费观看| 成人在线视频免费看| 岛国av一区二区在线在线观看| 黄色特一级视频| 免费黄网在线观看| 国产精品国产三级国产普通话蜜臀 | 久久婷婷一区二区| 中文精品电影| 久久五月情影视| 美女三级黄色片| 青草国产精品| 亚洲视频在线视频| 亚洲a v网站| 国产午夜一区| 亚洲视屏在线播放| 亚洲做受高潮无遮挡| 香蕉一区二区| 亚洲精品影视在线观看| 成年人在线观看av| 亚洲免费毛片| 国产亚洲福利一区| 国产又粗又猛又爽又黄的视频四季| 精品国精品国产自在久国产应用 | 97操在线视频| 亚洲第九十九页| 成人免费视频网站在线观看| 国产精品对白一区二区三区| 日韩一级片免费观看| 91一区二区在线观看| 蜜桃传媒视频麻豆第一区免费观看| 午夜性色福利影院| 国产午夜亚洲精品理论片色戒| 免费在线成人av| 成人在线二区| 亚洲欧美日韩电影| 日本福利视频一区| 制服丝袜专区在线| 欧美视频在线观看一区| 中文字幕1234区| 成人精品动漫一区二区三区| 日韩电视剧免费观看网站| www.中文字幕av| 日本成人小视频| 久久999免费视频| 久久午夜免费视频| 日本不卡一区二区三区| 91青青草免费在线看| 头脑特工队2免费完整版在线观看| 成人国产免费视频| 日本不卡在线播放| а天堂中文在线官网| 五月天久久比比资源色| www.超碰com| 精品国产鲁一鲁****| 亚洲精品不卡在线| 呻吟揉丰满对白91乃国产区| 欧美大片专区| 日韩免费观看视频| 精品国产亚洲一区二区麻豆| 久久这里只有精品视频网| 黄色免费高清视频| 亚洲国产成人二区| 日韩视频国产视频| 国产 欧美 在线| 国产精品vip| 国产免费一区二区三区在线观看 | 成人污版视频| 亚洲男人av电影| 成人免费看片98| 麻豆精品国产91久久久久久| 国产麻豆乱码精品一区二区三区 | 亚洲欧美综合在线精品| 秋霞无码一区二区| 高清不卡一区| 主播福利视频一区| 国产乱国产乱老熟| 国产成人免费视频精品含羞草妖精| 欧美一区2区三区4区公司二百| 午夜影院免费在线| 欧美男人的天堂一二区| 91精品人妻一区二区三区| 亚洲无线视频| 亚洲一区二区三区四区在线播放 | 欧美人与性动交| 一区二区视频免费| 国产亚洲一区二区在线观看| 国产精品网站免费| 精品视频在线观看网站| 中文字幕一精品亚洲无线一区 | 国产伦精品一区二区三区视频女| 亚洲国产91| 96pao国产成视频永久免费| a天堂中文在线88| 色综合久久中文综合久久牛| 中文字幕第九页| 欧美在线二区| 成人精品在线视频| 免费的黄网站在线观看| 欧美日韩免费高清一区色橹橹| 黄瓜视频污在线观看| av成人黄色| 精品国产91亚洲一区二区三区www| 91麻豆一二三四在线| 欧美一区二区黄色| 中文字幕手机在线观看| 国产精品亚洲人在线观看| 中文字幕第一页亚洲| 视频欧美精品| 久久久久www| 99久久国产热无码精品免费| 综合分类小说区另类春色亚洲小说欧美| 一区二区在线播放视频| 青青草国产免费一区二区下载 | 91视频 -- 69xx| 久本草在线中文字幕亚洲| 国内成人精品一区| 无码精品人妻一区二区三区影院| 亚洲超碰精品一区二区| 国产真实乱人偷精品| 亚洲欧美bt| 少妇特黄a一区二区三区| 欧美大片1688网站| 久久精品亚洲94久久精品| 国产日韩一级片| 亚洲专区一二三| www.日本高清| 日韩黄色在线观看| 中文网丁香综合网| 亚洲**毛片| 91精品国产高清久久久久久| 韩日在线视频| 欧美精品日韩一本| 欧美黄色免费看| 97精品久久久午夜一区二区三区| 欧美一级片中文字幕| 99久久精品费精品国产风间由美| 亚洲精品欧美一区二区三区| 波多野结衣在线高清| 日韩成人在线播放| 中文天堂在线资源| 亚洲精品免费电影| 亚洲AV无码国产成人久久| 日本不卡视频在线| 日本精品久久久久久久久久| 一区二区三区视频免费观看| 91精品久久久久久久久久| 日本无删减在线| 亚洲美女又黄又爽在线观看| 91精品视频免费在线观看| 亚洲综合成人在线视频| 性少妇bbw张开| 国产精品一区二区黑丝| 日本精品一区二区三区四区| 99久久夜色精品国产亚洲96| 国产精品一国产精品最新章节| 国产经典一区| 久久久久久av| 亚洲1卡2卡3卡4卡乱码精品| 欧美大胆人体bbbb| 中国一级特黄视频| 红桃视频成人在线观看| 波兰性xxxxx极品hd| 波波电影院一区二区三区| 一本色道久久亚洲综合精品蜜桃| 极品中文字幕一区| 一区二区三区久久网| 欧美精品中文字幕亚洲专区| 91美女福利视频高清| 韩国美女久久| 欧美激情一级二级| 久久bbxx| 伊是香蕉大人久久| 亚洲av成人精品毛片| 欧美一级日韩免费不卡| 波多野结衣绝顶大高潮| 欧美日韩一区二区免费视频| www.毛片com| 日本一区二区成人| av直播在线观看| 成人黄色综合网站| 无码人妻一区二区三区在线视频| 日韩av一区二区在线影视| 尤物av无码色av无码| 欧美在线免费| 在线免费一区| 精品国产一级毛片| 欧美久久电影| 欧美美女在线直播| 国产区一区二区| 91精品啪在线观看国产手机 | 国产又粗又猛又爽又黄视频| 色老头久久综合| 国产黄色免费观看| 精品成人乱色一区二区| 五月天婷婷丁香| 亚洲午夜国产一区99re久久| 四虎免费在线视频| 亚洲男人的天堂在线观看| 欧美88888| 中文一区一区三区高中清不卡| 无码一区二区三区在线| 久久综合给合久久狠狠狠97色69| 国产精品jizz| 久久综合九色综合欧美亚洲| 爱爱的免费视频| 久久久久久免费网| 真实乱视频国产免费观看| 97在线观看免费高| 激情综合色播激情啊| 丝袜亚洲欧美日韩综合| 天天av综合网| 亚洲激情自拍图| 婷婷视频在线观看| 日韩成人av在线播放| 污污网站免费在线观看| 日韩精品亚洲元码| 深夜福利视频在线免费观看| 亚洲精品99久久久久| 国产高清自拍一区| 91吃瓜在线观看| 91国产美女在线观看| 美女高潮在线观看| 欧洲成人免费视频| 日韩高清成人| 国产欧美va欧美va香蕉在| 亚洲精品乱码日韩| 亚洲a区在线视频| 99久久婷婷国产综合精品青牛牛 | 伊人国产精品| 97免费高清电视剧观看| 国产精品黄网站| 久久艳妇乳肉豪妇荡乳av| 精品国产成人| 三年中国中文在线观看免费播放| 你懂的国产精品永久在线| 一本久道高清无码视频| 久久九九精品| 午夜免费看毛片| 国产成人av电影在线观看| aaaaaav| 国产欧美日韩视频在线观看| 国产av无码专区亚洲av毛网站| 亚洲综合图片区| 成年人视频在线免费看| 欧美日韩国产综合一区二区三区 | 在线观看免费黄色片| 韩国一区二区三区在线观看| 18禁男女爽爽爽午夜网站免费 | 中国特级黄色大片| 久久综合九色综合97_久久久| 激情五月激情综合| 午夜电影网一区| 中文字幕在线网址| 亚洲国产成人精品女人久久久| 国产美女视频一区二区三区 | 日韩国产高清视频在线| www日韩tube| 久久久久久一区二区三区| 朝桐光一区二区| 99在线视频免费观看| 韩日一区二区三区| 欧日韩免费视频| 久久成人免费电影| 国产特黄级aaaaa片免| 一区二区三区日韩| 亚洲高清视频免费观看| 精品乱人伦小说| av免费观看一区二区| 久久久亚洲影院你懂的| 精品三级在线| 裸模一区二区三区免费| 欧美精品成人| 国产色视频在线播放| 97超碰欧美中文字幕| 欧美日韩精品一区二区三区视频播放 | 成人黄色片在线观看| 亚洲电影天堂av| 国产激情小视频在线| 国产精品成人免费视频| 欧美成人午夜77777| xxxxxx在线观看| 久久成人久久爱| 自拍偷拍视频亚洲| 欧美视频二区36p| 国产91免费在线观看| 久久久国产影院| 欧美成人毛片| 色爱区成人综合网| 久久狠狠一本精品综合网| 成熟妇人a片免费看网站| 亚洲免费av在线| 国产精品国产精品国产专区| 亚洲人成电影在线观看天堂色| 国产精品电影| 国产三级精品在线不卡| 国产精品大片| 国产精品熟妇一区二区三区四区 | 国产一区二区久久久久| 亚洲精品一区二区三区樱花| 三级欧美韩日大片在线看| 免费a在线观看播放| 午夜成人免费电影| 熟妇人妻中文av无码| 97婷婷大伊香蕉精品视频| 国产在线播放精品| 久久精品国产sm调教网站演员| 成人午夜看片网址| 懂色av.com| 亚洲黄色成人网| 天堂电影一区| 欧美日韩亚洲在线| 日韩和欧美一区二区三区| 久久精品—区二区三区舞蹈| 在线观看网站黄不卡| 国产精品久久久久久久龚玥菲 | www国产精品内射老熟女| 不卡视频一二三四| 国产www在线| 亚洲欧洲一区二区三区在线观看| 性感美女一区二区在线观看| 日韩中文字幕一区二区| 九九精品视频在线看| 亚洲怡红院在线观看| 欧美一区二区久久| 超碰中文在线| 久久一区免费| 蜜桃av一区二区| 国语对白在线播放| 日韩视频免费直播| 无遮挡在线观看| 先锋影音网一区| 国产一区二区看久久| 日韩精品一卡二卡| 亚洲性夜色噜噜噜7777| 国产精品一区二区三区av| 17c丨国产丨精品视频| 91小视频免费看| 最新在线中文字幕| 欧美成人性生活| 理论片一区二区在线| 波多野结衣天堂| 亚洲精选一二三| 亚州av在线播放| 国产日韩专区在线| 精品动漫一区| 少妇一级黄色片| 日韩精品一区二区三区中文精品| 日韩大片免费观看| 一本一道久久a久久精品综合 | 欧美激情理论| 中文字幕国内自拍| 一级做a爱片久久| 男人天堂网在线| 亚洲aⅴ男人的天堂在线观看| 亚洲人体大胆视频| 69xxx免费| 欧美精品一区二区三区蜜桃| 精品亚洲美女网站| 欧美一区二区三区综合| 欧美国产精品一区二区三区| 亚洲精品国产片| 国产精品视频99|