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

Spring Boot 2.x基礎教程:使用JTA實現分布式事務

開發 開發工具 分布式
如果這兩條數據在一個數據庫中,那么通過之前介紹的事務管理就能輕松解決了。但是,當這兩個操作位于不同的數據庫中,那么就無法實現了。

 [[380215]]

在一個Spring Boot項目中,連接多個數據源還是比較常見的。

當我們采用多數據源的時候,同時也會出現一個這樣的特殊場景:我們希望對A數據源的更新和B數據源的更新具備事務性。這樣的例子很常見,比如:在訂單庫中創建一條訂單記錄,同時還需要在商品庫中扣減商品庫存。如果庫存扣減失敗,那么我們希望訂單創建也能夠回滾。

如果這兩條數據在一個數據庫中,那么通過之前介紹的事務管理就能輕松解決了。但是,當這兩個操作位于不同的數據庫中,那么就無法實現了。

本文就來介紹一種解決這類問題的方法:JTA事務。

什么是JTA

JTA,全稱:Java Transaction API。JTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的數據庫連接。所以,當我們在同時操作多個數據庫的時候,使用JTA事務就可以彌補JDBC事務的不足。

在Spring Boot 2.x中,整合了這兩個JTA的實現:

Atomikos:可以通過引入spring-boot-starter-jta-atomikos依賴來使用

Bitronix:可以通過引入spring-boot-starter-jta-bitronix依賴來使用

由于Bitronix自Spring Boot 2.3.0開始不推薦使用,所以在下面的動手環節中,我們將使用Atomikos作為例子來介紹JTA的使用。

動手試試

下面我們就來實操一下,如何在Spring Boot中使用JTA來實現多數據源下的事務管理。

準備工作

  • 這里我們將使用最基礎的JdbcTemplate來實現數據訪問,所以如果你還不會使用JdbcTemplate配置多數據源,建議先看一下JdbcTemplate的多數據源配置。

場景設定:

  • 假設我們有兩個庫,分別為:test1和test2
  • 這兩個庫中都有一張User表,我們希望這兩張表中的數據是一致的
  • 假設這兩張表中都已經有一條數據:name=aaa,age=30;因為這兩張表中數據是一致的,所以要update的時候,就必須兩個庫中的User表更新時候,要么都成功,要么都失敗。

操作詳細

在pom.xml中加入JTA的實現Atomikos的Starter

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-jta-atomikos</artifactId> 
  4. </dependency> 

在application.properties配置文件中配置兩個test1和test2數據源

  1. spring.jta.enabled=true 
  2.  
  3. spring.jta.atomikos.datasource.primary.xa-properties.url=jdbc:mysql://localhost:3306/test1 
  4. spring.jta.atomikos.datasource.primary.xa-properties.user=root 
  5. spring.jta.atomikos.datasource.primary.xa-properties.password=12345678 
  6. spring.jta.atomikos.datasource.primary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource 
  7. spring.jta.atomikos.datasource.primary.unique-resource-name=test1 
  8. spring.jta.atomikos.datasource.primary.max-pool-size=25 
  9. spring.jta.atomikos.datasource.primary.min-pool-size=3 
  10. spring.jta.atomikos.datasource.primary.max-lifetime=20000 
  11. spring.jta.atomikos.datasource.primary.borrow-connection-timeout=10000 
  12.  
  13. spring.jta.atomikos.datasource.secondary.xa-properties.url=jdbc:mysql://localhost:3306/test2 
  14. spring.jta.atomikos.datasource.secondary.xa-properties.user=root 
  15. spring.jta.atomikos.datasource.secondary.xa-properties.password=12345678 
  16. spring.jta.atomikos.datasource.secondary.xa-data-source-class-name=com.mysql.cj.jdbc.MysqlXADataSource 
  17. spring.jta.atomikos.datasource.secondary.unique-resource-name=test2 
  18. spring.jta.atomikos.datasource.secondary.max-pool-size=25 
  19. spring.jta.atomikos.datasource.secondary.min-pool-size=3 
  20. spring.jta.atomikos.datasource.secondary.max-lifetime=20000 
  21. spring.jta.atomikos.datasource.secondary.borrow-connection-timeout=10000 

