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

Spring事務(wù)傳播屬性有那么難嗎?看這一篇就夠了

數(shù)據(jù)庫 其他數(shù)據(jù)庫
學(xué)習(xí)東西要知行合一,如果只是知道理論而沒實(shí)踐過,那么掌握的也不會特別扎實(shí),估計(jì)過幾天就會忘記,接下來我們一起實(shí)踐來學(xué)習(xí)Spring事務(wù)的傳播屬性。

[[280278]]

筆者文筆功力尚淺,如有不妥,請慷慨指出,必定感激不盡

 學(xué)習(xí)東西要知行合一,如果只是知道理論而沒實(shí)踐過,那么掌握的也不會特別扎實(shí),估計(jì)過幾天就會忘記,接下來我們一起實(shí)踐來學(xué)習(xí)Spring事務(wù)的傳播屬性。

傳播屬性

傳播屬性定義的是當(dāng)一個(gè)事務(wù)方法碰到另一個(gè)事務(wù)方法時(shí)的處理行為,一共有七種行為,定義如下

傳播性 描述
PROPAGATION_REQUIRED 0 支持當(dāng)前事務(wù),如果沒有就新建事務(wù)
PROPAGATION_SUPPORTS 1 支持當(dāng)前事務(wù),如果沒有就不以事務(wù)的方式運(yùn)行
PROPAGATION_MANDATORY 2 支持當(dāng)前事務(wù),如果當(dāng)前沒事務(wù)就拋異常
PROPAGATION_REQUIRES_NEW 3 無論當(dāng)前是否有事務(wù),都會新起一個(gè)事務(wù)
PROPAGATION_NOT_SUPPORTED 4 不支持事務(wù),如果當(dāng)前存在事務(wù),就將此事務(wù)掛起不以事務(wù)方式運(yùn)行
PROPAGATION_NEVER 5 不支持事務(wù),如果有事務(wù)就拋異常
PROPAGATION_NESTED 6 如果當(dāng)前存在事務(wù),在當(dāng)前事務(wù)中再新起一個(gè)事務(wù)

其實(shí)只看概念的話已經(jīng)很直截了當(dāng)了說明了每個(gè)傳播性的作用,此時(shí)我們再用具體的例子演示一下每個(gè)傳播性屬性下的行為。

此次演示我們使用的是H2數(shù)據(jù)庫,這個(gè)數(shù)據(jù)庫是作用在內(nèi)存里面的,所以對于我們演示事務(wù)效果來說正好,無需我們在進(jìn)行其他的配置了,我們新建一個(gè)表。將下面語句放在schema.sql文件里面即可,SpringBoot程序在啟動(dòng)的時(shí)候就會自動(dòng)為我們在內(nèi)存里面建立這樣的一個(gè)表。 

  1. CREATE TABLE FOO (ID INT IDENTITY, BAR VARCHAR(64)); 

演示之前我們會定義兩個(gè)類FooService和BarService。我們使用BarService 里面的方法進(jìn)行調(diào)用FooService 中的方法。

環(huán)境準(zhǔn)備

在進(jìn)行事務(wù)演示之前,其實(shí)可以分為以下幾種情況,根據(jù)排列組合,我們可以得出以下八種情況

  •  調(diào)用者:有無事務(wù)
  •  調(diào)用者:是否有異常
  •  被調(diào)用者:有無事務(wù)**(這個(gè)是通過傳播屬性進(jìn)行控制的)**所以并不在排列組合中
  •  被調(diào)用者:是否有異常
調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常

異常類

