3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度剖析Apache Shardingsphere对分布式事务的支持

發布時間:2024/4/11 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度剖析Apache Shardingsphere对分布式事务的支持 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Apache ShardingSphere 是一套開源的分布式數據庫中間件解決方案組成的生態圈,它由 JDBC、Proxy 和 Sidecar(規劃中)這 3 款相互獨立,卻又能夠混合部署配合使用的產品組成。它們均提供標準化的數據分片、分布式事務和數據庫治理功能,可適用于如 Java 同構、異構語言、云原生等各種多樣化的應用場景。ShardingSphere 已于2020年4月16日成為 Apache 軟件基金會的頂級項目。

分布式系統CAP理論

一致性(Consistency)
  • 一致性指 all nodes see the same data at the same time,即更新操作成功并返回客戶端完成后,所有節點在同一時間的數據完全一致,不能存在中間狀態。

  • 關于一致性,如果用戶時刻看到的數據都是一致的,那么稱之為強一致性。如果允許存在中間狀態,只要求經過一段時間后,數據最終是一致的,則稱之為最終一致性。此外,如果允許存在部分數據不一致,那么就稱之為弱一致性

可用性(Availability)
  • 可用性是指系統提供的服務必須一直處于可用的狀態,對于用戶的每一個操作請求總是能夠在有限的時間內返回結果。有限的時間內是指:對于用戶的一個操作請求,系統必須能夠在指定的時間內返回對應的處理結果,如果超過了這個時間范圍,那么系統就被認為是不可用的。

  • 返回結果是可用性的另一個非常重要的指標,它要求系統在完成對用戶請求的處理后,返回一個正常的響應結果,不論這個結果是成功還是失敗。

分區容錯性(Partition tolerance )
  • 布式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務,除非是整個網絡環境都發生了故障。

X/Open DTP模型與XA規范

X/Open,即現在的open group,是一個獨立的組織,主要負責制定各種行業技術標準。官網地址:http://www.opengroup.org/。X/Open組織主要由各大知名公司或者廠商進行支持,這些組織不光遵循X/Open組織定義的行業技術標準,也參與到標準的制定。下圖展示了open group目前主要成員(官網截圖):

DTP模型

  • 應用程序(Application Program ,簡稱AP):用于定義事務邊界(即定義事務的開始和結束),并且在事務邊界內對資源進行操作。

  • 資源管理器(Resource Manager,簡稱RM,一般也稱為事務參與者):如數據庫、文件系統等,并提供訪問資源的方式。

  • 事務管理器(Transaction Manager ,簡稱TM,一般也稱為事務協調者):負責分配事務唯一標識,監控事務的執行進度,并負責事務的提交、回滾等。

XA規范

這里的接口規范特別多,我們只要來講講幾個最重要的。

  • xa_start : 在 RM端調用此接口開啟一個XA事務,后面需要接上XID 作為參數。

  • xa_end : 取消當前線程與事務的關聯, 與 xa_start是配對使用。

  • xa_prepare : 詢問RM 是否已經準備好了提交事務。

  • xa_commit : 通知RM 提交事務分支。

  • xa_rollback : 通知RM 提交回滾事務分支。

XA二階段提交
  • 階段一 :TM通知各個RM準備提交它們的事務分支。如果RM判斷自己進行的工作可以被提交,那就就對工作內容進行持久化,再給TM肯定答復;要是發生了其他情況,那給TM的都是否定答復。在發送了否定答復并回滾了已經的工作后,RM就可以丟棄這個事務分支信息。

  • 階段二 :TM根據階段1各個RM prepare的結果,決定是提交還是回滾事務。如果所有的RM都prepare成功,那么TM通知所有的RM進行提交;如果有RM prepare失敗的話,則TM通知所有RM回滾自己的事務分支。

MySQL對XA協議的支持

MySQL 從5.0.3開始支持XA分布式事務,且只有InnoDB存儲引擎支持XA事務。MySQL 在DTP模型中也是屬于資源管理器RM。

MySQL XA 事務的 SQL語法
XA?START?xid????//開啟XA事務,xid是一個唯一值,表示事務分支標識符 XA?END?xid??//結束一個XA事務, XA?PREPARE?xid?準備提交 XA COMMIT xid [ONE PHASE]?//提交事務。兩階段提交協議中,如果只有一個RM參與,那么可以優化為一階段提交 XA?ROLLBACK?xid??//回滾 XA?RECOVER?[CONVERT?XID]??//列出所有處于PREPARE階段的XA事務
MySQL xid詳解

mysql中使用xid來作為一個事務分支的標識符。通過C語言進行描述,如下:

/? ??Transaction?branch?identification:?XID?and?NULLXID: ?/ #define?XIDDATASIZE?128??/??size?in?bytes??/ #define?MAXGTRIDSIZE?64??/??maximum?size?in?bytes?of?gtrid??/ #define?MAXBQUALSIZE?64??/??maximum?size?in?bytes?of?bqual??/ struct?xid_t?{long?formatID;?????/*?format?identifier?*/long?gtrid_length;?/*?value?1-64?*/long?bqual_length;?/*?value?1-64?*/char?data[XIDDATASIZE];}; /? ??A?value?of?-1?in?formatID?means?that?the?XID?is?null. ?/ typedef?struct?xid_t?XID; /? ??Declarations?of?routines?by?which?RMs?call?TMs: ?/ extern?int?ax_reg(int,?XID??,?long); extern?int?ax_unreg(int,?long);
  • gtrid :全局事務標識符(global transaction identifier),最大不能超過64字節。

  • bqual :分支限定符(branch qualifier),最大不能超過64字節。

  • formatId:記錄gtrid、bqual的格式,類似于memcached中flags字段的作用。

  • data :xid的值,其是 gtrid和bqual拼接后的內容。。

MySQL XA事務狀態

JTA規范

JTA(Java Transaction API):為J2EE平臺提供了分布式事務服務(distributed transaction)的能力。某種程度上,可以認為JTA規范是XA規范的Java版,其把XA規范中規定的DTP模型交互接口抽象成Java接口中的方法,并規定每個方法要實現什么樣的功能。

JTA 定義的接口
  • javax.transaction.TransactionManager : 事務管理器,負責事務的begin, commit,rollback 等命令。

  • javax.transaction.UserTransaction:用于聲明一個分布式事務。

  • javax.transaction.TransactionSynchronizationRegistry:事務同步注冊

  • javax.transaction.xa.XAResource:定義RM提供給TM操作的接口

  • javax.transaction.xa.Xid:事務xid接口。

TM provider:
  • 實現UserTransaction、TransactionManager、Transaction、TransactionSynchronizationRegistry、Synchronization、Xid接口,通過與XAResource接口交互來實現分布式事務。

RM provider:
  • XAResource接口需要由資源管理器者來實現,XAResource接口中定義了一些方法,這些方法將會被TM進行調用,如:

    • start方法:開啟事務分支

    • end方法:結束事務分支

    • prepare方法:準備提交

    • commit方法:提交

    • rollback方法:回滾

    • recover方法:列出所有處于PREPARED狀態的事務分支

ShardingSphere對XA分布式事務的支持

ShardingSphere針對XA分布式事務的接口以及JTA規范,提供了標準的,基于SPI實現的org.apache.shardingsphere.transaction.spi.ShardingTransactionManager。

public?interface?ShardingTransactionManager?extends?AutoCloseable?{/***?Initialize?sharding?transaction?manager.**?@param?databaseType?database?type*?@param?resourceDataSources?resource?data?sources*/void?init(DatabaseType?databaseType,?Collection<ResourceDataSource>?resourceDataSources);/***?Get?transaction?type.**?@return?transaction?type*/TransactionType?getTransactionType();/***?Judge?is?in?transaction?or?not.**?@return?in?transaction?or?not*/boolean?isInTransaction();/***?Get?transactional?connection.**?@param?dataSourceName?data?source?name*?@return?connection*?@throws?SQLException?SQL?exception*/Connection?getConnection(String?dataSourceName)?throws?SQLException;/***?Begin?transaction.*/void?begin();/***?Commit?transaction.*/void?commit();/***?Rollback?transaction.*/void?rollback(); }

對于XA分布式事務的支持的具體實現類為 :org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager。在此類中,會調用基于SPI實現的org.apache.shardingsphere.transaction.xa.spi.XATransactionManager,來進行XA事務的管理操作。

總結

我們了解了分布式事務的CAP理論,了解了X/Open的DTP模型,以及XA的接口規范,MySQL對XA協議的支持。最好我們講解了JTA的規范,以及ShardingSphere對XA事務進行整合的時候定義的SPI接口,這些都是很重要的理論基礎,接下來,我們將詳細來講解基于AtomkikosXATransactionManager的具體實現,以及源碼解析。

Shardingsphere整合Atomikos對XA分布式事務的源碼解析