創建多數據源配置類

  1. @Configuration 
  2. public class DataSourceConfiguration { 
  3.  
  4.     @Primary 
  5.     @Bean 
  6.     @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.primary"
  7.     public DataSource primaryDataSource() { 
  8.         return new AtomikosDataSourceBean(); 
  9.     } 
  10.  
  11.     @Bean 
  12.     @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.secondary"
  13.     public DataSource secondaryDataSource() { 
  14.         return new AtomikosDataSourceBean(); 
  15.     } 
  16.  
  17.     @Bean 
  18.     public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { 
  19.         return new JdbcTemplate(primaryDataSource); 
  20.     } 
  21.  
  22.     @Bean 
  23.     public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { 
  24.         return new JdbcTemplate(secondaryDataSource); 
  25.     } 
  26.  

注意,這里除了家在的配置不同之外,DataSource也采用了AtomikosDataSourceBean注意與之前配置多數據源使用的配置和實現類的區別。

創建一個Service實現,模擬兩種不同的情況。

  1. @Service 
  2. public class TestService { 
  3.  
  4.     private JdbcTemplate primaryJdbcTemplate; 
  5.     private JdbcTemplate secondaryJdbcTemplate; 
  6.  
  7.     public TestService(JdbcTemplate primaryJdbcTemplate, JdbcTemplate secondaryJdbcTemplate) { 
  8.         this.primaryJdbcTemplate = primaryJdbcTemplate; 
  9.         this.secondaryJdbcTemplate = secondaryJdbcTemplate; 
  10.     } 
  11.  
  12.     @Transactional 
  13.     public void tx() { 
  14.         // 修改test1庫中的數據 
  15.         primaryJdbcTemplate.update("update user set age = ? where name = ?", 30, "aaa"); 
  16.         // 修改test2庫中的數據 
  17.         secondaryJdbcTemplate.update("update user set age = ? where name = ?", 30, "aaa"); 
  18.     } 
  19.  
  20.     @Transactional 
  21.     public void tx2() { 
  22.         // 修改test1庫中的數據 
  23.         primaryJdbcTemplate.update("update user set age = ? where name = ?", 40, "aaa"); 
  24.         // 模擬:修改test2庫之前拋出異常 
  25.         throw new RuntimeException(); 
  26.     } 
  27.  

這里tx函數,是兩句update操作,一般都會成功;而tx2函數中,我們人為的制造了一個異常,這個異常是在test1庫中的數據更新后才產生的,這樣就可以測試一下test1更新成功,之后是否還能在JTA的幫助下實現回滾。

創建測試類,編寫測試用例

  1. @SpringBootTest(classes = Chapter312Application.class) 
  2. public class Chapter312ApplicationTests { 
  3.  
  4.     @Autowired 
  5.     protected JdbcTemplate primaryJdbcTemplate; 
  6.     @Autowired 
  7.     protected JdbcTemplate secondaryJdbcTemplate; 
  8.  
  9.     @Autowired 
  10.     private TestService testService; 
  11.  
  12.     @Test 
  13.     public void test1() throws Exception { 
  14.         // 正確更新的情況 
  15.         testService.tx(); 
  16.         Assertions.assertEquals(30, primaryJdbcTemplate.queryForObject("select age from user where name=?"Integer.class, "aaa")); 
  17.         Assertions.assertEquals(30, secondaryJdbcTemplate.queryForObject("select age from user where name=?"Integer.class, "aaa")); 
  18.     } 
  19.  
  20.     @Test 
  21.     public void test2() throws Exception { 
  22.         // 更新失敗的情況 
  23.         try { 
  24.             testService.tx2(); 
  25.         } catch (Exception e) { 
  26.             e.printStackTrace(); 
  27.         } finally { 
  28.             // 部分更新失敗,test1中的更新應該回滾 
  29.             Assertions.assertEquals(30, primaryJdbcTemplate.queryForObject("select age from user where name=?"Integer.class, "aaa")); 
  30.             Assertions.assertEquals(30, secondaryJdbcTemplate.queryForObject("select age from user where name=?"Integer.class, "aaa")); 
  31.         } 
  32.     } 
  33.  

這里有兩個測試用例:

  • test1:因為沒有故意制造的異常,不出意外兩個庫的update都會成功,所以根據name=aaa去把兩個數據查出來,看age是否都被更新到了30。
  • test2:tx2函數會把test1中name=aaa的用戶age更新為40,然后拋出異常,JTA事務生效的話,會把age回滾回30,所以這里的檢查也是兩個庫的aaa用戶的age應該都為30,這樣就意味著JTA事務生效,保證了test1和test2兩個庫中的User表數據更新一致,沒有制造出臟數據。

測試驗證

將上面編寫的單元測試運行起來:

 

 

 

 

觀察一下啟動階段的日志,可以看到這些Atomikos初始化日志輸出:

  1. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.default_max_wait_time_on_shutdown = 9223372036854775807 
  2. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.allow_subtransactions = true 
  3. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.recovery_delay = 10000 
  4. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.automatic_resource_registration = true 
  5. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.oltp_max_retries = 5 
  6. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.client_demarcation = false 
  7. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.threaded_2pc = false 
  8. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.serial_jta_transactions = true 
  9. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.log_base_dir = /Users/didi/Documents/GitHub/SpringBoot-Learning/2.x/chapter3-12/transaction-logs 
  10. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.rmi_export_class = none 
  11. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.max_actives = 50 
  12. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.checkpoint_interval = 500 
  13. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.enable_logging = true 
  14. 2021-02-02 19:00:36.145  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.log_base_name = tmlog 
  15. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.max_timeout = 300000 
  16. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.trust_client_tm = false 
  17. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContextFactory 
  18. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.tm_unique_name = 127.0.0.1.tm 
  19. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.forget_orphaned_log_entries_delay = 86400000 
  20. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.oltp_retry_interval = 10000 
  21. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: java.naming.provider.url = rmi://localhost:1099 
  22. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.force_shutdown_on_vm_exit = false 
  23. 2021-02-02 19:00:36.146  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : USING: com.atomikos.icatch.default_jta_timeout = 10000 
  24. 2021-02-02 19:00:36.147  INFO 8868 --- [           main] c.a.icatch.provider.imp.AssemblerImp     : Using default (local) logging and recovery... 
  25. 2021-02-02 19:00:36.184  INFO 8868 --- [           main] c.a.d.xa.XATransactionalResource         : test1: refreshed XAResource 
  26. 2021-02-02 19:00:36.203  INFO 8868 --- [           main] c.a.d.xa.XATransactionalResource     

同時,我們在transaction-logs目錄下,還能找到關于事務的日志信息:

  1. {"id":"127.0.0.1.tm161226409083100001","wasCommitted":true,"participants":[{"uri":"127.0.0.1.tm1","state":"COMMITTING","expires":1612264100801,"resourceName":"test1"},{"uri":"127.0.0.1.tm2","state":"COMMITTING","expires":1612264100801,"resourceName":"test2"}]} 
  2. {"id":"127.0.0.1.tm161226409083100001","wasCommitted":true,"participants":[{"uri":"127.0.0.1.tm1","state":"TERMINATED","expires":1612264100804,"resourceName":"test1"},{"uri":"127.0.0.1.tm2","state":"TERMINATED","expires":1612264100804,"resourceName":"test2"}]} 
  3. {"id":"127.0.0.1.tm161226409092800002","wasCommitted":false,"participants":[{"uri":"127.0.0.1.tm3","state":"TERMINATED","expires":1612264100832,"resourceName":"test1"}]} 

代碼示例

本文的相關例子可以查看下面倉庫中的chapter3-12目錄:

Github:https://github.com/dyc87112/SpringBoot-Learning/

Gitee:https://gitee.com/didispace/SpringBoot-Learning/

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-03-04 10:11:50

MongoDBSpring BootSpring Boot

2020-08-19 17:56:46

緩存Redis集中式

2022-06-27 08:21:05

Seata分布式事務微服務

2022-03-18 09:00:00

開發Web服務應用程序

2025-06-04 01:00:00

2020-07-15 16:50:57

Spring BootRedisJava

2022-03-23 11:45:39

Quartz數據庫節點

2025-01-26 00:00:40

Seata分布式事務

2022-06-21 08:27:22

Seata分布式事務

2017-07-26 15:08:05

大數據分布式事務

2020-03-31 08:05:23

分布式開發技術

2019-10-10 09:16:34

Zookeeper架構分布式

2022-10-10 14:41:44

RedisJVM數據

2022-08-24 08:42:59

Minio存儲Golang

2021-07-13 06:57:12

SpringbootAOP緩存

2025-06-11 08:01:06

2009-06-19 15:28:31

JDBC分布式事務

2021-09-29 09:07:37

分布式架構系統

2009-09-18 15:10:13

分布式事務LINQ TO SQL

2025-07-28 01:12:00

點贊
收藏

51CTO技術棧公眾號

国产一级在线| 国产精品视频123| 国产+成+人+亚洲欧洲在线| 欧美性生交xxxxxdddd| 日韩av高清| 国产黄色大片网站| 欧美亚洲网站| 爱福利视频一区| 小毛片在线观看| 久久福利在线| 欧美日韩在线视频一区| 中文字幕久久一区| 日韩av免费观影| 在线观看日本网站| 国产精品一区二区日韩| 亚洲国产高清在线观看视频| 96久久精品| 天天爱天天做天天爽| 国产一区二区三区四区老人| 一区二区三区黄色| 久久久久亚洲AV成人无码国产| 99久久er| 色偷偷一区二区三区| 国产激情片在线观看| 番号集在线观看| 91欧美一区二区| 91成人伦理在线电影| 欧美性受xxx黑人xyx性爽| 日韩一区二区免费看| 欧美另类极品videosbestfree| 亚洲色成人网站www永久四虎| av成人资源网| 制服.丝袜.亚洲.另类.中文| 欧美精品成人网| av中文字幕在线观看第一页| 一区二区在线观看视频| 中文字幕日韩精品久久| 91在线视频| 久久精品人人做| 欧美激情第六页| 日本在线视频1区| av综合在线播放| αv一区二区三区| 国产av一区二区三区精品| 极品少妇一区二区| 国产日韩欧美日韩大片| 中文字幕精品一区二区精| 久久综合中文| 国产精品高清免费在线观看| 午夜久久久久久久久久影院| 欧美一级网站| 国产成人在线视频| 日韩xxx视频| 久久91精品国产91久久小草| 国产精品视频永久免费播放| 中文字幕一区二区三区人妻四季 | www.日韩欧美| 999久久久国产| 色综合久久一区二区三区| 自拍偷拍亚洲一区| 一级性生活免费视频| 国产精品久久久久久| 久久亚洲精品网站| 成人免费黄色小视频| 欧美日韩1区| 欧美激情精品久久久久| 日韩毛片在线播放| 久久久久中文| 国产精品丝袜一区二区三区| 一个人看的www日本高清视频| 国产曰批免费观看久久久| 91亚洲永久免费精品| 国产夫妻在线观看| 99热在这里有精品免费| 日本高清不卡三区| 黄色网在线免费观看| 亚洲综合另类小说| 欧美性大战久久久久xxx| 亚洲第一会所| 欧美一区二区三区播放老司机| 久久久久国产免费| 西野翔中文久久精品字幕| 国产午夜精品全部视频在线播放| 中国美女黄色一级片| 欧美日本一区| 国产不卡在线观看| av网站免费播放| 26uuu久久天堂性欧美| 一区二区三区欧美成人| 国产丝袜精品丝袜| 欧美在线制服丝袜| 性xxxxxxxxx| 欧美精选一区二区三区| 欧美成人在线网站| 一级片免费在线播放| 黄色小说综合网站| 国产伦精品一区二区三区高清版 | 国产网站一区二区三区| 中文字幕中文字幕一区三区| 多野结衣av一区| 欧美日韩一区二区不卡| yy1111111| 日韩专区精品| 欧美有码在线观看视频| 99热这里只有精品9| 久久久久久**毛片大全| 成人污网站在线观看| gogo亚洲高清大胆美女人体| 日韩精品一区二区三区在线| www.99热| 亚洲一区日本| 俄罗斯精品一区二区| 1024视频在线| 色综合久久久久久久| 免费黄视频在线观看| 日韩免费久久| 国产suv精品一区二区| 好吊视频一区二区三区| 亚洲色图另类专区| 别急慢慢来1978如如2| 欧美毛片免费观看| 欧美国产亚洲视频| 国产视频在线观看视频| 国产精品久久毛片a| 999精品网站| 亚洲精华一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲天堂aaa| 中文字幕巨乱亚洲| 免费av网址在线| 琪琪久久久久日韩精品| 久久久视频免费观看| 亚洲va欧美va| 欧美一区视频| 国产精品爽黄69天堂a| 黄色片在线看| 欧美性猛交xxxx偷拍洗澡| 亚洲精品无码一区二区| 自拍偷拍欧美| 亚洲free性xxxx护士hd| 久草资源在线| 69堂国产成人免费视频| 国产男女猛烈无遮挡在线喷水| 日韩福利视频网| 日韩久久久久久久久久久久久| 不卡av播放| 亚洲欧美日韩精品| 日韩中文字幕在线观看视频| 91玉足脚交白嫩脚丫在线播放| 福利视频一区二区三区四区| 国产一区丝袜| 91精品国产色综合久久不卡98| 韩国av永久免费| 岛国视频午夜一区免费在线观看| 中文字幕乱码在线| 亚洲中午字幕| 欧美福利一区二区三区| 欧美xo影院| 在线观看日韩视频| 一级特黄特色的免费大片视频| 国产精品久久久久影院老司| 免费av不卡在线| 影音先锋日韩精品| 国产伦视频一区二区三区| 电影在线观看一区| 亚洲视频视频在线| 中文字幕第一页在线播放| 亚洲人成网站色在线观看| 亚洲欧洲国产视频| 欧美亚洲一级| 中文字幕成人一区| 大伊香蕉精品在线品播放| 66m—66摸成人免费视频| 精品久久av| 91精品免费在线观看| jizz国产免费| 国产丝袜欧美中文另类| www.日本久久| 欧美美女在线观看| 91免费综合在线| 草美女在线观看| 夜夜嗨av一区二区三区免费区 | 黑人巨大精品| 久久久精品国产| 天天综合天天色| 欧美日韩国产另类不卡| 国产亚洲第一页| 久久精品一二三| 特种兵之深入敌后| 久久免费黄色| 日本天堂免费a| 久久综合影院| 国产精品久久精品国产| 丁香婷婷久久| 91极品女神在线| 欧美激情视频在线播放| 亚洲精品国产精品乱码不99按摩 | 嗯啊主人调教在线播放视频| 色噜噜狠狠狠综合曰曰曰| 人妻精品一区一区三区蜜桃91| 欧美吞精做爰啪啪高潮| 精品无码人妻一区二区三区品 | 国产亚洲一区二区手机在线观看| 久久精品久久久久电影| 日韩精品福利| 日韩欧美成人激情| 亚洲精品一区二区二区| 欧美日韩精品在线| 看片网站在线观看| 亚洲国产精品精华液2区45| yy1111111| 国产福利一区二区三区在线视频| 在线免费视频a| 一区二区三区四区五区精品视频 | 欧美xxxx免费虐| 最近2019年好看中文字幕视频 | 久久精品国产69国产精品亚洲| 午夜视频免费在线| 欧美电影免费提供在线观看| 中文字幕在线观看免费| 欧美色欧美亚洲高清在线视频| 日本爱爱小视频| 亚洲国产成人自拍| 亚洲熟妇一区二区三区| 成人av免费观看| 免费人成视频在线播放| 久草在线在线精品观看| 免费看国产黄色片| 久久久久久夜| 日韩视频在线免费看| 99精品国产一区二区青青牛奶 | 91精品一区二区三区蜜桃| 欧美激情综合在线| 中文字幕在线1| 2020国产精品| 亚洲第一香蕉网| 91久色porny| 国产网站无遮挡| www.久久久久久久久| 日韩av影视在线| 亚洲国产精品无码久久久久高潮 | 尤物在线视频| 色偷偷av一区二区三区乱| 国产美女视频一区二区三区| 国产网站欧美日韩免费精品在线观看| 人妻精品一区一区三区蜜桃91| 精品国产一区二区精华| 亚洲第一大网站| 精品少妇一区二区三区日产乱码| 精品免费久久久| 欧美va天堂va视频va在线| 丰满人妻一区二区三区免费| 日韩亚洲欧美成人一区| 国产黄色片网站| 欧美精品一区二区三区四区| 少妇高潮一区二区三区69| 亚洲国产精品99| 日韩av地址| 自拍偷拍亚洲精品| 国产黄色小视频在线| 欧美大秀在线观看| а√在线中文在线新版| 欧美怡红院视频一区二区三区| 另类专区亚洲| 国产精品吴梦梦| 国产一区二区三区精品在线观看| 91视频最新| 欧洲亚洲成人| 亚洲一区二区三区免费观看| 久久久久免费av| 国产传媒久久久| 亚洲一区二区网站| 精品999在线| 国产91精品露脸国语对白| 国产精品一区二区无码对白| 久久嫩草精品久久久精品一| 91导航在线观看| 亚洲一级二级在线| 欧美性猛交xxxx乱大交hd | 国产精品成人av性教育| 欧美一级免费| 国产一区在线免费| 日韩免费看片| 97干在线视频| 日韩在线观看一区二区| 日韩久久久久久久久久久| 91网址在线看| 国产日产精品一区二区三区的介绍| 亚洲永久精品大片| 中国老头性行为xxxx| 精品国产欧美一区二区| 免费在线性爱视频| 欧美成人在线免费视频| 精品少妇一区二区三区免费观| 美女视频免费一区| 日韩女优在线视频| 国产亚洲va综合人人澡精品 | 韩国三级在线看| 久久久综合精品| 欧美三根一起进三p| 色av成人天堂桃色av| 国产夫妻自拍av| 中文字幕久久精品| 国产伦理精品| 91美女片黄在线观| 国产一区二区精品久| 国产乱子伦精品视频| 日本不卡在线视频| 性欧美丰满熟妇xxxx性久久久| 国产精品久久久久久亚洲毛片 | 亚洲精品永久www嫩草| 99国产成+人+综合+亚洲欧美| 自拍偷拍21p| 91色porny在线视频| 国产性70yerg老太| 这里只有精品99re| 成人18在线| 97精品久久久| 亚洲超碰在线观看| 宅男在线精品国产免费观看| 日韩综合在线视频| theav精尽人亡av| 亚洲成va人在线观看| 国产美女www爽爽爽视频| 伊人青青综合网站| 日本综合字幕| 久久精品国产一区二区三区日韩| 欧美日韩视频| 黄色片免费网址| 国产精品美女久久久久高潮| 色中色综合成人| 欧美日韩精品免费观看视完整| 国产超碰91| 欧美喷水视频| 久久久久久久久久久影视| **性色生活片久久毛片| 中文字幕人妻精品一区| 国产午夜一区二区| 成人香蕉视频| 青青草久久网络| 三级影片在线观看欧美日韩一区二区| 少妇精品一区二区| 精品日韩视频在线观看| 熟妇人妻中文av无码| 97av在线影院| 亚洲最好看的视频| 情侣黄网站免费看| 国产女同互慰高潮91漫画| 成人午夜精品视频| 中文字幕欧美亚洲| 欧美视频精品| 妞干网这里只有精品| 国产一区二三区| 男女羞羞免费视频| 亚洲成人免费网站| 欧美gv在线观看| 欧美日韩精品一区| 日韩av在线发布| 亚洲色图日韩精品| 欧美一区二区三区色| 精灵使的剑舞无删减版在线观看| 高清av免费一区中文字幕| 国内自拍一区| 青青草视频播放| 欧美亚洲综合久久| h片在线观看网站| 国产福利久久精品| 午夜一级在线看亚洲| 毛片视频免费播放| 91精品国产欧美一区二区18| 日本无删减在线| 精品国产一区二区三| 久久精品天堂| 精品少妇一区二区三区密爱| 欧美国产精品久久| 一级片视频播放| 欧美肥臀大乳一区二区免费视频| 久久草在线视频| 成人午夜激情av| 樱桃视频在线观看一区| 五月天久久久久久| 玖玖国产精品视频| 97人妻精品一区二区免费| 欧美日韩综合在线免费观看| av网址在线看| 免费在线观看一区二区| 精品一区二区三区在线观看国产| 久久久国产精华液| 亚洲深夜福利视频| 日韩三级精品| 精品少妇无遮挡毛片| 一区二区三区欧美亚洲| 九色在线播放| 97人人模人人爽人人少妇| 久久久亚洲人| 麻豆国产尤物av尤物在线观看| 亚洲欧美日韩爽爽影院| 中文在线综合| 国产精品久久a| 富二代精品短视频|