其中的RollbackException是我們自己定義的一個(gè)異常類 

  1. @Service  
  2. public class BarServiceImpl implements BarService{  
  3.     @Autowired  
  4.     private FooService fooService; 
  5.     // PROPAGATION_REQUIRED演示 無事務(wù)  
  6.     @Override  
  7.     public void testRequiredNoTransactional() throws RollbackException {  
  8.         fooService.testRequiredTransactional();  
  9.     }  

調(diào)用者

在BarService中定義兩個(gè)方法,一個(gè)是帶著事務(wù)的,一個(gè)是不帶事務(wù)的 

  1. // 有事務(wù)  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class)  
  4. public void hasTransactional() throws RollbackException {  
  5.  
  6. // 無事務(wù)  
  7. @Override  
  8. public void noTransactional() throws RollbackException {  

接下來我們就根據(jù)俄上面定義的八種情況進(jìn)行事務(wù)傳播屬性的學(xué)習(xí)。

PROPAGATION_REQUIRED

在此傳播屬性下,被調(diào)用方是否新建事務(wù)取決去調(diào)用者是否帶著事務(wù)。

想要了解這個(gè)傳播屬性的特性,其實(shí)我們演示上面八種情況的兩個(gè)例子就夠了

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況我們在被調(diào)用者拋出異常的情況下,如果查詢不到插入的數(shù)據(jù),那么就說明被調(diào)用者在調(diào)用者沒有事務(wù)的情況下自己新建了事務(wù)。
  •  第二種情況我們在調(diào)用者拋出異常的情況下,如果查詢不到插入的數(shù)據(jù),那么就說明被調(diào)用者在調(diào)用者有事務(wù)的情況下就加入當(dāng)前事務(wù)了。

我們先來看一下被調(diào)用者的類的方法例子。 

  1. @Service  
  2. public class FooServiceImpl implements FooService {  
  3.     @Autowired  
  4.     private JdbcTemplate jdbcTemplate;    
  5.     // REQUIRED傳播屬性-被調(diào)用者有異常拋出  
  6.     @Override  
  7.     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)  
  8.     public void testRequiredHasException() throws RollbackException {  
  9.         jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ("+Global.REQUIRED_HAS_EXCEPTION+")");  
  10.         throw new RollbackException();  
  11.     }  
  12.     // REQUIRED傳播屬性-被調(diào)用者無異常拋出  
  13.     @Override  
  14.     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)  
  15.     public void testRequiredNoException() throws RollbackException {  
  16.         jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ("+Global.REQUIRED_NO_EXCEPTION+")");  
  17.     }  

接下來我們看一下調(diào)用者方法的例子 

  1. @Service  
  2. public class BarServiceImpl implements BarService{  
  3.     @Autowired  
  4.     private FooService fooService;  
  5.     // 有事務(wù)  
  6.     @Override  
  7.     @Transactional(rollbackFor = Exception.class)  
  8.     public void hasTransactional() throws RollbackException {  
  9.         // 調(diào)用者有事務(wù),拋異常  被調(diào)用者無異常  
  10.         fooService.testRequiredNoException();  
  11.         throw new RollbackException();  
  12.     }  
  13.     // 無事務(wù)  
  14.     @Override  
  15.     public void noTransactional() throws RollbackException {  
  16.         // 調(diào)用者無事務(wù),不拋異常  被調(diào)用者有異常  
  17.         fooService.testRequiredHasException();  
  18.     }  

此時(shí)我們在程序調(diào)用時(shí)進(jìn)行查詢 

  1. String noException = Global.REQUIRED_NO_EXCEPTION;  
  2. String hasException = Global.REQUIRED_HAS_EXCEPTION;   
  3. try {  
  4.     barService.noTransactional();  
  5. }catch (Exception e){  
  6.     log.info("第一種情況 {}",  
  7.             jdbcTemplate  
  8.                     .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='"+hasException+"'", Long.class));  
  9.  
  10. try {  
  11.     barService.hasTransactional();  
  12. }catch (Exception e){  
  13.     log.info("第二種情況 {}",  
  14.             jdbcTemplate  
  15.                     .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='"+noException+"'", Long.class));  

查看打印出來的日志 

  1. 2019-10-16 13:02:04.142  INFO 11869 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 0  
  2. 2019-10-16 13:02:04.143  INFO 11869 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 0 

我們看到我們都沒有查到相應(yīng)的數(shù)據(jù),說明數(shù)據(jù)都回滾了。此時(shí)我們應(yīng)該就理解了那句話支持當(dāng)前事務(wù),如果沒有就新建事務(wù)。

PROPAGATION_SUPPORTS

被調(diào)用者是否有事務(wù),完全依賴于調(diào)用者,調(diào)用者有事務(wù)則有事務(wù),調(diào)用者沒事務(wù)則沒事務(wù)。

接下來我們還是用上面的兩個(gè)例子進(jìn)行演示

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況:被調(diào)用者拋出異常的情況下,如果仍能查詢到數(shù)據(jù),說明事務(wù)沒有回滾,說明被調(diào)用者沒有事務(wù)
  •  第二種情況:調(diào)用者拋出異常情況下,如果查不到數(shù)據(jù),說明兩個(gè)方法在一個(gè)事務(wù)中

接下來仍然是例子演示

被調(diào)用者,只是將@Transactional 注解中的propagation 屬性更換為了Propagation.SUPPORTS 

  1. // SUPPORTS傳播屬性-被調(diào)用者有異常拋出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS)  
  4. public void testSupportsHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException();  
  7.  
  8. // SUPPORTS傳播屬性-被調(diào)用者無異常拋出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS)  
  11. public void testSupportsNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_NO_EXCEPTION+"')");  

調(diào)用者和上面的例子調(diào)用一樣,我們直接查看執(zhí)行效果 

  1. 2019-10-16 13:50:27.738  INFO 12174 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 1  
  2. 2019-10-16 13:50:27.741  INFO 12174 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 0 

我們看到了在第一種情況下查到了數(shù)據(jù),說明在第一種情況下被調(diào)用者是沒有事務(wù)的。此時(shí)我們應(yīng)該就理解了這句話 支持當(dāng)前事務(wù),如果沒有就不以事務(wù)的方式運(yùn)行。

PROPAGATION_MANDATORY

依然是這兩個(gè)例子進(jìn)行演示

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況:因?yàn)檎{(diào)用者沒有事務(wù),所以此傳播屬性下應(yīng)該是拋異常的
  •  第二種情況:被調(diào)用者的事務(wù)和調(diào)用者事務(wù)是同樣的

接下來是被調(diào)用者的代碼例子 

  1. // MANDATORY傳播屬性-被調(diào)用者有異常拋出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY)  
  4. public void testMandatoryHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException();  
  7.  
  8. // MANDATORY傳播屬性-被調(diào)用者無異常拋出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY)  
  11. public void testMandatoryNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_NO_EXCEPTION+"')");  

調(diào)用者和上面的例子調(diào)用一樣,我們直接查看執(zhí)行效果 

  1. 2019-10-16 13:58:39.178 ERROR 12317 --- [           main] c.e.t.t.TransactionApplication           : org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' 
  2. 2019-10-16 13:58:39.276  INFO 12317 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 0 
  3. 2019-10-16 13:58:39.281  INFO 12317 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 0 

我們發(fā)現(xiàn)和我們推測一樣,說明被調(diào)用者是不會自己新建事務(wù)的,此時(shí)我們應(yīng)該就理解了這句話支持當(dāng)前事務(wù),如果當(dāng)前沒事務(wù)就拋異常。

PROPAGATION_REQUIRES_NEW

此傳播屬性下,無論調(diào)用者是否有事務(wù),被調(diào)用者都會新建一個(gè)事務(wù)

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況:調(diào)用者無事務(wù),被調(diào)用者會新建事務(wù),所以查不到數(shù)據(jù)
  •  第二種情況:調(diào)用者有事務(wù),被調(diào)用者會新建一個(gè)事務(wù),所以調(diào)用者拋異常影響不到被調(diào)用者,所以能查到數(shù)據(jù)

接下來我們演示代碼。

被調(diào)用者 

  1. // REQUIRES_NEW傳播屬性-被調(diào)用者有異常拋出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)  
  4. public void testRequiresNewHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.REQUIRES_NEW_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException(); 
  7.  
  8. // REQUIRES_NEW傳播屬性-被調(diào)用者無異常拋出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)  
  11. public void testRequiresNewNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.REQUIRES_NEW_NO_EXCEPTION+"')");  

調(diào)用者的例子和上面的相同,我們直接來看執(zhí)行情況 

  1. 2019-10-16 16:29:20.296  INFO 15553 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 0  
  2. 2019-10-16 16:29:20.298  INFO 15553 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 1 

我們發(fā)現(xiàn)和我們的推論是一樣的,說明調(diào)用者的事務(wù)和被調(diào)用者的事務(wù)完全無關(guān)。此時(shí)我們應(yīng)該就理解這句話了無論當(dāng)前是否有事務(wù),都會新起一個(gè)事務(wù)。

PROPAGATION_NOT_SUPPORTED

無論調(diào)用者是否有事務(wù),被調(diào)用者都不以事務(wù)的方法運(yùn)行

同樣是這兩個(gè)例子

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況:被調(diào)用者都不會有事務(wù),那么在拋異常之后就能查到相應(yīng)的數(shù)據(jù)
  •  第二種情況:在調(diào)用者有事務(wù)的情況下,被調(diào)用者也會在無事務(wù)環(huán)境下運(yùn)行,所以我們依然能查到數(shù)據(jù)

接下來驗(yàn)證我們的猜測 

  1. // NOT_SUPPORTED傳播屬性-被調(diào)用者有異常拋出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED) 
  4. public void testNotSupportHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NOT_SUPPORTS_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException();  
  7.  
  8. // NOT_SUPPORTED傳播屬性-被調(diào)用者無異常拋出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)  
  11. public void testNotSupportNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NOT_SUPPORTS_NO_EXCEPTION+"')");  

然后查看執(zhí)行結(jié)果 

  1. 2019-10-16 16:38:35.065  INFO 15739 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 1  
  2. 2019-10-16 16:38:35.067  INFO 15739 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 1 

我們可以看到在最后兩種情況都查到了數(shù)據(jù),根據(jù)演示效果應(yīng)該可以理解這句話了,不支持事務(wù),如果當(dāng)前存在事務(wù),就將此事務(wù)掛起不以事務(wù)方式運(yùn)行。

PROPAGATION_NEVER

調(diào)用者有事務(wù),被調(diào)用者就會拋出異常

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常

這個(gè)就不演示,相信大家看到這里應(yīng)該都會明白在第一種情況下我們是能夠查到數(shù)據(jù)的。在第二種情況下由于調(diào)用者帶著事務(wù),所以會拋異常。

PROPAGATION_NESTED

此傳播屬性下,被調(diào)用者的事務(wù)是調(diào)用者的事務(wù)的子集。

我們重點(diǎn)說一下NESTED的傳播屬性的特性

調(diào)用者是否有事務(wù) 說明
被調(diào)用者會新起一個(gè)事務(wù),此事務(wù)和調(diào)用者事務(wù)是一個(gè)嵌套的關(guān)系
被調(diào)用者會自己新起一個(gè)事務(wù)

關(guān)于什么是嵌套事務(wù)的關(guān)系,我們用下面三個(gè)例子能夠進(jìn)行演示。

調(diào)用者是否有事務(wù) 調(diào)用者是否有異常 被調(diào)用者是否有異常
  •  第一種情況:如果查不到數(shù)據(jù),則說明在調(diào)用者無事務(wù)情況下,被調(diào)用者會新起一個(gè)事務(wù)
  •  第二種情況:如果查不到數(shù)據(jù),說明外層事務(wù)能夠影響內(nèi)層事務(wù)
  •  第三種情況:如果查到數(shù)據(jù),說明內(nèi)層事務(wù)不影響外層事務(wù)

接下來我們編寫具體的代碼 

  1. // NESTED傳播屬性-回滾事務(wù)  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED)  
  4. public void testNestedHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_HAS_EXCEPTION+"')");  
  6.    // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  
  7.     throw new RollbackException();  
  8.  
  9. // NESTED傳播屬性-不回滾事務(wù)  
  10. @Override  
  11. @Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED)  
  12. public void testNestedNoException() throws RollbackException {  
  13.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_NO_EXCEPTION+"')");  

然后接下來的調(diào)用者也會有點(diǎn)區(qū)別 

  1. @Override  
  2. @Transactional()  
  3. public void hasTransactionalNoException() throws RollbackException {  
  4.     // NESTED傳播屬性 - 調(diào)用者有事務(wù),不拋異常  被調(diào)用者有異常  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NESTED_HAS_EXCEPTION_TWO+"')");  
  6.     fooService.testNestedHasException();  

然后執(zhí)行效果 

  1. 2019-10-16 18:01:06.387  INFO 17172 --- [           main] c.e.t.t.TransactionApplication           : 第一種情況 0  
  2. 2019-10-16 18:01:06.389  INFO 17172 --- [           main] c.e.t.t.TransactionApplication           : 第二種情況 0  
  3. 2019-10-16 18:01:06.390  INFO 17172 --- [           main] c.e.t.t.TransactionApplication           : 第三種情況 1 

可以看出來嵌套事務(wù)的本質(zhì)就是外層會影響內(nèi)層,內(nèi)層不影響外層。而REQUIRES_NEW則是互不影響。

總結(jié)

到現(xiàn)在我們已經(jīng)全部分析完了七種傳播屬性,從寫這篇文章開始到結(jié)束其中也碰到過一些坑,有些是不自己實(shí)踐一遍是根本不知道的,所以我還是建議讀者看完這篇文章以后自己進(jìn)行實(shí)踐,演示各種情況,只有這樣才能夠爛熟于心。 

 

責(zé)任編輯:龐桂玉 來源: 中國開源
相關(guān)推薦

2023-02-10 09:04:27

2020-02-18 16:20:03

Redis ANSI C語言日志型

2022-06-20 09:01:23

Git插件項(xiàng)目

2023-09-11 08:13:03

分布式跟蹤工具

2021-04-08 07:37:39

隊(duì)列數(shù)據(jù)結(jié)構(gòu)算法

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2023-10-17 08:15:28

API前后端分離

2024-09-23 08:00:00

消息隊(duì)列MQ分布式系統(tǒng)

2025-08-07 04:10:00

光模塊AI網(wǎng)絡(luò)

2018-05-22 08:24:50

PythonPyMongoMongoDB

2020-07-03 08:21:57

Java集合框架

2022-04-07 10:39:21

反射Java安全

2017-03-11 22:19:09

深度學(xué)習(xí)

2023-11-18 09:30:42

模型AI

2023-12-04 09:15:00

Spring框架

2020-12-10 15:25:51

Docker容器工具

2022-07-06 12:07:06

Python函數(shù)式編程

2023-11-06 07:21:13

內(nèi)存結(jié)構(gòu)Jvm

2019-04-01 10:43:59

Linux問題故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美高跟鞋交xxxxxhd| 欧美一二三区在线观看| 亚洲精品一区二| 亚洲天堂中文字幕在线| 国产精品hd| 亚洲欧美日韩国产中文专区| 九九热在线免费| 羞羞视频在线观看免费| 99久久99久久免费精品蜜臀| 国产精品99一区| 免费在线观看国产精品| 国产一区二区观看| 欧美不卡一二三| 激情婷婷综合网| 羞羞的网站在线观看| 久久蜜桃一区二区| 91综合免费在线| 免费看毛片网站| 国产精品a级| 最近2019中文字幕mv免费看| yy1111111| 国产高清视频一区二区| 日韩欧美国产免费播放| 大地资源网在线观看免费官网| 欧美成人综合在线| 国产成人丝袜美腿| 国产精品成人免费电影| 久久综合加勒比| 欧美mv日韩| 亚洲无av在线中文字幕| 亚洲一级Av无码毛片久久精品| www.久久.com| 一本大道av伊人久久综合| 欧美一级中文字幕| 日韩在线资源| 中文无字幕一区二区三区| 国产亚洲精品久久飘花| a天堂中文在线观看| 久久国产人妖系列| 国产成一区二区| 国产一级免费视频| 国产精品女主播一区二区三区| 欧美肥婆姓交大片| 色哟哟一一国产精品| 精品视频亚洲| 亚洲男人的天堂网站| 成人性生活免费看| 成人性生交大片免费看中文视频 | 国产精品美女一区二区三区 | 欧美日韩国产丝袜另类| 2019日韩中文字幕mv| 尤物在线网址| 一区二区视频在线看| 公共露出暴露狂另类av| 拍真实国产伦偷精品| 国产精品亲子伦对白| 神马影院一区二区| 国产三级在线观看| 欧美激情中文字幕一区二区| 日韩在线导航| h视频在线免费| 国产精品福利影院| 手机看片日韩国产| 在线网址91| 亚洲影视在线观看| www.国产在线播放| 国产激情视频在线看| 欧美日韩国产丝袜美女| 精品久久久久久久免费人妻| 中文字幕av一区二区三区佐山爱| 色天使久久综合网天天| 日韩免费高清在线| 成人午夜sm精品久久久久久久| 欧美亚洲日本国产| 亚洲怡红院在线| 亚洲2区在线| 亚洲成人教育av| 欧美一区二区三区成人精品| 国产成人精品三级高清久久91| 在线播放日韩精品| 亚洲熟女毛茸茸| 欧美色综合网| 欧美一级免费视频| 黄色av一区二区| 黄页视频在线91| av成人观看| 欧美巨乳在线| 亚洲欧美另类在线| 玩弄中年熟妇正在播放| 日韩av首页| 91精品婷婷国产综合久久| 日本天堂在线播放| 一区二区三区四区在线看| 中文字幕在线精品| 久久久精品视频在线| 老鸭窝毛片一区二区三区| 国产精品视频久久久| www.久久成人| 国产亚洲一区二区在线观看| 99视频精品全部免费看| 成人性生交大片免费观看网站| 欧美日韩一区二区三区四区五区| 少妇丰满尤物大尺度写真| 亚洲午夜久久| 欧美老少配视频| 精品视频一二三区| 成人污视频在线观看| 天堂va久久久噜噜噜久久va| 日本动漫同人动漫在线观看| 色婷婷亚洲精品| wwwww在线观看| 欧美韩日高清| 欧美综合在线观看| 性一交一乱一精一晶| 国产农村妇女精品| 久久久久免费看黄a片app| 欧洲亚洲精品| 亚洲精品一区二区三区不| 男人与禽猛交狂配| 日本 国产 欧美色综合| 精品一区久久久| av网址在线看| 欧美性色aⅴ视频一区日韩精品| 久久久久国产免费| 91欧美国产| 国产成人亚洲精品| 色婷婷中文字幕| 一区二区三区久久| 99中文字幕在线| 欧美日韩精品在线一区| 青青草一区二区| 色噜噜一区二区三区| 亚洲精选免费视频| 女人高潮一级片| 欧美顶级大胆免费视频| 国产精品偷伦一区二区| 国产一级片在线| 欧美天天综合色影久久精品| 男女性杂交内射妇女bbwxz| 自拍视频亚洲| 91精品在线影院| 日本亚洲精品| 欧美日韩一本到| 精品熟妇无码av免费久久| 久久久久国产精品一区二区| 精品国产乱码久久久久久108| 神马午夜伦理不卡| 欧美不卡一区二区三区四区| 欧美成人精品欧美一级| 国产精品一区二区视频| 日韩视频一二三| 视频一区视频二区欧美| 久久99久久亚洲国产| 国产suv一区二区| 亚洲黄色片在线观看| 亚洲精品乱码久久久久久9色| 欧美在线黄色| 高清视频一区二区三区| cao在线视频| 亚洲精品久久久久中文字幕欢迎你 | 久久婷婷五月综合色国产香蕉| 日韩欧美国产大片| 国产91精品高潮白浆喷水| 日韩精品福利| 色94色欧美sute亚洲线路一ni | 日本亚洲欧美成人| 免费资源在线观看| 欧美午夜片在线看| av资源在线免费观看| 紧缚奴在线一区二区三区| 大桥未久一区二区三区| 亚洲一级大片| 91成人性视频| 91社区在线| 欧美一级电影网站| 欧美另类一区二区| 国产精品女同互慰在线看| 色婷婷一区二区三区在线观看| 亚洲高清影视| 精品国产一区二区三区日日嗨| 亚洲黄色中文字幕| 日韩在线观看免费全集电视剧网站 | 一区二区91| 日本一区二区三区www| 婷婷激情成人| 久久久综合免费视频| 日本福利午夜视频在线| 欧美日韩精品欧美日韩精品一综合| 永久免费看mv网站入口| 成人一区在线看| 色欲av无码一区二区人妻| 午夜激情久久| 国产女主播一区二区| 全球最大av网站久久| 欧美久久久精品| 色哟哟在线观看| 777欧美精品| 久久久久久久久久影院| 国产精品嫩草影院av蜜臀| 18深夜在线观看免费视频| 久久精品123| 欧美日韩激情四射| 残酷重口调教一区二区| 成人女人免费毛片| 亚洲精品.com| 欧美精品第一页在线播放| 国产福利免费在线观看| 亚洲国产精品小视频| 97超碰国产在线| 色国产综合视频| 国产亚洲第一页| 国产精品久久久爽爽爽麻豆色哟哟 | 中文字幕av一区二区三区谷原希美| av男人天堂网| 欧美唯美清纯偷拍| 丰满少妇乱子伦精品看片| 亚洲精品乱码久久久久久黑人| 一级黄色性视频| 成人aa视频在线观看| 亚洲精品在线网址| 日韩av中文字幕一区二区 | 久久精品国产色蜜蜜麻豆| 99视频在线免费播放| 在线精品视频在线观看高清| 亚洲 国产 日韩 综合一区| 欧美亚洲色图校园春色| www.成人av.com| 99tv成人影院| 国产精品网站入口| 超薄肉色丝袜脚交一区二区| 欧美性在线观看| 国产直播在线| 久久久噜噜噜久久中文字免| 亚洲区欧洲区| 欧美成人亚洲成人日韩成人| 美女写真理伦片在线看| 日韩资源在线观看| 成人性爱视频在线观看| 亚洲男人的天堂在线播放| 亚洲人成色777777精品音频| 亚洲国产精品人久久电影| 黄色片一区二区三区| 精品国产一区久久| 黄色av免费观看| 亚洲高清福利视频| 欧性猛交ⅹxxx乱大交| 日韩精品一区二区三区在线观看| 国产精品永久久久久久久久久| 欧美精品在欧美一区二区少妇| 久草热在线观看| 欧美视频第二页| 中文字幕在线播出| 欧美三级三级三级爽爽爽| 在线播放国产一区| 欧美色男人天堂| 国产一区二区在线视频观看| 欧美精品1区2区| 性生活免费网站| 亚洲国产一区二区三区四区| 四虎影院在线域名免费观看| 亚洲欧美三级在线| av在线收看| 北条麻妃在线一区二区| av在线播放观看| 91精品国产电影| 欧美一区久久久| 国产主播精品在线| 免费一级欧美在线大片| 粉嫩av一区二区三区免费观看| 国产丝袜一区| 欧洲一区二区在线观看| 色综合天天综合网中文字幕| 九一免费在线观看| 国产视频一区欧美| 伊人国产在线视频| 国产精品亚洲午夜一区二区三区 | 日本黄色的视频| 国产91精品一区二区麻豆亚洲| 中文字幕a在线观看| 久久久精品2019中文字幕之3| 日本女人性生活视频| 夜夜操天天操亚洲| 精品国产午夜福利| 3d动漫精品啪啪1区2区免费| 黄色片一区二区三区| 一区二区欧美亚洲| 日本精品600av| 欧洲午夜精品久久久| 亚洲一区av| 国产一区在线观| 999久久久91| 成年人午夜视频在线观看| 免费视频最近日韩| 欧美xxxxx少妇| 中文av字幕一区| 久久久久亚洲AV| 在线看国产一区| 亚洲爱爱综合网| 一区二区三区视频免费| 性网站在线观看| 国产精品成人免费电影| 荡女精品导航| 亚洲草草视频| 宅男噜噜噜66一区二区| 日本一二区免费| 91论坛在线播放| 久久久久久久久艹| 欧美日韩国产不卡| 你懂的视频在线免费| 色综合色综合久久综合频道88| 精品成人av| 久久天天狠狠| 欧美精品日本| 中文字幕 欧美日韩| 国产亚洲欧美一级| 精品成人免费视频| 日韩一区二区三区视频在线| av国产在线观看| 日韩av手机在线看| 欧美精品中文| 99在线免费视频观看| 国精品**一区二区三区在线蜜桃| 无码人妻精品一区二区中文| 亚洲h在线观看| 亚洲第一视频在线| 久久亚洲国产成人| 成人a在线观看高清电影| 精品一区二区三区视频日产| 在线观看一区视频| 18禁一区二区三区| 亚洲精品你懂的| 成人免费一区二区三区| 亚洲欧美日本精品| 九色porny自拍视频在线观看| 国产精品免费一区二区三区四区 | 欧美激情xxxxx| 日韩精品一区二区三区免费视频| 天天干天天操天天干天天操| 麻豆一区二区三| 香蕉久久久久久久| 欧美日韩中文一区| 春暖花开成人亚洲区| 国产v综合v亚洲欧美久久| 欧美天堂社区| 成人观看免费完整观看| 91麻豆免费看片| 天堂网av手机版| 日韩国产激情在线| 在线观看爽视频| 欧美人xxxxx| 日本在线不卡视频| 美国一级黄色录像| 7777精品伊人久久久大香线蕉的| 黄色在线视频网站| 91成人伦理在线电影| 国产精品videossex久久发布| 久久无码专区国产精品s| 亚洲动漫第一页| 色视频在线看| 国产精品亚洲自拍| 亚洲午夜精品一区 二区 三区| 成人一区二区三区仙踪林| 亚洲电影第三页| 免费在线视频你懂得| 国产在线拍揄自揄视频不卡99 | 国产精品美日韩| 精品二区在线观看| 国内精品模特av私拍在线观看| 亚洲人成亚洲精品| 久久99爱视频| 亚洲自拍偷拍九九九| 深夜福利在线观看直播| 国产精品激情av在线播放| 亚洲精品极品少妇16p| 国产免费a级片| 色综合夜色一区| 久久综合之合合综合久久| 国产精品国产一区二区| 久久久噜噜噜| 日本老熟俱乐部h0930| 亚洲精品久久久久国产| 国产美女久久| 欧美在线一区视频| 国产精品久久久久婷婷| 韩国中文字幕hd久久精品| 秋霞成人午夜鲁丝一区二区三区| 欧美激情777| theav精尽人亡av| 91精品国产综合久久久久久漫画 | 欧美激情成人动漫| 五月天亚洲综合情| 成人午夜av在线| 一区二区久久精品66国产精品| 性欧美长视频免费观看不卡| 欧美1级片网站| 免费a在线观看播放| 欧美欧美午夜aⅴ在线观看| 丁香花在线电影| 中文视频一区视频二区视频三区| 国产激情视频一区二区在线观看|