Atomikos(https://www.atomikos.com/),其實是一家公司的名字,提供了基于JTA規范的XA分布式事務TM的實現。其旗下最著名的產品就是事務管理器。產品分兩個版本:

  • TransactionEssentials:開源的免費產品;

  • ExtremeTransactions:上商業版,需要收費。

這兩個產品的關系如下圖所示:

ExtremeTransactions在TransactionEssentials的基礎上額外提供了以下功能(重要的):

  • 支持TCC:這是一種柔性事務

  • 支持通過RMI、IIOP、SOAP這些遠程過程調用技術,進行事務傳播。

  • 事務日志云存儲,云端對事務進行恢復,并且提供了完善的管理后臺。

org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager詳解

我們簡單的來回顧下org.apache.shardingsphere.transaction.spi.ShardingTransactionManager

public?interface?ShardingTransactionManager?extends?AutoCloseable?{/***?Initialize?sharding?transaction?manager.**?@param?databaseType?database?type*?@param?resourceDataSources?resource?data?sources*/void?init(DatabaseType?databaseType,?Collection<ResourceDataSource>?resourceDataSources);/***?Get?transaction?type.**?@return?transaction?type*/TransactionType?getTransactionType();/***?Judge?is?in?transaction?or?not.**?@return?in?transaction?or?not*/boolean?isInTransaction();/***?Get?transactional?connection.**?@param?dataSourceName?data?source?name*?@return?connection*?@throws?SQLException?SQL?exception*/Connection?getConnection(String?dataSourceName)?throws?SQLException;/***?Begin?transaction.*/void?begin();/***?Commit?transaction.*/void?commit();/***?Rollback?transaction.*/void?rollback(); }

我們重點先關注init方法,從它的命名,你就應該能夠看出來,這是整個框架的初始化方法,讓我們來看看它是如何進行初始化的。

private?final?Map<String,?XATransactionDataSource>?cachedDataSources?=?new?HashMap<>();private?final?XATransactionManager?xaTransactionManager?=?XATransactionManagerLoader.getInstance().getTransactionManager();@Overridepublic?void?init(final?DatabaseType?databaseType,?final?Collection<ResourceDataSource>?resourceDataSources)?{for?(ResourceDataSource?each?:?resourceDataSources)?{cachedDataSources.put(each.getOriginalName(),?new?XATransactionDataSource(databaseType,?each.getUniqueResourceName(),?each.getDataSource(),?xaTransactionManager));}xaTransactionManager.init();}
  • 首先SPI的方式加載XATransactionManager的具體實現類,這里返回的就是org.apache.shardingsphere.transaction.xa.atomikos.manager.AtomikosTransactionManager。

  • 我們在關注下 new XATransactionDataSource() , 進入 org.apache.shardingsphere.transaction.xa.jta.datasource。XATransactionDataSource類的構造方法。

public?XATransactionDataSource(final?DatabaseType?databaseType,?final?String?resourceName,?final?DataSource?dataSource,?final?XATransactionManager?xaTransactionManager)?{this.databaseType?=?databaseType;this.resourceName?=?resourceName;this.dataSource?=?dataSource;if?(!CONTAINER_DATASOURCE_NAMES.contains(dataSource.getClass().getSimpleName()))?{//?重點關注?1?,返回了xaDatasourcexaDataSource?=?XADataSourceFactory.build(databaseType,?dataSource);this.xaTransactionManager?=?xaTransactionManager;//?重點關注2?注冊資源xaTransactionManager.registerRecoveryResource(resourceName,?xaDataSource);}}
  • 我們重點來關注 XADataSourceFactory.build(databaseType, dataSource),從名字我們就可以看出,這應該是返回JTA規范里面的XADataSource,在ShardingSphere里面很多的功能,可以從代碼風格的命名上就能猜出來,這就是優雅代碼(吹一波)。不多逼逼,我們進入該方法。

public?final?class?XADataSourceFactory?{public?static?XADataSource?build(final?DatabaseType?databaseType,?final?DataSource?dataSource)?{return?new?DataSourceSwapper(XADataSourceDefinitionFactory.getXADataSourceDefinition(databaseType)).swap(dataSource);} }
  • 首先又是一個SPI定義的 XADataSourceDefinitionFactory,它根據不同的數據庫類型,來加載不同的方言。然后我們進入 swap方法。

?public?XADataSource?swap(final?DataSource?dataSource)?{XADataSource?result?=?createXADataSource();setProperties(result,?getDatabaseAccessConfiguration(dataSource));return?result;}
  • 很簡明,第一步創建,XADataSource,第二步給它設置屬性(包含數據的連接,用戶名密碼等),然后返回。

  • 返回 XATransactionDataSource 類,關注xaTransactionManager.registerRecoveryResource(resourceName, xaDataSource); 從名字可以看出,這是注冊事務恢復資源。這個我們在事務恢復的時候詳解。

  • 返回 XAShardingTransactionManager.init() ,我們重點來關注:xaTransactionManager.init();,最后進入AtomikosTransactionManager.init()。流程圖如下:

代碼:

public?final?class?AtomikosTransactionManager?implements?XATransactionManager?{private?final?UserTransactionManager?transactionManager?=?new?UserTransactionManager();private?final?UserTransactionService?userTransactionService?=?new?UserTransactionServiceImp();@Overridepublic?void?init()?{userTransactionService.init();}}
  • 進入UserTransactionServiceImp.init()

private?void?initialize()?{//添加恢復資源?不用關心for?(RecoverableResource?resource?:?resources_)?{Configuration.addResource?(?resource?);}for?(LogAdministrator?logAdministrator?:?logAdministrators_)?{Configuration.addLogAdministrator?(?logAdministrator?);}//注冊插件?不用關心for?(TransactionServicePlugin?nxt?:?tsListeners_)?{Configuration.registerTransactionServicePlugin?(?nxt?);}//獲取配置屬性?重點關心ConfigProperties?configProps?=?Configuration.getConfigProperties();configProps.applyUserSpecificProperties(properties_);//進行初始化Configuration.init();}
  • 我們重點關注,獲取配置屬性。最后進入com.atomikos.icatch.provider.imp.AssemblerImp.initializeProperties()方法。

?@Overridepublic?ConfigProperties?initializeProperties()?{//讀取classpath下的默認配置transactions-defaults.propertiesProperties?defaults?=?new?Properties();loadPropertiesFromClasspath(defaults,?DEFAULT_PROPERTIES_FILE_NAME);//讀取classpath下,transactions.properties配置,覆蓋transactions-defaults.properties中相同key的值Properties?transactionsProperties?=?new?Properties(defaults);loadPropertiesFromClasspath(transactionsProperties,?TRANSACTIONS_PROPERTIES_FILE_NAME);//讀取classpath下,jta.properties,覆蓋transactions-defaults.properties、transactions.properties中相同key的值Properties?jtaProperties?=?new?Properties(transactionsProperties);loadPropertiesFromClasspath(jtaProperties,?JTA_PROPERTIES_FILE_NAME);//讀取通過java?-Dcom.atomikos.icatch.file方式指定的自定義配置文件路徑,覆蓋之前的同名配置Properties?customProperties?=?new?Properties(jtaProperties);loadPropertiesFromCustomFilePath(customProperties);//最終構造一個ConfigProperties對象,來表示實際要使用的配置Properties?finalProperties?=?new?Properties(customProperties);return?new?ConfigProperties(finalProperties);}
  • 接下來重點關注, Configuration.init(), 進行初始化。

ublic?static?synchronized?boolean?init()?{boolean?startupInitiated?=?false;if?(service_?==?null)?{startupInitiated?=?true;//SPI方式加載插件注冊,無需過多關心addAllTransactionServicePluginServicesFromClasspath();ConfigProperties?configProperties?=?getConfigProperties();//調用插件的beforeInit方法進行初始化話,無需過多關心notifyBeforeInit(configProperties);//進行事務日志恢復的初始化,很重要,接下來詳解assembleSystemComponents(configProperties);//進入系統注解的初始化,一般重要initializeSystemComponents(configProperties);notifyAfterInit();if?(configProperties.getForceShutdownOnVmExit())?{addShutdownHook(new?ForceShutdownHook());}}return?startupInitiated;}
  • 我們先來關注 assembleSystemComponents(configProperties); 進入它,進入com.atomikos.icatch.provider.imp.AssemblerImp.assembleTransactionService()方法:

@Overridepublic?TransactionServiceProvider?assembleTransactionService(ConfigProperties?configProperties)?{RecoveryLog?recoveryLog?=null;//打印日志logProperties(configProperties.getCompletedProperties());//生成唯一名字String?tmUniqueName?=?configProperties.getTmUniqueName();long?maxTimeout?=?configProperties.getMaxTimeout();int?maxActives?=?configProperties.getMaxActives();boolean?threaded2pc?=?configProperties.getThreaded2pc();//SPI方式加載OltpLog?,這是最重要的擴展地方,如果用戶沒有SPI的方式去擴展那么就為nullOltpLog?oltpLog?=?createOltpLogFromClasspath();if?(oltpLog?==?null)?{LOGGER.logInfo("Using?default?(local)?logging?and?recovery...");//創建事務日志存儲資源Repository?repository?=?createRepository(configProperties);oltpLog?=?createOltpLog(repository);//????Assemble?recoveryLogrecoveryLog?=?createRecoveryLog(repository);}StateRecoveryManagerImp?recoveryManager?=?new?StateRecoveryManagerImp();recoveryManager.setOltpLog(oltpLog);//生成唯一id生成器,以后生成XID會用的到UniqueIdMgr?idMgr?=?new?UniqueIdMgr?(?tmUniqueName?);int?overflow?=?idMgr.getMaxIdLengthInBytes()?-?MAX_TID_LENGTH;if?(?overflow?>?0?)?{//?see?case?73086String?msg?=?"Value?too?long?:?"?+?tmUniqueName;LOGGER.logFatal?(?msg?);throw?new?SysException(msg);}return?new?TransactionServiceImp(tmUniqueName,?recoveryManager,?idMgr,?maxTimeout,?maxActives,?!threaded2pc,?recoveryLog);}
  • 我們重點來分析createOltpLogFromClasspath(), 采用SPI的加載方式來獲取,默認這里會返回 null, 什么意思呢?就是當沒有擴展的時候,atomikos,會創建框架自定義的資源,來存儲事務日志。

private?OltpLog?createOltpLogFromClasspath()?{OltpLog?ret?=?null;ServiceLoader<OltpLogFactory>?loader?=?ServiceLoader.load(OltpLogFactory.class,Configuration.class.getClassLoader());int?i?=?0;for?(OltpLogFactory?l?:?loader?)?{ret?=?l.createOltpLog();i++;}if?(i?>?1)?{String?msg?=?"More?than?one?OltpLogFactory?found?in?classpath?-?error?in?configuration!";LOGGER.logFatal(msg);throw?new?SysException(msg);}return?ret;}
  • 我們跟著進入 Repository repository = createRepository(configProperties);

?private?CachedRepository?createCoordinatorLogEntryRepository(ConfigProperties?configProperties)?throws?LogException?{//創建內存資源存儲InMemoryRepository?inMemoryCoordinatorLogEntryRepository?=?new?InMemoryRepository();//進行初始化inMemoryCoordinatorLogEntryRepository.init();//創建使用文件存儲資源作為backupFileSystemRepository?backupCoordinatorLogEntryRepository?=?new?FileSystemRepository();//進行初始化backupCoordinatorLogEntryRepository.init();//內存與file資源進行合并CachedRepository?repository?=?new?CachedRepository(inMemoryCoordinatorLogEntryRepository,?backupCoordinatorLogEntryRepository);repository.init();return?repository;}
  • 這里就會創建出 CachedRepository,里面包含了 ?InMemoryRepository 與 FileSystemRepository

  • 回到主線 com.atomikos.icatch.config.Configuration.init(), 最后來分析下notifyAfterInit();

?private?static?void?notifyAfterInit()?{//進行插件的初始化for?(TransactionServicePlugin?p?:?tsListenersList_)?{p.afterInit();}for?(LogAdministrator?a?:?logAdministrators_)?{a.registerLogControl(service_.getLogControl());}//設置事務恢復服務,進行事務的恢復for?(RecoverableResource?r?:?resourceList_?)?{r.setRecoveryService(recoveryService_);}}
  • 插件的初始化會進入com.atomikos.icatch.jta.JtaTransactionServicePlugin.afterInit()

?public?void?afterInit()?{TransactionManagerImp.installTransactionManager(Configuration.getCompositeTransactionManager(),?autoRegisterResources);//如果我們自定義擴展了?OltpLog?,這里就會返回null,如果是null,那么XaResourceRecoveryManager就是nullRecoveryLog?recoveryLog?=?Configuration.getRecoveryLog();long?maxTimeout?=?Configuration.getConfigProperties().getMaxTimeout();if?(recoveryLog?!=?null)?{XaResourceRecoveryManager.installXaResourceRecoveryManager(new?DefaultXaRecoveryLog(recoveryLog,?maxTimeout),Configuration.getConfigProperties().getTmUniqueName());}}
  • 重點注意 RecoveryLog recoveryLog = Configuration.getRecoveryLog(); ,如果用戶采用SPI的方式,擴展了com.atomikos.recovery.OltpLog ,這里就會返回 null。如果是null,則不會對 XaResourceRecoveryManager 進行初始化。

  • 回到 notifyAfterInit(), 我們來分析 setRecoveryService。

public?void?setRecoveryService?(?RecoveryService?recoveryService?)throws?ResourceException{if?(?recoveryService?!=?null?)?{if?(?LOGGER.isTraceEnabled()?)?LOGGER.logTrace?(?"Installing?recovery?service?on?resource?"+?getName?()?);this.branchIdentifier=recoveryService.getName();recover();}}
  • 我們進入 recover() 方法:

?public?void?recover()?{XaResourceRecoveryManager?xaResourceRecoveryManager?=?XaResourceRecoveryManager.getInstance();//null?for?LogCloud?recoveryif?(xaResourceRecoveryManager?!=?null)?{try?{xaResourceRecoveryManager.recover(getXAResource());}?catch?(Exception?e)?{refreshXAResource();?//cf?case?156968}}}
  • 看到最關鍵的注釋了嗎,如果用戶采用SPI的方式,擴展了com.atomikos.recovery.OltpLog,那么XaResourceRecoveryManager 為null,則就會進行云端恢復,反之則進行事務恢復。事務恢復很復雜,我們會單獨來講。

到這里atomikos的基本的初始化已經完成。

atomikos事務begin流程

我們知道,本地的事務,都會有一個 trainsaction.begin, 對應XA分布式事務來說也不另外,我們再把思路切換回XAShardingTransactionManager.begin(), 會調用com.atomikos.icatch.jta.TransactionManagerImp.begin()。流程圖如下:

代碼:

??public?void?begin?(?int?timeout?)?throws?NotSupportedException,SystemException{CompositeTransaction?ct?=?null;ResumePreviousTransactionSubTxAwareParticipant?resumeParticipant?=?null;ct?=?compositeTransactionManager.getCompositeTransaction();if?(?ct?!=?null?&&?ct.getProperty?(??JTA_PROPERTY_NAME?)?==?null?)?{LOGGER.logWarning?(?"JTA:?temporarily?suspending?incompatible?transaction:?"?+?ct.getTid()?+"?(will?be?resumed?after?JTA?transaction?ends)"?);ct?=?compositeTransactionManager.suspend();resumeParticipant?=?new?ResumePreviousTransactionSubTxAwareParticipant?(?ct?);}try?{//創建事務補償點ct?=?compositeTransactionManager.createCompositeTransaction?(?(?(?long?)?timeout?)?*?1000?);if?(?resumeParticipant?!=?null?)?ct.addSubTxAwareParticipant?(?resumeParticipant?);if?(?ct.isRoot?()?&&?getDefaultSerial?()?)ct.setSerial?();ct.setProperty?(?JTA_PROPERTY_NAME?,?"true"?);}?catch?(?SysException?se?)?{String?msg?=?"Error?in?begin()";LOGGER.logError(?msg?,?se?);throw?new?ExtendedSystemException?(?msg?,?se?);}recreateCompositeTransactionAsJtaTransaction(ct);}
  • 這里我們主要關注 compositeTransactionManager.createCompositeTransaction(),

public?CompositeTransaction?createCompositeTransaction?(?long?timeout?)?throws?SysException{CompositeTransaction?ct?=?null?,?ret?=?null;ct?=?getCurrentTx?();if?(?ct?==?null?)?{ret?=?getTransactionService().createCompositeTransaction?(?timeout?);if(LOGGER.isDebugEnabled()){LOGGER.logDebug("createCompositeTransaction?(?"?+?timeout?+?"?):?"+?"created?new?ROOT?transaction?with?id?"?+?ret.getTid?());}}?else?{if(LOGGER.isDebugEnabled())?LOGGER.logDebug("createCompositeTransaction?(?"?+?timeout?+?"?)");ret?=?ct.createSubTransaction?();}Thread?thread?=?Thread.currentThread?();setThreadMappings?(?ret,?thread?);return?ret;}
  • 創建了事務補償點,然后把他放到了用當前線程作為key的Map當中,這里思考,為啥它不用 threadLocal。

到這里atomikos的事務begin流程已經完成。大家可能有些疑惑,begin好像什么都沒有做,XA start 也沒調用?別慌,下一節繼續來講。

XATransactionDataSource getConnection() 流程

我們都知道想要執行SQL語句,必須要獲取到數據庫的connection。讓我們再回到 XAShardingTransactionManager.getConnection() 最后會調用到org.apache.shardingsphere.transaction.xa.jta.datasourceXATransactionDataSource.getConnection()。流程圖如下:

代碼 :

?public?Connection?getConnection()?throws?SQLException,?SystemException,?RollbackException?{//先檢查是否已經有存在的connection,這一步很關心,也是XA的關鍵,因為XA事務,必須在同一個connectionif?(CONTAINER_DATASOURCE_NAMES.contains(dataSource.getClass().getSimpleName()))?{return?dataSource.getConnection();}//獲取數據庫連接Connection?result?=?dataSource.getConnection();//轉成XAConnection,其實是同一個連接XAConnection?xaConnection?=?XAConnectionFactory.createXAConnection(databaseType,?xaDataSource,?result);//獲取JTA事務定義接口Transaction?transaction?=?xaTransactionManager.getTransactionManager().getTransaction();if?(!enlistedTransactions.get().contains(transaction))?{//進行資源注冊transaction.enlistResource(new?SingleXAResource(resourceName,?xaConnection.getXAResource()));transaction.registerSynchronization(new?Synchronization()?{@Overridepublic?void?beforeCompletion()?{enlistedTransactions.get().remove(transaction);}@Overridepublic?void?afterCompletion(final?int?status)?{enlistedTransactions.get().clear();}});enlistedTransactions.get().add(transaction);}return?result;}
  • 首先第一步很關心,尤其是對shardingsphere來說,因為在一個事務里面,會有多個SQL語句,打到相同的數據庫,所以對相同的數據庫,必須獲取同一個XAConnection,這樣才能進行XA事務的提交與回滾。

  • 我們接下來關心 transaction.enlistResource(new SingleXAResource(resourceName, xaConnection.getXAResource()));, 會進入com.atomikos.icatch.jta.TransactionImp.enlistResource(), 代碼太長,截取一部分。

try?{restx?=?(XAResourceTransaction)?res.getResourceTransaction(this.compositeTransaction);//?next,?we?MUST?set?the?xa?resource?again,//?because?ONLY?the?instance?we?got?as?argument//?is?available?for?use?now?!//?older?instances?(set?in?restx?from?previous?sibling)//?have?connections?that?may?be?in?reuse?already//?->old?xares?not?valid?except?for?2pc?operationsrestx.setXAResource(xares);restx.resume();}?catch?(ResourceException?re)?{throw?new?ExtendedSystemException("Unexpected?error?during?enlist",?re);}?catch?(RuntimeException?e)?{throw?e;}addXAResourceTransaction(restx,?xares);
  • 我們直接看 restx.resume();

public?synchronized?void?resume()?throws?ResourceException?{int?flag?=?0;String?logFlag?=?"";if?(this.state.equals(TxState.LOCALLY_DONE))?{//?reused?instanceflag?=?XAResource.TMJOIN;logFlag?=?"XAResource.TMJOIN";}?else?if?(!this.knownInResource)?{//?new?instanceflag?=?XAResource.TMNOFLAGS;logFlag?=?"XAResource.TMNOFLAGS";}?elsethrow?new?IllegalStateException("Wrong?state?for?resume:?"+?this.state);try?{if?(LOGGER.isDebugEnabled())?{LOGGER.logDebug("XAResource.start?(?"?+?this.xidToHexString+?"?,?"?+?logFlag?+?"?)?on?resource?"+?this.resourcename+?"?represented?by?XAResource?instance?"+?this.xaresource);}this.xaresource.start(this.xid,?flag);}?catch?(XAException?xaerr)?{String?msg?=?interpretErrorCode(this.resourcename,?"resume",this.xid,?xaerr.errorCode);LOGGER.logWarning(msg,?xaerr);throw?new?ResourceException(msg,?xaerr);}setState(TxState.ACTIVE);this.knownInResource?=?true;}
  • 哦多尅,看見了嗎,各位,看見了 this.xaresource.start(this.xid, flag); 了嗎????,我們進去,假設我們使用的Mysql數據庫:

?public?void?start(Xid?xid,?int?flags)?throws?XAException?{StringBuilder?commandBuf?=?new?StringBuilder(300);commandBuf.append("XA?START?");appendXid(commandBuf,?xid);switch(flags)?{case?0:break;case?2097152:commandBuf.append("?JOIN");break;case?134217728:commandBuf.append("?RESUME");break;default:throw?new?XAException(-5);}this.dispatchCommand(commandBuf.toString());this.underlyingConnection.setInGlobalTx(true);}
  • 組裝XA start Xid SQL語句,進行執行。

到這里,我們總結下,在獲取數據庫連接的時候,我們執行了XA協議接口中的 XA start xid

atomikos事務commit流程

好了,上面我們已經開啟了事務,現在我們來分析下事務commit流程,我們再把視角切換回XAShardingTransactionManager.commit(),最后我們會進入com.atomikos.icatch.imp.CompositeTransactionImp.commit() 方法。流程圖如下:

代碼:

?public?void?commit?()?throws?HeurRollbackException,?HeurMixedException,HeurHazardException,?SysException,?SecurityException,RollbackException{//首先更新下事務日志的狀態doCommit?();setSiblingInfoForIncoming1pcRequestFromRemoteClient();if?(?isRoot?()?)?{//真正的commit操作coordinator.terminate?(?true?);}}
  • 我們關注coordinator.terminate ( true );

?protected?void?terminate?(?boolean?commit?)?throws?HeurRollbackException,HeurMixedException,?SysException,?java.lang.SecurityException,HeurCommitException,?HeurHazardException,?RollbackException,IllegalStateException{synchronized?(?fsm_?)?{if?(?commit?)?{//判斷有幾個參與者,如果只有一個,直接提交if?(?participants_.size?()?<=?1?)?{commit?(?true?);}?else?{//否則,走XA?2階段提交流程,先prepare,?再提交int?prepareResult?=?prepare?();//?make?sure?to?only?do?commit?if?NOT?read?onlyif?(?prepareResult?!=?Participant.READ_ONLY?)commit?(?false?);}}?else?{rollback?();}}}
  • 首先會判斷參與者的個數,這里我們可以理解為MySQL的database數量,如果只有一個,退化成一階段,直接提交。如果有多個,則走標準的XA二階段提交流程。

  • 我們來看 prepare (); 流程,最后會走到com.atomikos.icatch.imp.PrepareMessage.send() ---> com.atomikos.datasource.xa.XAResourceTransaction.prepare()

int?ret?=?0;terminateInResource();if?(TxState.ACTIVE?==?this.state)?{//?tolerate?non-delisting?apps/serverssuspend();}//?duplicate?prepares?can?happen?for?siblings?in?serial?subtxs!!!//?in?that?case,?the?second?prepare?just?returns?READONLYif?(this.state?==?TxState.IN_DOUBT)return?Participant.READ_ONLY;else?if?(!(this.state?==?TxState.LOCALLY_DONE))throw?new?SysException("Wrong?state?for?prepare:?"?+?this.state);try?{//?refresh?xaresource?for?MQSeries:?seems?to?close?XAResource?after//?suspend???testOrRefreshXAResourceFor2PC();if?(LOGGER.isTraceEnabled())?{LOGGER.logTrace("About?to?call?prepare?on?XAResource?instance:?"+?this.xaresource);}ret?=?this.xaresource.prepare(this.xid);}?catch?(XAException?xaerr)?{String?msg?=?interpretErrorCode(this.resourcename,?"prepare",this.xid,?xaerr.errorCode);if?(XAException.XA_RBBASE?<=?xaerr.errorCode&&?xaerr.errorCode?<=?XAException.XA_RBEND)?{LOGGER.logWarning(msg,?xaerr);?//?see?case?84253throw?new?RollbackException(msg);}?else?{LOGGER.logError(msg,?xaerr);throw?new?SysException(msg,?xaerr);}}setState(TxState.IN_DOUBT);if?(ret?==?XAResource.XA_RDONLY)?{if?(LOGGER.isDebugEnabled())?{LOGGER.logDebug("XAResource.prepare?(?"?+?this.xidToHexString+?"?)?returning?XAResource.XA_RDONLY?"?+?"on?resource?"+?this.resourcename+?"?represented?by?XAResource?instance?"+?this.xaresource);}return?Participant.READ_ONLY;}?else?{if?(LOGGER.isDebugEnabled())?{LOGGER.logDebug("XAResource.prepare?(?"?+?this.xidToHexString+?"?)?returning?OK?"?+?"on?resource?"+?this.resourcename+?"?represented?by?XAResource?instance?"+?this.xaresource);}return?Participant.READ_ONLY?+?1;}
  • 終于,我們看到了這么一句 ret = this.xaresource.prepare(this.xid); 但是等等,我們之前不是說了,XA start xid 以后要先 XA end xid 嗎?答案就在 suspend(); 里面。

public?synchronized?void?suspend()?throws?ResourceException?{//?BugzID:?20545//?State?may?be?IN_DOUBT?or?TERMINATED?when?a?connection?is?closed?AFTER//?commit!//?In?that?case,?don't?call?END?again,?and?also?don't?generate?any//?error!//?This?is?required?for?some?hibernate?connection?release?strategies.if?(this.state.equals(TxState.ACTIVE))?{try?{if?(LOGGER.isDebugEnabled())?{LOGGER.logDebug("XAResource.end?(?"?+?this.xidToHexString+?"?,?XAResource.TMSUCCESS?)?on?resource?"+?this.resourcename+?"?represented?by?XAResource?instance?"+?this.xaresource);}//執行了?xa?end?語句this.xaresource.end(this.xid,?XAResource.TMSUCCESS);}?catch?(XAException?xaerr)?{String?msg?=?interpretErrorCode(this.resourcename,?"end",this.xid,?xaerr.errorCode);if?(LOGGER.isTraceEnabled())LOGGER.logTrace(msg,?xaerr);//?don't?throw:?fix?for?case?102827}setState(TxState.LOCALLY_DONE);}}

到了這里,我們已經執行了 XA start xid -> XA end xid --> XA prepare xid, 接下來就是最后一步 commit

  • 我們再回到 terminate(false) 方法,來看 commit()流程。其實和 prepare流程一樣,最后會走到 com.atomikos.datasource.xa.XAResourceTransaction.commit()。commit執行完,數據提交

//繁雜代碼過多,就顯示核心的 this.xaresource.commit(this.xid,?onePhase);

思考:這里的參與者提交是在一個循環里面,一個一個提交的,如果之前的提交了,后面的參與者提交的時候,掛了,就會造成數據的不一致性。

Atomikos rollback() 流程

上面我們已經分析了commit流程,其實rollback流程和commit流程一樣,我們在把目光切換回 org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager.rollback() ,最后會執行到com.atomikos.icatch.imp.CompositeTransactionImp.rollback()。

????public?void?rollback?()?throws?IllegalStateException,?SysException{//清空資源,更新事務日志狀態等doRollback?();if?(?isRoot?()?)?{try?{coordinator.terminate?(?false?);}?catch?(?Exception?e?)?{throw?new?SysException?(?"Unexpected?error?in?rollback:?"?+?e.getMessage?(),?e?);}}}
  • 重點關注 coordinator.terminate ( false ); ,這個和 commit流程是一樣的,只不過在 commit流程里面,參數傳的是true。

?protected?void?terminate?(?boolean?commit?)?throws?HeurRollbackException,HeurMixedException,?SysException,?java.lang.SecurityException,HeurCommitException,?HeurHazardException,?RollbackException,IllegalStateException{synchronized?(?fsm_?)?{if?(?commit?)?{if?(?participants_.size?()?<=?1?)?{commit?(?true?);}?else?{int?prepareResult?=?prepare?();//?make?sure?to?only?do?commit?if?NOT?read?onlyif?(?prepareResult?!=?Participant.READ_ONLY?)commit?(?false?);}}?else?{//如果是false,走的是rollbackrollback?();}}}
  • 我們重點關注 rollback() ,最后會走到com.atomikos.datasource.xa.XAResourceTransaction.rollback()。

public?synchronized?void?rollback()throws?HeurCommitException,?HeurMixedException,HeurHazardException,?SysException?{terminateInResource();if?(rollbackShouldDoNothing())?{return;}if?(this.state.equals(TxState.TERMINATED))?{return;}if?(this.state.equals(TxState.HEUR_MIXED))throw?new?HeurMixedException();if?(this.state.equals(TxState.HEUR_COMMITTED))throw?new?HeurCommitException();if?(this.xaresource?==?null)?{throw?new?HeurHazardException("XAResourceTransaction?"+?getXid()?+?":?no?XAResource?to?rollback?");}try?{if?(this.state.equals(TxState.ACTIVE))?{?//?first?suspend?xidsuspend();}//?refresh?xaresource?for?MQSeries:?seems?to?close?XAResource?after//?suspend???testOrRefreshXAResourceFor2PC();if?(LOGGER.isDebugEnabled())?{LOGGER.logDebug("XAResource.rollback?(?"?+?this.xidToHexString+?"?)?"?+?"on?resource?"?+?this.resourcename+?"?represented?by?XAResource?instance?"+?this.xaresource);}this.xaresource.rollback(this.xid);

先在supend()方法里面執行了 XA end xid 語句, 接下來執行 this.xaresource.rollback(this.xid); 進行數據的回滾。

Atomikos-recover 流程

說事務恢復流程之前,我們來討論下,會啥會出現事務恢復?XA二階段提交協議不是強一致性的嗎?要解答這個問題,我們就要來看看XA二階段協議有什么問題?

問題一 :單點故障

由于協調者的重要性,一旦協調者TM發生故障。參與者RM會一直阻塞下去。尤其在第二階段,協調者發生故障,那么所有的參與者還都處于鎖定事務資源的狀態中,而無法繼續完成事務操作。(如果是協調者掛掉,可以重新選舉一個協調者,但是無法解決因為協調者宕機導致的參與者處于阻塞狀態的問題)

問題二 :數據不一致

數據不一致。在二階段提交的階段二中,當協調者向參與者發送commit請求之后,發生了局部網絡異常或者在發送commit請求過程中協調者發生了故障,這會導致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執行commit操作。但是其他部分未接到commit請求的機器則無法執行事務提交。于是整個分布式系統便出現了數據不一致性的現象。

如何解決?

解決的方案簡單,就是我們在事務的操作的每一步,我們都需要對事務狀態的日志進行人為的記錄,我們可以把日志記錄存儲在我們想存儲的地方,可以是本地存儲,也可以中心化的存儲。atomikos的開源版本,我們之前也分析了,它是使用內存 + file的方式,存儲在本地,這樣的話,如果在一個集群系統里面,如果有節點宕機,日志又存儲在本地,所以事務不能及時的恢復(需要重啟服務)。

Atomikos 多場景下事務恢復。

Atomikos 提供了二種方式,來應對不同場景下的異常情況。

  • 場景一:服務節點不宕機,因為其他的原因,產生需要事務恢復的情況。這個時候才要定時任務進行恢復。具體的代碼 com.atomikos.icatch.imp.TransactionServiceImp.init() 方法,會初始化一個定時任務,進行事務的恢復。

public?synchronized?void?init?(?Properties?properties?)?throws?SysException{shutdownInProgress_?=?false;control_?=?new?com.atomikos.icatch.admin.imp.LogControlImp?(?(AdminLog)?this.recoveryLog?);ConfigProperties?configProperties?=?new?ConfigProperties(properties);long?recoveryDelay?=?configProperties.getRecoveryDelay();recoveryTimer?=?new?PooledAlarmTimer(recoveryDelay);recoveryTimer.addAlarmTimerListener(new?AlarmTimerListener()?{@Overridepublic?void?alarm(AlarmTimer?timer)?{//進行事務恢復performRecovery();}});TaskManager.SINGLETON.executeTask(recoveryTimer);initialized_?=?true;}
  • 最終會進入com.atomikos.datasource.xa.XATransactionalResource.recover() 方法。

???public?void?recover()?{XaResourceRecoveryManager?xaResourceRecoveryManager?=?XaResourceRecoveryManager.getInstance();if?(xaResourceRecoveryManager?!=?null)?{?//null?for?LogCloud?recoverytry?{xaResourceRecoveryManager.recover(getXAResource());}?catch?(Exception?e)?{refreshXAResource();?//cf?case?156968}}}
  • 場景二: 當服務節點宕機重啟動過程中進行事務的恢復。具體實現在com.atomikos.datasource.xa.XATransactionalResource.setRecoveryService()方法里面

?@Overridepublic?void?setRecoveryService?(?RecoveryService?recoveryService?)throws?ResourceException{if?(?recoveryService?!=?null?)?{if?(?LOGGER.isTraceEnabled()?)?LOGGER.logTrace?(?"Installing?recovery?service?on?resource?"+?getName?()?);this.branchIdentifier=recoveryService.getName();//進行事務恢復recover();}}

com.atomikos.datasource.xa.XATransactionalResource.recover() 流程詳解。


主代碼:

?public?void?recover(XAResource?xaResource)?throws?XAException?{//?根據XA?recovery?協議獲取?xidList<XID>?xidsToRecover?=?retrievePreparedXidsFromXaResource(xaResource);Collection<XID>?xidsToCommit;try?{//?xid?與日志記錄的xid進行匹配xidsToCommit?=?retrieveExpiredCommittingXidsFromLog();for?(XID?xid?:?xidsToRecover)?{if?(xidsToCommit.contains(xid))?{//執行?XA?commit?xid?進行提交replayCommit(xid,?xaResource);}?else?{attemptPresumedAbort(xid,?xaResource);}}}?catch?(LogException?couldNotRetrieveCommittingXids)?{LOGGER.logWarning("Transient?error?while?recovering?-?will?retry?later...",?couldNotRetrieveCommittingXids);}}
  • 我們來看一下如何根據 XA recovery 協議獲取RM端存儲的xid。進入方法 retrievePreparedXidsFromXaResource(xaResource), 最后進入 com.atomikos.datasource.xa.RecoveryScan.recoverXids()方法。

public?static?List<XID>?recoverXids(XAResource?xaResource,?XidSelector?selector)?throws?XAException?{List<XID>?ret?=?new?ArrayList<XID>();boolean?done?=?false;int?flags?=?XAResource.TMSTARTRSCAN;Xid[]?xidsFromLastScan?=?null;List<XID>?allRecoveredXidsSoFar?=?new?ArrayList<XID>();do?{xidsFromLastScan?=?xaResource.recover(flags);flags?=?XAResource.TMNOFLAGS;done?=?(xidsFromLastScan?==?null?||?xidsFromLastScan.length?==?0);if?(!done)?{//?TEMPTATIVELY?SET?done?TO?TRUE//?TO?TOLERATE?ORACLE?8.1.7?INFINITE//?LOOP?(ALWAYS?RETURNS?SAME?RECOVER//?SET).?IF?A?NEW?SET?OF?XIDS?IS?RETURNED//?THEN?done?WILL?BE?RESET?TO?FALSEdone?=?true;for?(?int?i?=?0;?i?<?xidsFromLastScan.length;?i++?)?{XID?xid?=?new?XID?(?xidsFromLastScan[i]?);//?our?own?XID?implements?equals?and?hashCode?properlyif?(!allRecoveredXidsSoFar.contains(xid))?{//?a?new?xid?is?returned?->?we?can?not?be?in?a?recovery?loop?->?go?onallRecoveredXidsSoFar.add(xid);done?=?false;if?(selector.selects(xid))?{ret.add(xid);}}}}}?while?(!done);return?ret;}
  • 我們重點關注xidsFromLastScan = xaResource.recover(flags); 這個方法,如果我們使用MySQL,那么就會進入 MysqlXAConnection.recover()方法。執行 XA recovery xid 語句來獲取 xid。

?protected?static?Xid[]?recover(Connection?c,?int?flag)?throws?XAException?{/**?The?XA?RECOVER?statement?returns?information?for?those?XA?transactions?on?the?MySQL?server?that?are?in?the?PREPARED?state.?(See?Section?13.4.7.2,????XA*?Transaction?States???.)?The?output?includes?a?row?for?each?such?XA?transaction?on?the?server,?regardless?of?which?client?started?it.**?XA?RECOVER?output?rows?look?like?this?(for?an?example?xid?value?consisting?of?the?parts?'abc',?'def',?and?7):**?mysql>?XA?RECOVER;*?+----------+--------------+--------------+--------+*?|?formatID?|?gtrid_length?|?bqual_length?|?data?|*?+----------+--------------+--------------+--------+*?|?7?|?3?|?3?|?abcdef?|*?+----------+--------------+--------------+--------+**?The?output?columns?have?the?following?meanings:**?formatID?is?the?formatID?part?of?the?transaction?xid*?gtrid_length?is?the?length?in?bytes?of?the?gtrid?part?of?the?xid*?bqual_length?is?the?length?in?bytes?of?the?bqual?part?of?the?xid*?data?is?the?concatenation?of?the?gtrid?and?bqual?parts?of?the?xid*/boolean?startRscan?=?((flag?&?TMSTARTRSCAN)?>?0);boolean?endRscan?=?((flag?&?TMENDRSCAN)?>?0);if?(!startRscan?&&?!endRscan?&&?flag?!=?TMNOFLAGS)?{throw?new?MysqlXAException(XAException.XAER_INVAL,?Messages.getString("MysqlXAConnection.001"),?null);}////?We?return?all?recovered?XIDs?at?once,?so?if?not??TMSTARTRSCAN,?return?no?new?XIDs////?We?don't?attempt?to?maintain?state?to?check?for?TMNOFLAGS?"outside"?of?a?scan//if?(!startRscan)?{return?new?Xid[0];}ResultSet?rs?=?null;Statement?stmt?=?null;List<MysqlXid>?recoveredXidList?=?new?ArrayList<MysqlXid>();try?{//?TODO:?Cache?this?for?lifetime?of?XAConnectionstmt?=?c.createStatement();rs?=?stmt.executeQuery("XA?RECOVER");while?(rs.next())?{final?int?formatId?=?rs.getInt(1);int?gtridLength?=?rs.getInt(2);int?bqualLength?=?rs.getInt(3);byte[]?gtridAndBqual?=?rs.getBytes(4);final?byte[]?gtrid?=?new?byte[gtridLength];final?byte[]?bqual?=?new?byte[bqualLength];if?(gtridAndBqual.length?!=?(gtridLength?+?bqualLength))?{throw?new?MysqlXAException(XAException.XA_RBPROTO,?Messages.getString("MysqlXAConnection.002"),?null);}System.arraycopy(gtridAndBqual,?0,?gtrid,?0,?gtridLength);System.arraycopy(gtridAndBqual,?gtridLength,?bqual,?0,?bqualLength);recoveredXidList.add(new?MysqlXid(gtrid,?bqual,?formatId));}}?catch?(SQLException?sqlEx)?{throw?mapXAExceptionFromSQLException(sqlEx);}?finally?{if?(rs?!=?null)?{try?{rs.close();}?catch?(SQLException?sqlEx)?{throw?mapXAExceptionFromSQLException(sqlEx);}}if?(stmt?!=?null)?{try?{stmt.close();}?catch?(SQLException?sqlEx)?{throw?mapXAExceptionFromSQLException(sqlEx);}}}int?numXids?=?recoveredXidList.size();Xid[]?asXids?=?new?Xid[numXids];Object[]?asObjects?=?recoveredXidList.toArray();for?(int?i?=?0;?i?<?numXids;?i++)?{asXids[i]?=?(Xid)?asObjects[i];}return?asXids;}
  • 這里要注意如果Mysql的版本 <5.7.7 ,則不會有任何數據,在以后的版本中Mysql進行了修復,因此如果我們想要使用MySQL充當RM,版本必須 >= 5.7.7 ,原因是:

MySQL 5.6版本在客戶端退出的時候,自動把已經prepare的事務回滾了,那么MySQL為什么要這樣做?這主要取決于MySQL的內部實現,MySQL 5.7以前的版本,對于prepare的事務,MySQL是不會記錄binlog的(官方說是減少fsync,起到了優化的作用)。只有當分布式事務提交的時候才會把前面的操作寫入binlog信息,所以對于binlog來說,分布式事務與普通的事務沒有區別,而prepare以前的操作信息都保存在連接的IO_CACHE中,如果這個時候客戶端退出了,以前的binlog信息都會被丟失,再次重連后允許提交的話,會造成Binlog丟失,從而造成主從數據的不一致,所以官方在客戶端退出的時候直接把已經prepare的事務都回滾了!

  • 回到主線再從自己記錄的事務日志里面獲取XID

??Collection<XID>?xidsToCommit?=?retrieveExpiredCommittingXidsFromLog();
  • 我們來看下獲取事務日志里面的XID的retrieveExpiredCommittingXidsFromLog()方法。然后進入com.atomikos.recovery.imp.RecoveryLogImp.getCommittingParticipants()方法。

public?Collection<ParticipantLogEntry>?getCommittingParticipants()throws?LogReadException?{Collection<ParticipantLogEntry>?committingParticipants?=?new?HashSet<ParticipantLogEntry>();Collection<CoordinatorLogEntry>?committingCoordinatorLogEntries?=?repository.findAllCommittingCoordinatorLogEntries();for?(CoordinatorLogEntry?coordinatorLogEntry?:?committingCoordinatorLogEntries)?{for?(ParticipantLogEntry?participantLogEntry?:?coordinatorLogEntry.participants)?{committingParticipants.add(participantLogEntry);}}return?committingParticipants;}

到這里我們來簡單介紹一下,事務日志的存儲結構。首先是 CoordinatorLogEntry,這是一次XA事務的所有信息實體類。

public?class?CoordinatorLogEntry?implements?Serializable?{//全局事務idpublic?final?String?id;//是否已經提交public?final?boolean?wasCommitted;/***?Only?for?subtransactions,?null?otherwise.*/public?final?String?superiorCoordinatorId;//參與者集合public?final?ParticipantLogEntry[]?participants; }
  • 再來看一下參與者實體類 ParticipantLogEntry :

public?class?ParticipantLogEntry?implements?Serializable?{private?static?final?long?serialVersionUID?=?1728296701394899871L;/***?The?ID?of?the?global?transaction?as?known?by?the?transaction?core.*/public?final?String?coordinatorId;/***?Identifies?the?participant?within?the?global?transaction.*/public?final?String?uri;/***?When?does?this?participant?expire?(expressed?in?millis?since?Jan?1,?1970)?*/public?final?long?expires;/***?Best-known?state?of?the?participant.*/public?final?TxState?state;/***?For?diagnostic?purposes,?null?if?not?relevant.*/public?final?String?resourceName; }
  • 回到com.atomikos.recovery.xa.DefaultXaRecoveryLog.getExpiredCommittingXids() 方法,可以到獲取了一次XA事務過程中,存儲的事務日志中的xid。

public?Set<XID>?getExpiredCommittingXids()?throws?LogReadException?{Set<XID>?ret?=?new?HashSet<XID>();Collection<ParticipantLogEntry>?entries?=?log.getCommittingParticipants();for?(ParticipantLogEntry?entry?:?entries)?{if?(expired(entry)?&&?!http(entry))?{XID?xid?=?new?XID(entry.coordinatorId,?entry.uri);ret.add(xid);}}return?ret;}
  • 如果從RM中通過XA recovery取出的XID,包含在從事務日志中取出的XID,則進行commit,否則進行rollback.

List<XID>?xidsToRecover?=?retrievePreparedXidsFromXaResource(xaResource);Collection<XID>?xidsToCommit;try?{xidsToCommit?=?retrieveExpiredCommittingXidsFromLog();for?(XID?xid?:?xidsToRecover)?{if?(xidsToCommit.contains(xid))?{replayCommit(xid,?xaResource);}?else?{attemptPresumedAbort(xid,?xaResource);}}}?catch?(LogException?couldNotRetrieveCommittingXids)?{LOGGER.logWarning("Transient?error?while?recovering?-?will?retry?later...",?couldNotRetrieveCommittingXids);}
  • replayCommit 方法如下:

private?void?replayCommit(XID?xid,?XAResource?xaResource)?{if?(LOGGER.isDebugEnabled())?LOGGER.logDebug("Replaying?commit?of?xid:?"?+?xid);try?{//進行事務提交xaResource.commit(xid,?false);//更新事務日志log.terminated(xid);}?catch?(XAException?e)?{if?(alreadyHeuristicallyTerminatedByResource(e))?{handleHeuristicTerminationByResource(xid,?xaResource,?e,?true);}?else?if?(xidTerminatedInResourceByConcurrentCommit(e))?{log.terminated(xid);}?else?{LOGGER.logWarning("Transient?error?while?replaying?commit?-?will?retry?later...",?e);}}}
  • attemptPresumedAbort(xid, xaResource); 方法如下:

private?void?attemptPresumedAbort(XID?xid,?XAResource?xaResource)?{try?{log.presumedAborting(xid);if?(LOGGER.isDebugEnabled())?LOGGER.logDebug("Presumed?abort?of?xid:?"?+?xid);try?{//進行回滾xaResource.rollback(xid);//更新日志狀態log.terminated(xid);}?catch?(XAException?e)?{if?(alreadyHeuristicallyTerminatedByResource(e))?{handleHeuristicTerminationByResource(xid,?xaResource,?e,?false);}?else?if?(xidTerminatedInResourceByConcurrentRollback(e))?{log.terminated(xid);}?else?{LOGGER.logWarning("Unexpected?exception?during?recovery?-?ignoring?to?retry?later...",?e);}}}?catch?(IllegalStateException?presumedAbortNotAllowedInCurrentLogState)?{//?ignore?to?retry?later?if?necessary}?catch?(LogException?logWriteException)?{LOGGER.logWarning("log?write?failed?for?Xid:?"+xid+",?ignoring?to?retry?later",?logWriteException);}}

總結

文章到此,已經寫的很長很多了,我們分析了ShardingSphere對于XA方案,提供了一套SPI解決方案,對Atomikos進行了整合,也分析了Atomikos初始化流程,開始事務流程,獲取連接流程,提交事務流程,回滾事務流程,事務恢復流程。希望對大家理解XA的原理有所幫助。

加入我們

Apache ShardingSphere 一直踐行Apache Way的開源之道,社區完全開放與平等,人人享受開源帶來的快樂。

地址: https://github.com/apache/shardingsphere

作者介紹:肖宇,Apache ShardingSphere Committer,開源hmily分布式事務框架作者, 開源soul網關作者,熱愛開源,追求寫優雅代碼。目前就職入京東數科,參與ShardingSphere的開源建設,以及分布式數據庫的研發工作。

想知道更多?描下面的二維碼關注我

后臺回復"技術",加入技術群

【精彩推薦】

  • 原創|OpenAPI標準規范

  • 如此簡單| ES最全詳細使用教程

  • ClickHouse到底是什么?為什么如此牛逼!

  • 原來ElasticSearch還可以這么理解

  • 面試官:InnoDB中一棵B+樹可以存放多少行數據?

  • 微服務下如何解耦?對于已經緊耦合下如何重構?

  • 如何構建一套高性能、高可用、低成本的視頻處理系統?

  • 架構之道:分離業務邏輯和技術細節

  • 星巴克不使用兩階段提交

點個贊+在看,少個 bug?????

總結

以上是生活随笔為你收集整理的深度剖析Apache Shardingsphere对分布式事务的支持的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品人妻人人做人人爽夜夜爽 | 日韩精品a片一区二区三区妖精 | 人妻天天爽夜夜爽一区二区 | 日本护士毛茸茸高潮 | 高清国产亚洲精品自在久久 | 67194成是人免费无码 | 日韩无套无码精品 | 国产亚洲精品久久久久久久 | 国产av一区二区精品久久凹凸 | 久久久久成人精品免费播放动漫 | 国产精品久久久久久无码 | 精品无码国产一区二区三区av | 牲交欧美兽交欧美 | av无码久久久久不卡免费网站 | 动漫av网站免费观看 | 亚洲日韩精品欧美一区二区 | 亚洲熟悉妇女xxx妇女av | 亚洲va中文字幕无码久久不卡 | 丰腴饱满的极品熟妇 | 国产精品自产拍在线观看 | 精品日本一区二区三区在线观看 | 好爽又高潮了毛片免费下载 | 亚洲国产成人a精品不卡在线 | 97久久国产亚洲精品超碰热 | 搡女人真爽免费视频大全 | 人妻体内射精一区二区三四 | 中文无码精品a∨在线观看不卡 | 国产亚洲精品精品国产亚洲综合 | 国产极品视觉盛宴 | а√资源新版在线天堂 | 国产亚洲精品久久久久久久久动漫 | √天堂资源地址中文在线 | 精品国产一区av天美传媒 | 国精产品一区二区三区 | 久热国产vs视频在线观看 | 久久久精品人妻久久影视 | 成人无码视频在线观看网站 | 无码人妻精品一区二区三区下载 | 蜜桃臀无码内射一区二区三区 | 久久无码专区国产精品s | 丰满人妻翻云覆雨呻吟视频 | 国产午夜手机精彩视频 | 久久无码专区国产精品s | 久久精品丝袜高跟鞋 | 亚洲天堂2017无码中文 | 欧美日韩视频无码一区二区三 | 国产熟女一区二区三区四区五区 | 最新国产乱人伦偷精品免费网站 | 亚洲无人区午夜福利码高清完整版 | 国产精品理论片在线观看 | 日本熟妇人妻xxxxx人hd | 日本欧美一区二区三区乱码 | 成熟人妻av无码专区 | 131美女爱做视频 | 少妇高潮一区二区三区99 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久久久久se色偷偷亚洲精品av | 日本www一道久久久免费榴莲 | 日韩欧美中文字幕公布 | 久久国产精品偷任你爽任你 | 全球成人中文在线 | 国产精品第一国产精品 | 国产精品沙发午睡系列 | 亚洲国产精品美女久久久久 | 国产激情艳情在线看视频 | 欧美 日韩 人妻 高清 中文 | 国产在热线精品视频 | 日日躁夜夜躁狠狠躁 | 日韩亚洲欧美中文高清在线 | 麻豆精品国产精华精华液好用吗 | 久久久久成人精品免费播放动漫 | 无码播放一区二区三区 | 18禁黄网站男男禁片免费观看 | 亚洲日韩av一区二区三区四区 | 精品人人妻人人澡人人爽人人 | 午夜精品久久久内射近拍高清 | 亚洲精品久久久久久久久久久 | 国产真人无遮挡作爱免费视频 | 俺去俺来也在线www色官网 | 亚洲大尺度无码无码专区 | 国产精品爱久久久久久久 | 国产精品爱久久久久久久 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品久久久久avwww潮水 | 久久久精品欧美一区二区免费 | 色妞www精品免费视频 | 人妻天天爽夜夜爽一区二区 | 丝袜美腿亚洲一区二区 | 日本乱人伦片中文三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲娇小与黑人巨大交 | 亚洲色在线无码国产精品不卡 | 天海翼激烈高潮到腰振不止 | 国产成人精品三级麻豆 | 国产高清不卡无码视频 | 国产成人一区二区三区在线观看 | 中文字幕无码免费久久9一区9 | 亚洲国产精品毛片av不卡在线 | 无码国模国产在线观看 | 国产三级久久久精品麻豆三级 | 国产精品办公室沙发 | 成人女人看片免费视频放人 | 久久亚洲a片com人成 | 久久精品女人天堂av免费观看 | 精品亚洲韩国一区二区三区 | 欧美freesex黑人又粗又大 | 久久人人97超碰a片精品 | 国产成人无码午夜视频在线观看 | 日产精品99久久久久久 | 99er热精品视频 | 亚洲综合另类小说色区 | 99精品国产综合久久久久五月天 | 99久久精品国产一区二区蜜芽 | 国产日产欧产精品精品app | 久久国产精品精品国产色婷婷 | 国产激情一区二区三区 | 亚洲成a人片在线观看无码3d | 青春草在线视频免费观看 | 国产艳妇av在线观看果冻传媒 | 欧美精品免费观看二区 | 熟女少妇人妻中文字幕 | 亚洲成a人一区二区三区 | 大屁股大乳丰满人妻 | 成熟女人特级毛片www免费 | 久久婷婷五月综合色国产香蕉 | 色情久久久av熟女人妻网站 | 日韩少妇内射免费播放 | 久久久久se色偷偷亚洲精品av | 久久99热只有频精品8 | 国产亚洲精品久久久ai换 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产黄在线观看免费观看不卡 | 粗大的内捧猛烈进出视频 | 精品水蜜桃久久久久久久 | 性欧美大战久久久久久久 | 无码人妻精品一区二区三区不卡 | √天堂资源地址中文在线 | 亚洲最大成人网站 | 中文字幕无线码免费人妻 | 丰满诱人的人妻3 | 18黄暴禁片在线观看 | 国产乱人偷精品人妻a片 | 性生交片免费无码看人 | 亚洲成av人影院在线观看 | 两性色午夜免费视频 | 香港三级日本三级妇三级 | 欧美阿v高清资源不卡在线播放 | 国产高潮视频在线观看 | 国产精品久免费的黄网站 | 亚洲精品国产a久久久久久 | 丰满肥臀大屁股熟妇激情视频 | 国产精品久久久久无码av色戒 | 国产又粗又硬又大爽黄老大爷视 | 国产猛烈高潮尖叫视频免费 | √天堂资源地址中文在线 | 国产亚洲精品精品国产亚洲综合 | 精品人妻中文字幕有码在线 | 熟女体下毛毛黑森林 | 久久久久久久久888 | 国产激情无码一区二区app | 国产成人无码av片在线观看不卡 | 激情五月综合色婷婷一区二区 | 丝袜人妻一区二区三区 | 国产精品成人av在线观看 | 亚洲人成影院在线无码按摩店 | 欧美人与动性行为视频 | 撕开奶罩揉吮奶头视频 | 精品无人区无码乱码毛片国产 | 欧美丰满熟妇xxxx | 任你躁国产自任一区二区三区 | 亚洲男女内射在线播放 | 人人爽人人爽人人片av亚洲 | 亚洲日韩av一区二区三区中文 | 精品欧美一区二区三区久久久 | 久久五月精品中文字幕 | 国内精品久久毛片一区二区 | 亚洲精品久久久久久久久久久 | 曰韩无码二三区中文字幕 | 国产精品爱久久久久久久 | 国产在线一区二区三区四区五区 | 无码午夜成人1000部免费视频 | 未满小14洗澡无码视频网站 | 人人妻在人人 | 日韩在线不卡免费视频一区 | 国产激情无码一区二区app | 中文无码成人免费视频在线观看 | 女人被爽到呻吟gif动态图视看 | 国产一区二区三区影院 | 青春草在线视频免费观看 | 国产黑色丝袜在线播放 | 欧美真人作爱免费视频 | 国产国产精品人在线视 | 全球成人中文在线 | 亚洲毛片av日韩av无码 | 无遮挡国产高潮视频免费观看 | 国产精品手机免费 | 中文亚洲成a人片在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | √天堂资源地址中文在线 | 奇米影视7777久久精品人人爽 | 久久婷婷五月综合色国产香蕉 | 青草视频在线播放 | 色五月丁香五月综合五月 | 十八禁视频网站在线观看 | 国产激情艳情在线看视频 | 国产香蕉97碰碰久久人人 | 全球成人中文在线 | 红桃av一区二区三区在线无码av | 国内精品久久毛片一区二区 | 亚洲娇小与黑人巨大交 | 日韩精品成人一区二区三区 | 国产激情无码一区二区 | 野外少妇愉情中文字幕 | 精品成在人线av无码免费看 | 小鲜肉自慰网站xnxx | 欧美性猛交xxxx富婆 | 国产一区二区三区四区五区加勒比 | 国产欧美精品一区二区三区 | 日本乱人伦片中文三区 | 亚洲精品综合一区二区三区在线 | 中文精品久久久久人妻不卡 | 中文字幕无码av波多野吉衣 | 亚洲午夜久久久影院 | a在线亚洲男人的天堂 | 国产精品久久国产精品99 | 久久久精品欧美一区二区免费 | 人妻少妇精品无码专区二区 | a片在线免费观看 | 日韩精品无码一区二区中文字幕 | 欧美午夜特黄aaaaaa片 | 国产内射爽爽大片视频社区在线 | 18无码粉嫩小泬无套在线观看 | 亚洲区小说区激情区图片区 | 国产精品理论片在线观看 | 中文字幕 人妻熟女 | 日本熟妇浓毛 | 久久亚洲日韩精品一区二区三区 | 亚洲色无码一区二区三区 | 国产精品久久福利网站 | 久久久精品456亚洲影院 | 久久天天躁夜夜躁狠狠 | аⅴ资源天堂资源库在线 | 一本精品99久久精品77 | 特大黑人娇小亚洲女 | 熟妇人妻无码xxx视频 | 亚洲精品国偷拍自产在线麻豆 | 国内少妇偷人精品视频 | 最新国产乱人伦偷精品免费网站 | 国产一区二区三区精品视频 | 在线视频网站www色 | 玩弄中年熟妇正在播放 | 精品久久久久久人妻无码中文字幕 | 久久国产劲爆∧v内射 | 好爽又高潮了毛片免费下载 | 久久99精品久久久久久动态图 | 国产精品久久国产精品99 | 亚洲国产欧美在线成人 | 国产真人无遮挡作爱免费视频 | 亚洲一区av无码专区在线观看 | 久久精品成人欧美大片 | 精品无人国产偷自产在线 | 国产午夜精品一区二区三区嫩草 | av无码不卡在线观看免费 | 人妻互换免费中文字幕 | 亚洲综合在线一区二区三区 | 成人综合网亚洲伊人 | 精品一区二区三区波多野结衣 | 呦交小u女精品视频 | 亚洲国产精品一区二区第一页 | 亚洲欧美日韩国产精品一区二区 | 久久婷婷五月综合色国产香蕉 | 国产激情无码一区二区app | 18无码粉嫩小泬无套在线观看 | 少妇高潮喷潮久久久影院 | 精品国产一区二区三区四区在线看 | 啦啦啦www在线观看免费视频 | 国产av人人夜夜澡人人爽麻豆 | 欧美人与物videos另类 | 一本久道久久综合婷婷五月 | 日韩人妻少妇一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 欧美国产日韩久久mv | 99久久亚洲精品无码毛片 | 久久久久久久女国产乱让韩 | 性欧美熟妇videofreesex | 亚洲 激情 小说 另类 欧美 | 亚洲人亚洲人成电影网站色 | 欧美日本免费一区二区三区 | a片在线免费观看 | 亚洲精品国产精品乱码不卡 | 亚洲欧洲日本无在线码 | 综合激情五月综合激情五月激情1 | 88国产精品欧美一区二区三区 | 亚洲а∨天堂久久精品2021 | 欧洲欧美人成视频在线 | 国产麻豆精品精东影业av网站 | 国产莉萝无码av在线播放 | 成人性做爰aaa片免费看 | 中文字幕无码人妻少妇免费 | 国产无遮挡又黄又爽免费视频 | 成年美女黄网站色大免费全看 | 欧美人妻一区二区三区 | 粗大的内捧猛烈进出视频 | 日日摸夜夜摸狠狠摸婷婷 | 天堂无码人妻精品一区二区三区 | 色综合视频一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 蜜桃臀无码内射一区二区三区 | 乱中年女人伦av三区 | 午夜无码人妻av大片色欲 | 国产精品久久久久7777 | 青青草原综合久久大伊人精品 | 成人免费视频视频在线观看 免费 | 亚洲综合无码一区二区三区 | 麻豆人妻少妇精品无码专区 | 久久国产精品萌白酱免费 | 精品亚洲韩国一区二区三区 | 激情五月综合色婷婷一区二区 | 国产人妻大战黑人第1集 | 亚洲自偷精品视频自拍 | 日本丰满护士爆乳xxxx | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 激情五月综合色婷婷一区二区 | 免费视频欧美无人区码 | 毛片内射-百度 | 国产一区二区三区精品视频 | 西西人体www44rt大胆高清 | 无码人妻久久一区二区三区不卡 | 日本乱偷人妻中文字幕 | 欧美 日韩 人妻 高清 中文 | 亚洲欧美日韩成人高清在线一区 | 熟女少妇在线视频播放 | 国产精品福利视频导航 | 日本一区二区三区免费播放 | 狂野欧美性猛xxxx乱大交 | 强奷人妻日本中文字幕 | 扒开双腿吃奶呻吟做受视频 | 亚洲精品一区二区三区婷婷月 | 亚洲 欧美 激情 小说 另类 | 国产69精品久久久久app下载 | 亚洲大尺度无码无码专区 | 亚洲娇小与黑人巨大交 | 一二三四在线观看免费视频 | 疯狂三人交性欧美 | 中文字幕色婷婷在线视频 | 亚洲a无码综合a国产av中文 | 国产亚洲精品精品国产亚洲综合 | 日本肉体xxxx裸交 | 国产sm调教视频在线观看 | 欧美成人高清在线播放 | 久久久中文久久久无码 | 欧美日韩久久久精品a片 | 欧美老妇交乱视频在线观看 | 一本无码人妻在中文字幕免费 | 自拍偷自拍亚洲精品10p | 精品人妻人人做人人爽 | 麻豆国产丝袜白领秘书在线观看 | 少女韩国电视剧在线观看完整 | 狠狠cao日日穞夜夜穞av | 亚洲s色大片在线观看 | 久久国产精品萌白酱免费 | 大肉大捧一进一出好爽视频 | 国产精品国产自线拍免费软件 | 亚洲精品一区二区三区四区五区 | 伊人久久婷婷五月综合97色 | 亚洲高清偷拍一区二区三区 | 99久久久无码国产精品免费 | 中文字幕日韩精品一区二区三区 | 国产人妻精品一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 人妻少妇被猛烈进入中文字幕 | 中文字幕人妻无码一区二区三区 | 亚洲人成影院在线无码按摩店 | 日本高清一区免费中文视频 | 午夜嘿嘿嘿影院 | 中文字幕无码av波多野吉衣 | 国产成人一区二区三区别 | 高潮喷水的毛片 | 美女黄网站人色视频免费国产 | 久久久婷婷五月亚洲97号色 | 精品厕所偷拍各类美女tp嘘嘘 | 久久久中文久久久无码 | 国产乱子伦视频在线播放 | 四虎4hu永久免费 | 黄网在线观看免费网站 | 男人的天堂av网站 | 久久久av男人的天堂 | 国模大胆一区二区三区 | 成人精品一区二区三区中文字幕 | 5858s亚洲色大成网站www | 国产乱人无码伦av在线a | 性生交片免费无码看人 | 熟妇女人妻丰满少妇中文字幕 | 国产农村妇女高潮大叫 | 美女极度色诱视频国产 | 精品水蜜桃久久久久久久 | 乱人伦人妻中文字幕无码久久网 | 九月婷婷人人澡人人添人人爽 | 国产内射老熟女aaaa | 76少妇精品导航 | 国产尤物精品视频 | 欧美激情一区二区三区成人 | 天堂无码人妻精品一区二区三区 | 欧美成人免费全部网站 | 国产综合久久久久鬼色 | 欧洲欧美人成视频在线 | 亚洲精品www久久久 | 人人澡人人透人人爽 | 人人妻人人澡人人爽人人精品 | 色综合久久网 | 国产激情艳情在线看视频 | 日本爽爽爽爽爽爽在线观看免 | 久久精品无码一区二区三区 | 麻豆md0077饥渴少妇 | 精品熟女少妇av免费观看 | 国产xxx69麻豆国语对白 | 国产香蕉97碰碰久久人人 | 色综合天天综合狠狠爱 | 日本www一道久久久免费榴莲 | 成人免费视频一区二区 | 国产成人精品一区二区在线小狼 | 激情综合激情五月俺也去 | 18精品久久久无码午夜福利 | 一本一道久久综合久久 | 在线欧美精品一区二区三区 | 日韩少妇白浆无码系列 | 人妻有码中文字幕在线 | 俺去俺来也在线www色官网 | 国产精品人人爽人人做我的可爱 | 日日橹狠狠爱欧美视频 | 荫蒂添的好舒服视频囗交 | 动漫av一区二区在线观看 | 国产人成高清在线视频99最全资源 | 97se亚洲精品一区 | 亚洲欧美精品aaaaaa片 | 国产精品亚洲专区无码不卡 | 午夜嘿嘿嘿影院 | 日本www一道久久久免费榴莲 | 国产av久久久久精东av | 婷婷五月综合缴情在线视频 | 最近中文2019字幕第二页 | 又湿又紧又大又爽a视频国产 | 呦交小u女精品视频 | 日欧一片内射va在线影院 | 亚洲の无码国产の无码步美 | 黄网在线观看免费网站 | 奇米影视7777久久精品 | 97精品人妻一区二区三区香蕉 | 国产av一区二区精品久久凹凸 | 国产精品理论片在线观看 | 精品无码一区二区三区的天堂 | 色欲人妻aaaaaaa无码 | 国产色精品久久人妻 | 午夜精品一区二区三区的区别 | 狠狠cao日日穞夜夜穞av | 中文字幕av日韩精品一区二区 | 日日麻批免费40分钟无码 | 中文字幕无线码免费人妻 | 国产精品免费大片 | 在线天堂新版最新版在线8 | 丰满少妇人妻久久久久久 | 中文字幕无码热在线视频 | 国产女主播喷水视频在线观看 | 欧洲精品码一区二区三区免费看 | 国产精品亚洲五月天高清 | 成人免费视频在线观看 | 国产成人无码区免费内射一片色欲 | 天天躁日日躁狠狠躁免费麻豆 | 一本久道高清无码视频 | 人妻少妇精品无码专区二区 | 久久97精品久久久久久久不卡 | 高中生自慰www网站 | 美女黄网站人色视频免费国产 | 婷婷丁香五月天综合东京热 | 亚洲欧美中文字幕5发布 | 无码国产激情在线观看 | 又紧又大又爽精品一区二区 | 日日躁夜夜躁狠狠躁 | 精品亚洲成av人在线观看 | 亚洲狠狠婷婷综合久久 | 双乳奶水饱满少妇呻吟 | 久久99精品国产.久久久久 | 亚洲国产精品一区二区美利坚 | 乌克兰少妇性做爰 | 樱花草在线播放免费中文 | 成人免费视频在线观看 | 久久亚洲a片com人成 | 国产在线一区二区三区四区五区 | 粗大的内捧猛烈进出视频 | 成人无码影片精品久久久 | 午夜理论片yy44880影院 | 久久久久久a亚洲欧洲av冫 | 377p欧洲日本亚洲大胆 | 熟妇女人妻丰满少妇中文字幕 | 激情国产av做激情国产爱 | 婷婷色婷婷开心五月四房播播 | 亚洲精品无码国产 | 亚洲日韩一区二区 | 九月婷婷人人澡人人添人人爽 | 亚洲а∨天堂久久精品2021 | 国产网红无码精品视频 | 国产精品18久久久久久麻辣 | 国产在线一区二区三区四区五区 | 麻豆精品国产精华精华液好用吗 | 久久精品无码一区二区三区 | 中文字幕av无码一区二区三区电影 | 内射巨臀欧美在线视频 | 成人动漫在线观看 | 国产明星裸体无码xxxx视频 | 乌克兰少妇性做爰 | 欧美xxxx黑人又粗又长 | 国产网红无码精品视频 | 性生交大片免费看女人按摩摩 | 无码人妻av免费一区二区三区 | 国内综合精品午夜久久资源 | 国产精品美女久久久网av | 美女扒开屁股让男人桶 | 色综合视频一区二区三区 | 2020久久超碰国产精品最新 | 成人免费视频一区二区 | 国产熟妇高潮叫床视频播放 | 国产午夜亚洲精品不卡下载 | 99久久久无码国产精品免费 | 久久精品视频在线看15 | 成人一区二区免费视频 | 亚洲色大成网站www | 性欧美牲交xxxxx视频 | 真人与拘做受免费视频一 | 久久天天躁狠狠躁夜夜免费观看 | 日韩人妻系列无码专区 | 亚洲一区二区观看播放 | 中文字幕色婷婷在线视频 | 久久综合狠狠综合久久综合88 | 又紧又大又爽精品一区二区 | 国产亚洲视频中文字幕97精品 | 中文无码成人免费视频在线观看 | 亚洲va中文字幕无码久久不卡 | 国产综合久久久久鬼色 | 丰满人妻翻云覆雨呻吟视频 | 国产成人综合在线女婷五月99播放 | 久久精品中文闷骚内射 | 98国产精品综合一区二区三区 | 亚洲va欧美va天堂v国产综合 | 亚洲欧美综合区丁香五月小说 | 我要看www免费看插插视频 | 一本久久伊人热热精品中文字幕 | 美女黄网站人色视频免费国产 | 欧美喷潮久久久xxxxx | 日日橹狠狠爱欧美视频 | 欧美人与禽猛交狂配 | 日本精品人妻无码77777 天堂一区人妻无码 | 在线播放免费人成毛片乱码 | 无遮挡国产高潮视频免费观看 | 2019午夜福利不卡片在线 | 久久亚洲中文字幕精品一区 | 色综合久久久无码中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 乌克兰少妇xxxx做受 | 无码av最新清无码专区吞精 | 成年美女黄网站色大免费全看 | 国产成人精品视频ⅴa片软件竹菊 | 久久久久久国产精品无码下载 | 精品亚洲成av人在线观看 | 曰本女人与公拘交酡免费视频 | 精品少妇爆乳无码av无码专区 | 少妇厨房愉情理9仑片视频 | 中文字幕无码免费久久99 | 国产精品爱久久久久久久 | 久久无码专区国产精品s | 国产无套内射久久久国产 | 国产午夜精品一区二区三区嫩草 | 图片区 小说区 区 亚洲五月 | 日本爽爽爽爽爽爽在线观看免 | 久久久久国色av免费观看性色 | 国产三级精品三级男人的天堂 | 国产欧美熟妇另类久久久 | 麻豆精品国产精华精华液好用吗 | 秋霞特色aa大片 | 日韩无套无码精品 | 亚洲国产精品一区二区美利坚 | 亚洲成熟女人毛毛耸耸多 | 99久久无码一区人妻 | 综合激情五月综合激情五月激情1 | 少妇高潮一区二区三区99 | 99久久精品午夜一区二区 | 成人综合网亚洲伊人 | 久久精品女人天堂av免费观看 | 久久人人爽人人爽人人片av高清 | 少妇性俱乐部纵欲狂欢电影 | 玩弄中年熟妇正在播放 | 久久精品国产99久久6动漫 | 人人妻人人澡人人爽欧美精品 | 成人亚洲精品久久久久 | 日韩人妻系列无码专区 | 麻豆国产丝袜白领秘书在线观看 | 国产av无码专区亚洲a∨毛片 | 亚洲熟妇色xxxxx欧美老妇 | 无遮无挡爽爽免费视频 | 国产 浪潮av性色四虎 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲欧洲日本综合aⅴ在线 | 亚洲熟妇色xxxxx欧美老妇y | 正在播放老肥熟妇露脸 | 国产人妻精品一区二区三区不卡 | 国产在线精品一区二区高清不卡 | 国产亚洲欧美日韩亚洲中文色 | 97无码免费人妻超级碰碰夜夜 | 亚洲国产欧美国产综合一区 | 国产激情无码一区二区 | 亚洲成a人片在线观看日本 | 国产av一区二区三区最新精品 | 成 人影片 免费观看 | 欧美性猛交xxxx富婆 | 丰满肥臀大屁股熟妇激情视频 | 成人性做爰aaa片免费看 | 国产成人综合色在线观看网站 | 成人动漫在线观看 | 亚洲欧美色中文字幕在线 | 无码纯肉视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 久久精品国产大片免费观看 | 欧美国产日韩久久mv | 欧洲熟妇色 欧美 | 日本饥渴人妻欲求不满 | 国产激情综合五月久久 | a在线观看免费网站大全 | 日本va欧美va欧美va精品 | 一个人看的视频www在线 | 老头边吃奶边弄进去呻吟 | 精品国精品国产自在久国产87 | 无遮挡啪啪摇乳动态图 | www国产亚洲精品久久久日本 | 夜夜躁日日躁狠狠久久av | 午夜精品久久久久久久 | 国产精品va在线播放 | 天天摸天天透天天添 | 久久久久久久久888 | 国产特级毛片aaaaaa高潮流水 | 国产亚洲美女精品久久久2020 | 日日夜夜撸啊撸 | 伊人久久大香线蕉av一区二区 | 国产精品久久久久9999小说 | 天堂а√在线中文在线 | 波多野结衣aⅴ在线 | 少妇高潮喷潮久久久影院 | 成 人影片 免费观看 | 东京一本一道一二三区 | 西西人体www44rt大胆高清 | 亚洲精品国产精品乱码不卡 | 国产精品99久久精品爆乳 | 性开放的女人aaa片 | 美女毛片一区二区三区四区 | 国产精品无码一区二区桃花视频 | 国产精品人人妻人人爽 | 欧美 日韩 人妻 高清 中文 | 国产97色在线 | 免 | 日本又色又爽又黄的a片18禁 | 国产精品久久国产三级国 | 4hu四虎永久在线观看 | 99久久精品国产一区二区蜜芽 | 日本一区二区三区免费播放 | 国产精品亚洲综合色区韩国 | 亚洲精品欧美二区三区中文字幕 | 午夜福利不卡在线视频 | 日韩欧美成人免费观看 | www国产精品内射老师 | 日韩人妻无码一区二区三区久久99 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品理论片在线观看 | 97夜夜澡人人爽人人喊中国片 | 国产一区二区不卡老阿姨 | 无遮无挡爽爽免费视频 | 性生交大片免费看l | 亚洲狠狠色丁香婷婷综合 | 亚洲无人区一区二区三区 | 久久久国产精品无码免费专区 | 无遮挡国产高潮视频免费观看 | 强奷人妻日本中文字幕 | 性啪啪chinese东北女人 | 一本久久a久久精品vr综合 | 97精品国产97久久久久久免费 | 久久久精品国产sm最大网站 | 欧美亚洲日韩国产人成在线播放 | 久久久久久av无码免费看大片 | 九九热爱视频精品 | 久久久成人毛片无码 | 精品 日韩 国产 欧美 视频 | 少妇被黑人到高潮喷出白浆 | 国产精品亚洲一区二区三区喷水 | 亚洲国产成人a精品不卡在线 | 无码精品国产va在线观看dvd | 无码av免费一区二区三区试看 | 欧美人与动性行为视频 | 天堂а√在线地址中文在线 | 熟妇人妻中文av无码 | 人妻无码αv中文字幕久久琪琪布 | 精品一区二区三区波多野结衣 | 国产精品无码一区二区三区不卡 | 亚洲精品一区二区三区大桥未久 | 99精品视频在线观看免费 | 欧美日本免费一区二区三区 | 蜜桃视频插满18在线观看 | 久久精品人人做人人综合试看 | 波多野42部无码喷潮在线 | 97精品人妻一区二区三区香蕉 | 国内精品久久久久久中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 色综合久久网 | 狂野欧美性猛xxxx乱大交 | 图片区 小说区 区 亚洲五月 | 国产激情精品一区二区三区 | 国产精品欧美成人 | 成熟女人特级毛片www免费 | 亚洲理论电影在线观看 | 4hu四虎永久在线观看 | 成人无码精品1区2区3区免费看 | 日韩无套无码精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 麻豆蜜桃av蜜臀av色欲av | 国产人妻精品一区二区三区 | 欧美性黑人极品hd | 无码av免费一区二区三区试看 | 亚洲一区二区三区在线观看网站 | 99精品国产综合久久久久五月天 | 亚洲成av人综合在线观看 | 99久久亚洲精品无码毛片 | 亚洲日韩一区二区三区 | 精品国产成人一区二区三区 | 欧美性猛交xxxx富婆 | 亚洲色大成网站www国产 | 荫蒂添的好舒服视频囗交 | 国产精品二区一区二区aⅴ污介绍 | 亚洲欧美色中文字幕在线 | 极品尤物被啪到呻吟喷水 | 精品国产麻豆免费人成网站 | 又色又爽又黄的美女裸体网站 | 久久综合香蕉国产蜜臀av | 午夜无码人妻av大片色欲 | 国产高清不卡无码视频 | 国产亚洲欧美日韩亚洲中文色 | 久久久久免费精品国产 | 亚洲国精产品一二二线 | 国产绳艺sm调教室论坛 | 国产精品无套呻吟在线 | 亚洲一区二区三区偷拍女厕 | 国产性生大片免费观看性 | 国产三级久久久精品麻豆三级 | 永久免费精品精品永久-夜色 | 又紧又大又爽精品一区二区 | 中文字幕av无码一区二区三区电影 | 中国女人内谢69xxxx | 少妇被粗大的猛进出69影院 | 国产无av码在线观看 | 国产成人无码午夜视频在线观看 | 久久久精品人妻久久影视 | 国产深夜福利视频在线 | 精品无人区无码乱码毛片国产 | 成人性做爰aaa片免费看不忠 | 欧美兽交xxxx×视频 | 中文精品无码中文字幕无码专区 | 亚洲国产精品成人久久蜜臀 | 狠狠综合久久久久综合网 | 日本一区二区三区免费播放 | 青草青草久热国产精品 | 日本精品久久久久中文字幕 | 最近中文2019字幕第二页 | 欧美自拍另类欧美综合图片区 | 国产成人精品一区二区在线小狼 | 亚洲经典千人经典日产 | 国产人妖乱国产精品人妖 | 在线播放亚洲第一字幕 | 成人三级无码视频在线观看 | 黑人巨大精品欧美一区二区 | 色一情一乱一伦一视频免费看 | 精品成人av一区二区三区 | 国内精品九九久久久精品 | 亚洲国产综合无码一区 | 久久综合久久自在自线精品自 | 久久国产精品_国产精品 | 亚洲精品综合五月久久小说 | 九九综合va免费看 | 亚洲中文字幕va福利 | 波多野结衣av在线观看 | 亚洲精品一区二区三区在线观看 | 国产内射老熟女aaaa | 一本无码人妻在中文字幕免费 | 亚洲成av人影院在线观看 | 无码人妻av免费一区二区三区 | 婷婷五月综合缴情在线视频 | 18禁止看的免费污网站 | 精品国产一区av天美传媒 | 久久这里只有精品视频9 | 亚洲国产一区二区三区在线观看 | 男女下面进入的视频免费午夜 | 国产熟妇高潮叫床视频播放 | 欧美freesex黑人又粗又大 | 无码一区二区三区在线 | 亚洲欧美国产精品久久 | 久久国产精品萌白酱免费 | 国产成人av免费观看 | 亚洲а∨天堂久久精品2021 | 丰满少妇熟乱xxxxx视频 | 欧美freesex黑人又粗又大 | 兔费看少妇性l交大片免费 | 亚洲欧美色中文字幕在线 | 少妇高潮一区二区三区99 | 精品少妇爆乳无码av无码专区 | 狠狠亚洲超碰狼人久久 | 全黄性性激高免费视频 | 久久精品人妻少妇一区二区三区 | 久久99精品久久久久久 | 中文字幕av无码一区二区三区电影 | 一本加勒比波多野结衣 | 无码福利日韩神码福利片 | 丰腴饱满的极品熟妇 | 装睡被陌生人摸出水好爽 | 性生交大片免费看l | 天天拍夜夜添久久精品 | 麻豆蜜桃av蜜臀av色欲av | 免费无码av一区二区 | 玩弄少妇高潮ⅹxxxyw | 亚洲国产精品无码一区二区三区 | 无码国产色欲xxxxx视频 | 久久www免费人成人片 | 国产美女精品一区二区三区 | 人妻天天爽夜夜爽一区二区 | 一二三四社区在线中文视频 | 黄网在线观看免费网站 | 无码av中文字幕免费放 | 国产午夜精品一区二区三区嫩草 | 无码人妻精品一区二区三区下载 | 一本无码人妻在中文字幕免费 | 国产乱人伦偷精品视频 | 欧美日韩久久久精品a片 | 东京一本一道一二三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲中文字幕成人无码 | 亚洲一区二区观看播放 | 国产成人精品一区二区在线小狼 | 久久人人爽人人爽人人片av高清 | 久久天天躁狠狠躁夜夜免费观看 | 天堂亚洲2017在线观看 | 天堂无码人妻精品一区二区三区 | 久久亚洲精品成人无码 | 欧美 丝袜 自拍 制服 另类 | 少妇无码一区二区二三区 | 亚洲一区av无码专区在线观看 | 欧美freesex黑人又粗又大 | 久久综合久久自在自线精品自 | 国产女主播喷水视频在线观看 | 国产精品久久久久影院嫩草 | 欧美性生交xxxxx久久久 | 欧美成人高清在线播放 | 在线观看国产午夜福利片 | 国产在线一区二区三区四区五区 | 特级做a爰片毛片免费69 | 综合人妻久久一区二区精品 | 无码中文字幕色专区 | 精品久久久久久人妻无码中文字幕 | 影音先锋中文字幕无码 | 一本久道久久综合狠狠爱 | 欧美 亚洲 国产 另类 | 日欧一片内射va在线影院 | 久久综合香蕉国产蜜臀av | 亚洲第一网站男人都懂 | 极品嫩模高潮叫床 | 领导边摸边吃奶边做爽在线观看 | 天堂а√在线地址中文在线 | 精品久久8x国产免费观看 | 久久久久久亚洲精品a片成人 | 久久精品女人的天堂av | 国产69精品久久久久app下载 | 国产精品福利视频导航 | 日本高清一区免费中文视频 | 国产美女极度色诱视频www | 国精产品一区二区三区 | 色诱久久久久综合网ywww | 亚洲成熟女人毛毛耸耸多 | 亚洲一区二区三区香蕉 | 欧美freesex黑人又粗又大 | 成人试看120秒体验区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲s码欧洲m码国产av | 成人三级无码视频在线观看 | 在线天堂新版最新版在线8 | 强奷人妻日本中文字幕 | 在线精品亚洲一区二区 | 精品无码一区二区三区爱欲 | 欧美精品免费观看二区 | 亚洲精品成a人在线观看 | 午夜嘿嘿嘿影院 | 亚洲七七久久桃花影院 | 国产精品国产三级国产专播 | 免费看少妇作爱视频 | 丰满人妻一区二区三区免费视频 | 国产精品va在线播放 | 少妇性俱乐部纵欲狂欢电影 | 色综合久久中文娱乐网 | 亚洲国产精品久久人人爱 | 99精品无人区乱码1区2区3区 | yw尤物av无码国产在线观看 | 久久综合狠狠综合久久综合88 | 久久久久久av无码免费看大片 | 国产精品高潮呻吟av久久4虎 | 99精品无人区乱码1区2区3区 | 老司机亚洲精品影院无码 | 亚洲 欧美 激情 小说 另类 | 熟妇人妻无乱码中文字幕 | 亚洲精品欧美二区三区中文字幕 | 欧美老妇交乱视频在线观看 | 人妻有码中文字幕在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲中文字幕乱码av波多ji | 亚洲人成网站在线播放942 | 亚洲精品一区国产 | 欧美高清在线精品一区 | 日本丰满熟妇videos | 国产成人无码av一区二区 | 色婷婷综合激情综在线播放 | 内射欧美老妇wbb | 性做久久久久久久免费看 | 老司机亚洲精品影院无码 | 少女韩国电视剧在线观看完整 | 老司机亚洲精品影院无码 | 亚洲自偷自偷在线制服 | 国产精品18久久久久久麻辣 | 丰满人妻一区二区三区免费视频 | 无遮挡国产高潮视频免费观看 | 国产高潮视频在线观看 | 久9re热视频这里只有精品 | 欧美日韩精品 | 亚洲日本一区二区三区在线 | 精品厕所偷拍各类美女tp嘘嘘 | 中文字幕无码日韩专区 | 国产性生交xxxxx无码 | 精品无人国产偷自产在线 | 97夜夜澡人人爽人人喊中国片 | 天天综合网天天综合色 | 亚洲一区av无码专区在线观看 | 天堂久久天堂av色综合 | 国内老熟妇对白xxxxhd | 性色欲网站人妻丰满中文久久不卡 | 99久久精品国产一区二区蜜芽 | 久久综合色之久久综合 | 激情国产av做激情国产爱 | 图片小说视频一区二区 | 无码纯肉视频在线观看 | 欧美熟妇另类久久久久久多毛 | 久久精品女人的天堂av | 国产内射爽爽大片视频社区在线 | 国产午夜视频在线观看 | 久久久久99精品国产片 | 野狼第一精品社区 | 国产精品久久久av久久久 | 精品无码一区二区三区的天堂 | 国产绳艺sm调教室论坛 | 美女毛片一区二区三区四区 | 日日天干夜夜狠狠爱 | 国产艳妇av在线观看果冻传媒 | 国产福利视频一区二区 | 欧美高清在线精品一区 | 性生交大片免费看女人按摩摩 | 亚洲精品综合一区二区三区在线 | 思思久久99热只有频精品66 | 国产小呦泬泬99精品 | 国产美女精品一区二区三区 | 欧美 日韩 亚洲 在线 | 天天做天天爱天天爽综合网 | 强伦人妻一区二区三区视频18 | 国产97人人超碰caoprom | 在线精品亚洲一区二区 | 又色又爽又黄的美女裸体网站 | 欧美日本免费一区二区三区 | 中文精品无码中文字幕无码专区 | 丝袜美腿亚洲一区二区 | 国产综合在线观看 | 两性色午夜免费视频 | 亚洲国产成人a精品不卡在线 | 六月丁香婷婷色狠狠久久 | 四虎国产精品一区二区 | 7777奇米四色成人眼影 | 国产成人一区二区三区在线观看 | 亚洲中文字幕在线观看 | 久久精品中文闷骚内射 | aⅴ亚洲 日韩 色 图网站 播放 | 午夜丰满少妇性开放视频 | 免费人成在线观看网站 | 国产精品人人妻人人爽 | 无码人妻黑人中文字幕 | 国产麻豆精品精东影业av网站 | 九九热爱视频精品 | 青青久在线视频免费观看 | 2019午夜福利不卡片在线 | 免费人成在线视频无码 | 性色av无码免费一区二区三区 | 久久综合给合久久狠狠狠97色 | www一区二区www免费 | 亚洲成av人片在线观看无码不卡 | 樱花草在线播放免费中文 | 人人妻人人澡人人爽欧美一区 | 国产精品第一区揄拍无码 | 色欲av亚洲一区无码少妇 | 激情内射日本一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 国产亚洲日韩欧美另类第八页 | 荡女精品导航 | 亚洲日韩av片在线观看 | 亚洲gv猛男gv无码男同 | 又大又硬又黄的免费视频 | 秋霞特色aa大片 | 色情久久久av熟女人妻网站 | 在线亚洲高清揄拍自拍一品区 | 亚洲一区二区三区 | 人人爽人人爽人人片av亚洲 | 好爽又高潮了毛片免费下载 | 精品无码一区二区三区爱欲 | 一二三四社区在线中文视频 | 亚洲熟悉妇女xxx妇女av | 国产精品久久国产精品99 | 九九在线中文字幕无码 | 99re在线播放 | 一本久道高清无码视频 | 日本护士毛茸茸高潮 | 天天燥日日燥 | 亚洲人成网站免费播放 | 国产亚洲美女精品久久久2020 | 无码av岛国片在线播放 | 国产成人一区二区三区别 | 成人欧美一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 亚洲国产一区二区三区在线观看 | 国产av一区二区三区最新精品 | 亚洲第一网站男人都懂 | 四虎影视成人永久免费观看视频 | 国产精品人妻一区二区三区四 | 亚洲 a v无 码免 费 成 人 a v | 国产精品a成v人在线播放 | 久久亚洲精品成人无码 | 国产av一区二区三区最新精品 | 人妻少妇精品视频专区 | 大肉大捧一进一出视频出来呀 | 欧美成人午夜精品久久久 | 国产黄在线观看免费观看不卡 | 国产人妖乱国产精品人妖 | 少妇性l交大片 | 国产sm调教视频在线观看 | 久久www免费人成人片 | 天天拍夜夜添久久精品大 | 国产人妻人伦精品 | 国产精品亚洲五月天高清 | 亚洲日韩av片在线观看 | 无码av最新清无码专区吞精 | 国产极品视觉盛宴 | 免费中文字幕日韩欧美 | 噜噜噜亚洲色成人网站 | 强伦人妻一区二区三区视频18 | 国产精品99久久精品爆乳 | 久久亚洲a片com人成 | 国内揄拍国内精品少妇国语 | 亚洲国产精品久久久天堂 | 亚洲色欲久久久综合网东京热 | 日韩精品成人一区二区三区 | 婷婷五月综合激情中文字幕 | 狠狠综合久久久久综合网 | 成熟女人特级毛片www免费 | 男女下面进入的视频免费午夜 | 清纯唯美经典一区二区 | 国产精品va在线观看无码 | 亚洲中文字幕无码一久久区 | 国产亚洲美女精品久久久2020 | 天堂а√在线中文在线 | 99久久精品日本一区二区免费 | 国产精品久久久久无码av色戒 | 色情久久久av熟女人妻网站 | 乱码av麻豆丝袜熟女系列 | 妺妺窝人体色www婷婷 | 国产综合在线观看 | 美女极度色诱视频国产 | 国产精品无码mv在线观看 | 人人妻人人澡人人爽欧美一区 | 国产猛烈高潮尖叫视频免费 | 欧美 亚洲 国产 另类 | 中文字幕精品av一区二区五区 | 蜜桃视频韩日免费播放 | 午夜福利不卡在线视频 | 牲欲强的熟妇农村老妇女 | 国产精品怡红院永久免费 | 性啪啪chinese东北女人 | 国产熟妇高潮叫床视频播放 | 亚洲人成人无码网www国产 | 欧美变态另类xxxx | 亚洲男人av天堂午夜在 | 精品国产一区二区三区av 性色 | 老太婆性杂交欧美肥老太 | 国产极品视觉盛宴 | 欧洲精品码一区二区三区免费看 | 色婷婷综合中文久久一本 | 亚洲成av人片在线观看无码不卡 | 真人与拘做受免费视频 | 网友自拍区视频精品 | 色综合视频一区二区三区 | 中文字幕无码热在线视频 | 日日摸日日碰夜夜爽av | 久久久久亚洲精品男人的天堂 | 性史性农村dvd毛片 | 又粗又大又硬又长又爽 | 色一情一乱一伦一视频免费看 | 亚洲国产成人a精品不卡在线 | 亚洲爆乳精品无码一区二区三区 | 日韩人妻无码一区二区三区久久99 | 免费乱码人妻系列无码专区 | 国产乱人无码伦av在线a | 三级4级全黄60分钟 | 欧美日韩色另类综合 | 国产黄在线观看免费观看不卡 | 黑人巨大精品欧美黑寡妇 | 97精品国产97久久久久久免费 | 亚拍精品一区二区三区探花 | 丰满少妇女裸体bbw | 日日天干夜夜狠狠爱 | 蜜臀aⅴ国产精品久久久国产老师 | 精品乱码久久久久久久 | 国语精品一区二区三区 | 伊人久久大香线蕉av一区二区 | 国产亚洲日韩欧美另类第八页 | 国产成人一区二区三区在线观看 | 亚洲男人av天堂午夜在 | 蜜臀aⅴ国产精品久久久国产老师 | 婷婷五月综合激情中文字幕 | 亚洲精品国产精品乱码不卡 | 在线视频网站www色 | 特黄特色大片免费播放器图片 | 亚洲欧洲无卡二区视頻 | 999久久久国产精品消防器材 | 亚洲熟妇色xxxxx亚洲 | 人妻少妇精品无码专区二区 | 中文字幕亚洲情99在线 | 免费观看的无遮挡av | 国产又粗又硬又大爽黄老大爷视 | 成人性做爰aaa片免费看不忠 | 蜜臀av无码人妻精品 | 免费无码肉片在线观看 | 日韩在线不卡免费视频一区 | 久久综合给合久久狠狠狠97色 | 中文字幕无码日韩欧毛 | 国产无av码在线观看 | 欧美老熟妇乱xxxxx | 亚洲国产成人a精品不卡在线 | 成人av无码一区二区三区 | 99久久精品国产一区二区蜜芽 | 国产欧美熟妇另类久久久 | 我要看www免费看插插视频 | 欧美日韩色另类综合 | 免费男性肉肉影院 | 亚洲中文字幕无码中字 | 亚欧洲精品在线视频免费观看 | 露脸叫床粗话东北少妇 | 成熟妇人a片免费看网站 | 国产无遮挡吃胸膜奶免费看 | 一区二区传媒有限公司 | 亚洲色无码一区二区三区 | 中文字幕av伊人av无码av | 又大又黄又粗又爽的免费视频 | 亚洲成在人网站无码天堂 | 日韩av激情在线观看 | 国产精品无码mv在线观看 | 图片区 小说区 区 亚洲五月 | 99精品无人区乱码1区2区3区 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美成人午夜精品久久久 | 国产舌乚八伦偷品w中 | 色婷婷综合激情综在线播放 | 性做久久久久久久久 | 亚洲精品午夜无码电影网 | 国产一区二区三区日韩精品 | 成 人 免费观看网站 | 男人扒开女人内裤强吻桶进去 | 天天躁夜夜躁狠狠是什么心态 | www国产亚洲精品久久久日本 | 午夜福利试看120秒体验区 | 成人片黄网站色大片免费观看 | 国产香蕉97碰碰久久人人 | 强伦人妻一区二区三区视频18 | 国内综合精品午夜久久资源 | 好爽又高潮了毛片免费下载 | 亚洲日韩精品欧美一区二区 | 国产精品igao视频网 | 成人一在线视频日韩国产 | 成人女人看片免费视频放人 | 国产精品久久久一区二区三区 | 又粗又大又硬又长又爽 | 午夜精品久久久久久久 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 成人影院yy111111在线观看 | 天海翼激烈高潮到腰振不止 | 一本大道久久东京热无码av | 67194成是人免费无码 | 久久久久成人片免费观看蜜芽 | 亚洲熟妇色xxxxx欧美老妇y | 97精品人妻一区二区三区香蕉 | 西西人体www44rt大胆高清 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久久久久久久蜜桃 | 国产精品久久国产精品99 | 亚洲熟妇色xxxxx欧美老妇y | 日韩亚洲欧美中文高清在线 | 精品国精品国产自在久国产87 | 亚洲欧美色中文字幕在线 | 亚洲s色大片在线观看 | 午夜理论片yy44880影院 | 亚洲成色在线综合网站 | 久久97精品久久久久久久不卡 | 久久精品国产精品国产精品污 | 十八禁视频网站在线观看 | 亚洲精品中文字幕久久久久 | 美女极度色诱视频国产 | 免费男性肉肉影院 | 十八禁视频网站在线观看 | 最新国产乱人伦偷精品免费网站 | 国产精品.xx视频.xxtv | 国产偷自视频区视频 | 久久人人97超碰a片精品 | 麻豆md0077饥渴少妇 | 欧美黑人性暴力猛交喷水 | 99久久精品无码一区二区毛片 | 国内精品久久久久久中文字幕 | 亚洲色欲色欲欲www在线 | 久久久久亚洲精品男人的天堂 | 欧美日韩亚洲国产精品 | 亚洲中文字幕乱码av波多ji | 麻豆成人精品国产免费 | 精品亚洲成av人在线观看 | 欧美精品一区二区精品久久 | 亚洲 另类 在线 欧美 制服 | 无码国内精品人妻少妇 | 久久精品一区二区三区四区 | 最新国产乱人伦偷精品免费网站 | 婷婷五月综合缴情在线视频 | 女人色极品影院 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲精品综合一区二区三区在线 | 2020久久香蕉国产线看观看 | 女人高潮内射99精品 | 色婷婷综合激情综在线播放 | 无码av免费一区二区三区试看 | 亚洲精品国产第一综合99久久 | 国内揄拍国内精品人妻 | 妺妺窝人体色www婷婷 | 亚洲综合精品香蕉久久网 | 自拍偷自拍亚洲精品被多人伦好爽 | 成年女人永久免费看片 | 中文字幕人妻丝袜二区 | 久久综合九色综合97网 | 无码精品人妻一区二区三区av | 国产无遮挡吃胸膜奶免费看 | 乱中年女人伦av三区 | 国产片av国语在线观看 | 日本精品高清一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国内少妇偷人精品视频免费 | 午夜不卡av免费 一本久久a久久精品vr综合 | 日韩精品a片一区二区三区妖精 | 性欧美牲交xxxxx视频 | 午夜精品久久久久久久 | 久久精品国产精品国产精品污 | 色五月五月丁香亚洲综合网 | 377p欧洲日本亚洲大胆 | 色窝窝无码一区二区三区色欲 | 青青草原综合久久大伊人精品 | 国产精品a成v人在线播放 | 九月婷婷人人澡人人添人人爽 | 人妻无码久久精品人妻 | 性生交片免费无码看人 | 成 人 免费观看网站 | 无码国产乱人伦偷精品视频 | 2020久久超碰国产精品最新 | 天天爽夜夜爽夜夜爽 | 国产人成高清在线视频99最全资源 | 亚洲欧美中文字幕5发布 | 奇米影视7777久久精品 | 99久久人妻精品免费一区 | 成人无码视频免费播放 | 国产精品丝袜黑色高跟鞋 | 性生交大片免费看女人按摩摩 | 野狼第一精品社区 | 狠狠色丁香久久婷婷综合五月 | 国产两女互慰高潮视频在线观看 | 久久亚洲精品成人无码 | 国产两女互慰高潮视频在线观看 | 欧美刺激性大交 | 人人妻人人澡人人爽欧美一区九九 | 99久久人妻精品免费一区 | 黑人巨大精品欧美黑寡妇 | 亚洲综合无码久久精品综合 | 特级做a爰片毛片免费69 | 久久人人爽人人人人片 | 国产99久久精品一区二区 | 日韩精品无码一区二区中文字幕 | 在线 国产 欧美 亚洲 天堂 | 内射后入在线观看一区 | www成人国产高清内射 | 天堂无码人妻精品一区二区三区 | 国产精品理论片在线观看 | 国色天香社区在线视频 | 天天拍夜夜添久久精品 | 精品亚洲韩国一区二区三区 | 中文字幕无码av波多野吉衣 | 国产亲子乱弄免费视频 | 欧美性生交活xxxxxdddd | 亚洲国产av精品一区二区蜜芽 | 秋霞成人午夜鲁丝一区二区三区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲中文字幕无码中字 | 丰满少妇熟乱xxxxx视频 | 嫩b人妻精品一区二区三区 | 性史性农村dvd毛片 | 日本护士xxxxhd少妇 | 久久国产自偷自偷免费一区调 | 亚洲色www成人永久网址 | 国产乱人无码伦av在线a | 76少妇精品导航 | 天天摸天天透天天添 | 日本一卡2卡3卡四卡精品网站 | 亚洲日韩乱码中文无码蜜桃臀网站 | 日本va欧美va欧美va精品 | 2019午夜福利不卡片在线 | 亚洲日本在线电影 | 日本免费一区二区三区最新 | 亚洲国产高清在线观看视频 | 日韩欧美群交p片內射中文 | 亚洲精品国产精品乱码视色 | 久久99精品久久久久久动态图 | 中文字幕 亚洲精品 第1页 | 中文字幕无码人妻少妇免费 | 性欧美熟妇videofreesex | 亚洲精品国偷拍自产在线观看蜜桃 | 在线亚洲高清揄拍自拍一品区 | 国产精品第一区揄拍无码 | 国产色精品久久人妻 | 国产精品无码久久av | 国产精品毛片一区二区 | 久久精品视频在线看15 | 免费无码的av片在线观看 | 欧美大屁股xxxxhd黑色 | 麻豆国产人妻欲求不满 | 日本熟妇浓毛 | 亚洲一区二区三区含羞草 | 久久精品国产99久久6动漫 | 真人与拘做受免费视频一 | 成人精品天堂一区二区三区 | 日韩精品无码一区二区中文字幕 | 午夜肉伦伦影院 | 亚洲另类伦春色综合小说 | 国产精品久久久久无码av色戒 | 牲欲强的熟妇农村老妇女视频 | 成人欧美一区二区三区黑人免费 | 小鲜肉自慰网站xnxx | 国产av无码专区亚洲awww | 亚洲国产成人av在线观看 | 女人被男人躁得好爽免费视频 | 亚洲熟悉妇女xxx妇女av | 在线播放免费人成毛片乱码 | 亚洲一区二区三区无码久久 | 国产av人人夜夜澡人人爽麻豆 | 欧洲vodafone精品性 | 天天综合网天天综合色 | 99国产精品白浆在线观看免费 | 免费看男女做好爽好硬视频 | 人人超人人超碰超国产 | 亚洲日韩中文字幕在线播放 | 中文毛片无遮挡高清免费 | 国产精品第一国产精品 | 日日躁夜夜躁狠狠躁 | 国产精品久久久久久亚洲影视内衣 | 亚洲乱码日产精品bd | 日本一卡2卡3卡四卡精品网站 | 中文字幕无码人妻少妇免费 | 内射白嫩少妇超碰 | 一本久道久久综合婷婷五月 | 给我免费的视频在线观看 | 夫妻免费无码v看片 | 中文字幕无线码免费人妻 | 丰满人妻被黑人猛烈进入 | 国产成人av免费观看 | 欧美日韩亚洲国产精品 | 76少妇精品导航 | 中文字幕无线码免费人妻 | 亚洲中文无码av永久不收费 | 强奷人妻日本中文字幕 | 欧洲极品少妇 | 装睡被陌生人摸出水好爽 | 免费人成网站视频在线观看 | 欧洲熟妇色 欧美 | 久久久精品456亚洲影院 | 成人免费无码大片a毛片 | 青青青爽视频在线观看 | 亚洲理论电影在线观看 | 亚洲一区二区观看播放 | 国产亚洲人成a在线v网站 | 精品国产福利一区二区 | 无码吃奶揉捏奶头高潮视频 | 精品一区二区三区无码免费视频 | 女人被爽到呻吟gif动态图视看 | av香港经典三级级 在线 | 亚洲 另类 在线 欧美 制服 | 日韩欧美群交p片內射中文 | av无码久久久久不卡免费网站 | 久久综合九色综合欧美狠狠 | 青青青爽视频在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 水蜜桃色314在线观看 | 中文字幕无码人妻少妇免费 | 国产av一区二区精品久久凹凸 | 99久久婷婷国产综合精品青草免费 | 十八禁视频网站在线观看 | 亚洲成在人网站无码天堂 | 无套内谢的新婚少妇国语播放 | 男人扒开女人内裤强吻桶进去 | 兔费看少妇性l交大片免费 | 国产免费无码一区二区视频 | 九月婷婷人人澡人人添人人爽 | 18禁止看的免费污网站 | 亚洲男人av天堂午夜在 | 欧美黑人乱大交 | 一本久道高清无码视频 | 伊在人天堂亚洲香蕉精品区 | 亚洲人成网站色7799 | 久久伊人色av天堂九九小黄鸭 | 国产凸凹视频一区二区 | 中文字幕日产无线码一区 | 色欲久久久天天天综合网精品 | 一本久久a久久精品vr综合 | 伊人色综合久久天天小片 | 97精品人妻一区二区三区香蕉 | 免费人成在线观看网站 | 欧美老熟妇乱xxxxx | 又粗又大又硬毛片免费看 | 成 人 免费观看网站 | 黑人巨大精品欧美一区二区 | 国产口爆吞精在线视频 | 亚洲自偷自拍另类第1页 | 国产乱人伦偷精品视频 | 亚洲天堂2017无码中文 | 欧美精品免费观看二区 | 熟妇激情内射com | 精品国产精品久久一区免费式 | 欧美性猛交内射兽交老熟妇 | 国产又爽又猛又粗的视频a片 | 精品国产一区二区三区四区在线看 | av小次郎收藏 | 欧美精品一区二区精品久久 | 国产人妻精品一区二区三区不卡 | 久久成人a毛片免费观看网站 | 中文无码成人免费视频在线观看 | 国内少妇偷人精品视频 | 2020久久超碰国产精品最新 | a国产一区二区免费入口 | 无遮挡国产高潮视频免费观看 | 九九在线中文字幕无码 | 成人精品一区二区三区中文字幕 | 久久无码中文字幕免费影院蜜桃 | 国产偷抇久久精品a片69 | 夜夜夜高潮夜夜爽夜夜爰爰 | 伊人色综合久久天天小片 | 精品亚洲韩国一区二区三区 | 一本色道久久综合狠狠躁 | 人人妻人人澡人人爽人人精品浪潮 | 日韩欧美群交p片內射中文 | 人人澡人摸人人添 | 亚洲成色www久久网站 | 国产人成高清在线视频99最全资源 | 精品厕所偷拍各类美女tp嘘嘘 | 内射白嫩少妇超碰 | 精品无码一区二区三区的天堂 | 亚洲天堂2017无码中文 | 久久综合狠狠综合久久综合88 | 高中生自慰www网站 | 精品亚洲韩国一区二区三区 | 亚洲一区av无码专区在线观看 | 波多野结衣aⅴ在线 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 少妇太爽了在线观看 | 久久人妻内射无码一区三区 | 国产疯狂伦交大片 | 久久综合给合久久狠狠狠97色 | 一本大道伊人av久久综合 | 超碰97人人做人人爱少妇 | 色欲综合久久中文字幕网 | 亚洲精品一区二区三区在线观看 | 亚洲中文字幕在线观看 | 欧美日韩在线亚洲综合国产人 | 久久亚洲a片com人成 | 内射后入在线观看一区 | 国产 精品 自在自线 | 国产亚av手机在线观看 | 动漫av网站免费观看 | 久青草影院在线观看国产 | 亚洲国产av美女网站 | 思思久久99热只有频精品66 | 亚洲一区二区三区在线观看网站 | 国产又爽又黄又刺激的视频 | 天天躁日日躁狠狠躁免费麻豆 | 欧美亚洲日韩国产人成在线播放 | 日本熟妇人妻xxxxx人hd | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品久久精品三级 | 久久成人a毛片免费观看网站 | 九九在线中文字幕无码 | 国产免费观看黄av片 | 377p欧洲日本亚洲大胆 | 大色综合色综合网站 | 亚洲人成网站在线播放942 | 国产国语老龄妇女a片 | 丰满妇女强制高潮18xxxx | 久久久久久av无码免费看大片 | 国产色xx群视频射精 | 沈阳熟女露脸对白视频 | 国产亲子乱弄免费视频 | 蜜臀aⅴ国产精品久久久国产老师 | 内射老妇bbwx0c0ck | 大肉大捧一进一出视频出来呀 | 成人免费视频在线观看 | 99久久久国产精品无码免费 | 亚洲日本va午夜在线电影 | 欧美精品国产综合久久 | 日本www一道久久久免费榴莲 | 亚洲乱码国产乱码精品精 | 青草青草久热国产精品 | 丝袜 中出 制服 人妻 美腿 | 波多野结衣av一区二区全免费观看 | 熟妇人妻无码xxx视频 | 偷窥村妇洗澡毛毛多 | 亚洲中文字幕av在天堂 | 日韩精品无码免费一区二区三区 | 久久久久国色av免费观看性色 | 无码任你躁久久久久久久 | 国产精品久久久久久久影院 | 国产精品第一国产精品 | 国产69精品久久久久app下载 | 亚洲精品午夜无码电影网 | 丰满人妻精品国产99aⅴ | 国产精品美女久久久网av | 熟女少妇人妻中文字幕 | 麻豆果冻传媒2021精品传媒一区下载 | 精品无码一区二区三区的天堂 | 国产精品无码久久av | 日日鲁鲁鲁夜夜爽爽狠狠 | 精品久久久中文字幕人妻 | 少妇无码av无码专区在线观看 | 欧美日本精品一区二区三区 | 色综合久久久久综合一本到桃花网 | 永久黄网站色视频免费直播 | 精品久久久无码人妻字幂 | 精品国产国产综合精品 | aⅴ在线视频男人的天堂 | 国产精品毛片一区二区 | 无码播放一区二区三区 | 国产成人综合在线女婷五月99播放 | 最新版天堂资源中文官网 | 日本乱人伦片中文三区 | 亚洲无人区午夜福利码高清完整版 | 无码午夜成人1000部免费视频 | 国产精品成人av在线观看 | 亚洲日韩av一区二区三区中文 | 色欲人妻aaaaaaa无码 | 久久久久久国产精品无码下载 | 亚洲精品www久久久 | 免费乱码人妻系列无码专区 | 乱中年女人伦av三区 | 成人精品视频一区二区三区尤物 | 爆乳一区二区三区无码 | 国产香蕉97碰碰久久人人 | 久久久久亚洲精品男人的天堂 | 欧洲熟妇色 欧美 | 国产超级va在线观看视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美人与善在线com | 欧美精品国产综合久久 | 婷婷五月综合缴情在线视频 | 少妇厨房愉情理9仑片视频 | 国产精品手机免费 | 女高中生第一次破苞av | 中文字幕久久久久人妻 | 国产成人av免费观看 | 亚洲精品久久久久久一区二区 | 欧美激情综合亚洲一二区 | 亚洲午夜无码久久 | 国产电影无码午夜在线播放 | 国产熟妇高潮叫床视频播放 | 中文字幕 人妻熟女 | 无码人妻少妇伦在线电影 | 国产人妻人伦精品 | 久久久久久a亚洲欧洲av冫 | 久久99精品久久久久婷婷 | 午夜精品一区二区三区的区别 | 乱人伦中文视频在线观看 | 精品国产青草久久久久福利 | 男女性色大片免费网站 | 清纯唯美经典一区二区 | 色欲久久久天天天综合网精品 | 精品久久久中文字幕人妻 | 国产女主播喷水视频在线观看 | 国产网红无码精品视频 | 老子影院午夜精品无码 | 免费乱码人妻系列无码专区 | 成年美女黄网站色大免费全看 | 欧美 日韩 亚洲 在线 | 国产9 9在线 | 中文 | 国产乱人无码伦av在线a | 久久久国产一区二区三区 | 精品乱码久久久久久久 | 久久 国产 尿 小便 嘘嘘 | 中国女人内谢69xxxx | 无套内谢的新婚少妇国语播放 | 欧美人与动性行为视频 | 亚洲中文无码av永久不收费 | 久久无码专区国产精品s | 日本大乳高潮视频在线观看 | 老熟妇仑乱视频一区二区 | 欧美兽交xxxx×视频 | 久久伊人色av天堂九九小黄鸭 | 人妻无码久久精品人妻 | 天天爽夜夜爽夜夜爽 | 日本www一道久久久免费榴莲 | 亚洲精品一区国产 | a在线观看免费网站大全 | 久久久亚洲欧洲日产国码αv | a在线亚洲男人的天堂 | 亚洲热妇无码av在线播放 | 中文字幕av日韩精品一区二区 | 亚洲熟妇色xxxxx欧美老妇y | 久久无码人妻影院 | 无码午夜成人1000部免费视频 | 国产成人综合在线女婷五月99播放 | 国产激情无码一区二区app | 精品夜夜澡人妻无码av蜜桃 | 曰韩无码二三区中文字幕 | 国产精品人人妻人人爽 | 永久免费精品精品永久-夜色 | 国产午夜手机精彩视频 | 青春草在线视频免费观看 | 亚洲色偷偷偷综合网 | 精品一区二区三区波多野结衣 | 亚洲中文字幕乱码av波多ji | 成人综合网亚洲伊人 | 成人一在线视频日韩国产 | 野外少妇愉情中文字幕 | 青草青草久热国产精品 | 国产精品无码永久免费888 | 少妇人妻av毛片在线看 | 老太婆性杂交欧美肥老太 | 久9re热视频这里只有精品 | 亚洲国产精品成人久久蜜臀 | 国产人妻久久精品二区三区老狼 | a片在线免费观看 | 久9re热视频这里只有精品 | 日本欧美一区二区三区乱码 | 丰满少妇人妻久久久久久 | 成人无码精品一区二区三区 | 妺妺窝人体色www婷婷 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久99久久99精品中文字幕 | 中国大陆精品视频xxxx | 真人与拘做受免费视频 | 色综合久久久无码网中文 | 在线a亚洲视频播放在线观看 | 国产免费久久久久久无码 | 婷婷六月久久综合丁香 | 狠狠cao日日穞夜夜穞av | 欧美黑人性暴力猛交喷水 | 狠狠噜狠狠狠狠丁香五月 | 精品国产精品久久一区免费式 | 一本久道久久综合婷婷五月 | 无码人妻精品一区二区三区不卡 | 波多野42部无码喷潮在线 | 国产极品视觉盛宴 |