欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Spring事務(wù)失效的7個坑與底層原理:從JDBC到分布式事務(wù)

Spring事務(wù)失效的7個坑與底層原理:從JDBC到分布式事務(wù) 1. 事務(wù)失效的七宗罪我踩過的坑你大概率也會踩先講個真實事故。幾年前我維護過一個電商訂單系統(tǒng)線上出了一個詭異的bug用戶支付成功后訂單狀態(tài)正常更新但庫存卻莫名其妙多扣了一次。代碼看起來完全沒問題——service方法上明明白白標著Transactional數(shù)據(jù)庫也確認是InnoDB。查了兩天才定位到根因同一個類里方法A調(diào)用方法BB的事務(wù)注解根本沒生效。這就是Spring事務(wù)最經(jīng)典的坑之一自調(diào)用繞過代理。Transactional依賴AOP代理生效而Spring的代理機制決定了一個類內(nèi)部的方法調(diào)用是不會經(jīng)過代理對象的。this.orderService.update()拿到的這個this根本不是Spring容器里那個被代理過的bean而是原始對象。原始對象上的注解Spring根本看不見。結(jié)果就是你以為開啟了事務(wù)實際上沒有。庫存扣減在無事務(wù)狀態(tài)下執(zhí)行訂單那邊一旦報錯回滾庫存早就提交了。1.1 自調(diào)用問題最隱蔽的事務(wù)殺手自調(diào)用這個坑的隱蔽之處在于它不會報錯不會警告日志里什么都看不出來只有數(shù)據(jù)對不上賬的時候才會暴露。Service public class OrderService { Transactional public void createOrder(OrderDTO dto) { // 扣庫存 stockService.deduct(dto.getSkuId(), dto.getQuantity()); // 插入訂單 orderMapper.insert(buildOrder(dto)); // 這里調(diào)用了自身方法事務(wù)注解失效 this.sendNotification(dto); } Transactional(propagation Propagation.REQUIRES_NEW) public void sendNotification(OrderDTO dto) { // 通知邏輯 } }上面這段代碼里sendNotification的REQUIRES_NEW完全無效。因為this.sendNotification()走的是原始對象不是代理。解決辦法有三個把需要事務(wù)的方法挪到另一個Service類——最推薦職責也最清晰。注入自身代理Autowired private OrderService self;然后調(diào)用self.sendNotification()。使用AopContext.currentProxy()需要開啟EnableAspectJAutoProxy(exposeProxy true)然后((OrderService) AopContext.currentProxy()).sendNotification()。方案2最實用但要注意循環(huán)依賴問題——Spring 4.3之后字段注入的循環(huán)依賴是允許的但構(gòu)造器注入就不行。方案3代碼看著別扭但確實有效。1.2 非public方法注解白寫了Transactional用在private或者protected方法上Spring容器啟動時根本不報錯但方法執(zhí)行時事務(wù)就是沒開。原理不復(fù)雜Spring AOP生成代理的時候JDK動態(tài)代理基于接口只代理public方法CGLIB雖然能代理非public方法但Spring官方明確說了Transactional只支持public方法。最騷的是如果你把Transactional放在public方法上、但里面調(diào)用了private方法private方法里的事務(wù)注解同樣無效——因為事務(wù)邊界已經(jīng)在public方法的代理上確定了內(nèi)層調(diào)用不會再開啟新事務(wù)除非傳播行為是REQUIRES_NEW。我見過不少項目把Transactional加到private方法上然后一臉疑惑地說為什么回滾了沒生效。排查方法很簡單看日志里有沒有TransactionInterceptor的getTransaction記錄沒有就是代理沒走。1.3 異常被吞回滾了個寂寞這是最常見也最無語的一種。Java的檢查型異常checked exception默認不會觸發(fā)Spring事務(wù)回滾但很多人不知道這一點隨手寫了個throws Exception然后事務(wù)就失效了。Transactional public void transfer(Account from, Account to, BigDecimal amount) throws Exception { accountMapper.decrease(from.getId(), amount); accountMapper.increase(to.getId(), amount); // 業(yè)務(wù)校驗不通過拋了個業(yè)務(wù)異常 throw new BizException(余額不足); }BizException如果是繼承Exception而不是RuntimeException上面這個事務(wù)不會回滾錢就憑空消失了。Spring的默認回滾策略是只回滾RuntimeException和Error。檢查型異常如IOException不會觸發(fā)回滾因為Spring認為你既然顯式聲明了這個異常說明你可以處理它事務(wù)繼續(xù)提交是合理的。解決方案兩個方向業(yè)務(wù)異常統(tǒng)一繼承RuntimeException——大多數(shù)項目的做法最簡單。在Transactional上顯式指定Transactional(rollbackFor Exception.class)——最穩(wěn)一勞永逸。我個人的習(xí)慣是兩者都做自定義業(yè)務(wù)異常繼承RuntimeException同時在Transactional上寫rollbackFor Exception.class。雖然看起來冗余但團隊里總有人會寫檢查型異常。1.4 多線程子線程異常主線程事務(wù)照樣提交Transactional的事務(wù)上下文存在ThreadLocal里子線程拿不到父線程的事務(wù)上下文。Transactional public void batchProcess(ListOrder orders) { orders.parallelStream().forEach(order - { // 這里拋異常父線程事務(wù)不會感知 processOne(order); }); }如果一定要在多線程里用事務(wù)只能每個線程自己開事務(wù)用TransactionTemplate包住子線程的任務(wù)代碼然后在線程池層面做異常聚合——子線程里有任何失敗主線程如何決定是否整體回滾需要自己實現(xiàn)協(xié)調(diào)邏輯。這個問題在批量導(dǎo)入、報表生成、定時任務(wù)場景里非常常見。我的建議是批量任務(wù)盡量不用Transactional包整段而是每條或每批用TransactionTemplate單獨開事務(wù)配合失敗記錄表做補償。這樣既能保證數(shù)據(jù)一致又不會因為一個線程失敗導(dǎo)致大批量回滾。1.5 數(shù)據(jù)庫引擎不支持事務(wù)這個坑現(xiàn)在少了但老項目中還能見到。MySQL的MyISAM引擎根本不支持事務(wù)你注解標得再多也沒用。確認方法很簡單SHOW TABLE STATUS WHERE Name your_table;看Engine字段InnoDB支持事務(wù)MyISAM不支持。另外如果表是MyISAMSpring事務(wù)管理器初始化時也不報錯執(zhí)行時DataSourceTransactionManager還是會調(diào)setAutoCommit(false)但引擎層面不認等于白忙。1.6 final類或final方法CGLIB也救不了Spring事務(wù)默認用AOP代理。如果目標類配置了JDK動態(tài)代理基于接口那沒問題如果走CGLIB基于類繼承生成子類那么final類無法被繼承final方法無法被重寫代理自然失效。Spring Boot 2.x之后默認proxyTargetClasstrue走CGLIBfinal問題就浮出水面了。很多人把service類寫成final為了防繼承結(jié)果事務(wù)全失效。排查方法啟動時看日志里是JdkDynamicAopProxy還是CglibAopProxy再看你的類和方法有沒有final修飾符。1.7 事務(wù)管理器沒配置或配置錯了Spring Boot的DataSourceAutoConfiguration會自動配置DataSourceTransactionManager但你如果引入了多數(shù)據(jù)源或者自定義了DataSource而沒有配套注冊PlatformTransactionManager那Transactional就會失效。另外EnableTransactionManagement注解在Spring Boot里默認開啟不需要你重復(fù)添加。但如果你用了Spring MVC非Boot項目忘了加EnableTransactionManagement事務(wù)也會靜默失效。排查清單很簡單Transactional方法執(zhí)行的線程棧里有沒有TransactionInterceptor有就是代理生效了沒有就是代理沒生效。2. Spring事務(wù)的底層運作機制從JDBC到動態(tài)代理很多人用Transactional用了好幾年但完全不知道它背后發(fā)生了什么。面試被問Spring事務(wù)是怎么實現(xiàn)的只會答AOP兩個字就再也說不出更多了。其實底層鏈路沒那么玄拆開看就三層JDBC的事務(wù)能力、Spring的事務(wù)抽象、AOP的代理包裝。2.1 第一層JDBC的事務(wù)基石萬事萬物都離不開JDBC。Spring事務(wù)再花哨落到底層就是這三行代碼Connection conn dataSource.getConnection(); conn.setAutoCommit(false); // 關(guān)閉自動提交 conn.commit(); // 提交 conn.rollback(); // 回滾setAutoCommit(false)的意思是之后的SQL不會立即生效必須等commit()才真正寫入數(shù)據(jù)庫MySQL的binlog和redolog層面是另一套機制。如果中途異常調(diào)用rollback()之前的所有操作全部撤銷。所以Spring事務(wù)的本質(zhì)就是幫你管理Connection在合適的時機調(diào)用commit或rollback。就這么簡單。2.2 第二層PlatformTransactionManager抽象Spring抽象了一個接口——PlatformTransactionManager核心方法就三個public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition); void commit(TransactionStatus status); void rollback(TransactionStatus status); }getTransaction獲取或創(chuàng)建事務(wù)。注意這里的措辭——如果你已經(jīng)在事務(wù)里根據(jù)傳播行為決定是復(fù)用當前事務(wù)還是掛起后新建。commit提交事務(wù)。但提交前會檢查TransactionStatus里的rollbackOnly標記如果之前有人標記了只回滾這里會拋UnexpectedRollbackException。rollback回滾事務(wù)。常用的實現(xiàn)是DataSourceTransactionManager針對Hibernate有HibernateTransactionManager針對JPA有JpaTransactionManager。DataSourceTransactionManager的doBegin方法做了幾件事從DataSource拿一個Connection。如果當前Connection是自動提交模式關(guān)閉它并記下來方便事務(wù)結(jié)束恢復(fù)。設(shè)置隔離級別如果TransactionDefinition指定了。設(shè)置只讀標志readOnlytrue會走Connection.setReadOnly對MySQL的InnoDB來說這能優(yōu)化一些查詢路徑。把這個Connection綁定到TransactionSynchronizationManager的ThreadLocal里。后面的DAO操作拿到的Connection就是從TransactionSynchronizationManager里取的。這就是同一個事務(wù)里所有SQL共用同一個數(shù)據(jù)庫連接的原理——ThreadLocal綁定。2.3 第三層AOP代理的切入點Spring事務(wù)的AOP基于TransactionInterceptor它實現(xiàn)了MethodInterceptor攔截所有被Transactional標記的方法。調(diào)用鏈是這樣的外部調(diào)用orderService.createOrder()實際調(diào)用的是代理對象的方法。TransactionInterceptor.invoke()被觸發(fā)先調(diào)用TransactionAspectSupport的createTransactionIfNecessary。根據(jù)Transactional上的配置傳播行為、隔離級別、超時等調(diào)用PlatformTransactionManager.getTransaction()。執(zhí)行業(yè)務(wù)方法。方法正常返回提交事務(wù)方法拋異常根據(jù)rollbackFor配置決定是否回滾。清理ThreadLocal中的連接恢復(fù)自動提交狀態(tài)。所以Transactional加在哪個方法上代理就攔哪個方法——事務(wù)邊界就是方法邊界。方法跑多久事務(wù)就開多久。2.4 只讀事務(wù)與UnexpectedRollbackException的真相熱詞里有一條UnexpectedRollbackException: transaction rolled back because it has been marked as rollback-only這是個非常經(jīng)典的問題。場景是這樣的方法A開啟事務(wù)調(diào)用方法BB標記了rollback-onlytrue比如B捕獲了異常但內(nèi)部回滾邏輯已運行。然后A繼續(xù)執(zhí)行正常返回時調(diào)用commit()此時Spring發(fā)現(xiàn)事務(wù)被標記為rollback-only直接拋UnexpectedRollbackException事務(wù)回滾。換句話說你代碼里沒拋異常但事務(wù)已經(jīng)注定要回滾了。這經(jīng)常出現(xiàn)在try-catch吃了異常但沒重新拋出的情況下。排查時看日志里有沒有Transaction rolled back because it has been marked as rollback-only的WARN告警跟著調(diào)用棧就能找到是哪個方法把事務(wù)標記了。3. 事務(wù)傳播行為與隔離級別什么時候用哪個別背口訣網(wǎng)上關(guān)于傳播行為的口訣一大堆什么REQUIRED默認用REQUIRES_NEW記日志NESTED做嵌套背下來容易用對難。我把這幾個傳播行為逐個講透配上真實場景你就能理解了。3.1 傳播行為詳解Spring定義了7種傳播行為大部分項目用到的不超過4種但理解每一種的原理仍然重要。傳播行為含義典型場景REQUIRED有事務(wù)就復(fù)用沒有就新建默認值99%的場景用它SUPPORTS有事務(wù)就加入沒有就無事務(wù)執(zhí)行查詢方法可選MANDATORY必須在事務(wù)中執(zhí)行否則拋異常強制事務(wù)的方法REQUIRES_NEW掛起當前事務(wù)永遠新建一個寫日志、異步通知NOT_SUPPORTED掛起當前事務(wù)以無事務(wù)方式執(zhí)行導(dǎo)出大數(shù)據(jù)量文件NEVER如果有事務(wù)就拋異常強制無事務(wù)的執(zhí)行NESTED嵌套事務(wù)基于保存點Savepoint大批量循環(huán)處理單條失敗不影響整體REQUIRED是默認值理解起來很簡單Spring檢查當前ThreadLocal里有沒有綁定事務(wù)有就加入沒有就新建一個。注意加入意味著共用一個事務(wù)、一個Connection、一套commit/rollback。內(nèi)層方法拋異?;貪L外層也一起回滾。REQUIRES_NEW的核心是掛起。邏輯是從TransactionSynchronizationManager里把當前事務(wù)的Connection解綁、掛起然后新建一個完全獨立的事務(wù)持有獨立的Connection。內(nèi)層事務(wù)提交/回滾不影響外層事務(wù)。外層事務(wù)回滾內(nèi)層已經(jīng)提交的數(shù)據(jù)不會跟著回滾。典型場景就是操作日志業(yè)務(wù)方法開啟事務(wù)日志記錄要獨立提交——不管業(yè)務(wù)成功還是失敗日志都要寫進去。如果你用REQUIRED業(yè)務(wù)回滾時日志也跟著回滾那排查問題的時候就看不到錯誤日志了。NESTED跟REQUIRES_NEW的區(qū)別要講清楚。REQUIRES_NEW是物理事務(wù)獨立的Connection、獨立的commit/rollbackNESTED是邏輯事務(wù)基于Savepoint保存點。內(nèi)層方法失敗回滾到保存點外層可以繼續(xù)執(zhí)行外層最終提交時一起提交所有保存點之前的操作。但注意NESTED需要底層數(shù)據(jù)庫支持保存點。MySQL的InnoDB支持但有些數(shù)據(jù)庫不支持且JpaTransactionManager對NESTED的支持有限。實際項目中能用REQUIRES_NEW解決的就別用NESTED少踩坑。3.2 隔離級別臟讀、不可重復(fù)讀、幻讀Spring事務(wù)隔離級別有五種對應(yīng)JDBC的隔離級別隔離級別臟讀不可重復(fù)讀幻讀說明DEFAULT---使用數(shù)據(jù)庫默認MySQL默認REPEATABLE_READREAD_UNCOMMITTED會會會讀未提交不推薦READ_COMMITTED不會會會Oracle默認REPEATABLE_READ不會不會會MySQL InnoDB下不會MySQL默認SERIALIZABLE不會不會不會串行化性能最差臟讀讀到別的事務(wù)未提交的數(shù)據(jù)。不可重復(fù)讀同一事務(wù)內(nèi)兩次讀取同一數(shù)據(jù)結(jié)果不一樣因為別的事務(wù)提交了更新。幻讀同一事務(wù)內(nèi)兩次查詢返回的記錄數(shù)不一樣因為別的事務(wù)插入了新記錄。MySQL的InnoDB在REPEATABLE_READ級別下通過MVCC多版本并發(fā)控制 Gap Lock間隙鎖實際上消除了幻讀問題。所以MySQL默認的REPEATABLE_READ比Oracle的READ_COMMITTED在某些場景下更嚴格。實際項目中我見過很多團隊把隔離級別統(tǒng)一設(shè)成READ_COMMITTED理由是MySQL的RR有間隙鎖并發(fā)插入容易死鎖。這個說法有一定道理但不是絕對的。如果你的系統(tǒng)沒有復(fù)雜的范圍查詢并發(fā)插入場景RR不會成為瓶頸如果你確實遇到死鎖頻繁再降級也不遲。3.3 事務(wù)超時與回滾策略Transactional(timeout 5)表示事務(wù)最多執(zhí)行5秒超時則強制回滾。底層實現(xiàn)是JDBC的Connection.setNetworkTimeout或者由Spring在每次SQL執(zhí)行前檢查時間不同實現(xiàn)有差異。但要注意timeout是從事務(wù)開始到最后一次SQL執(zhí)行的時間不是方法總耗時。如果你的方法在事務(wù)前做了一堆耗時操作比如遠程調(diào)用這部分不計入事務(wù)超時。所以不要指望timeout能保護整體方法執(zhí)行時間。關(guān)于回滾策略我再強調(diào)一次// 推薦寫法 Transactional(rollbackFor Exception.class) // 或者只回滾特定異常 Transactional(rollbackFor BizException.class, noRollbackFor IllegalStateException.class)noRollbackFor用的場景不多但有一種情況很實用某些非關(guān)鍵數(shù)據(jù)比如統(tǒng)計緩存的更新失敗不應(yīng)該讓主事務(wù)回滾可以列在noRollbackFor里。4. 編程式事務(wù)當Transactional真的不合適時Transactional是聲明式事務(wù)用起來方便但有三個致命弱點事務(wù)粒度太大整個方法一個事務(wù)如果方法里有網(wǎng)絡(luò)調(diào)用或批量循環(huán)事務(wù)會長時間占用數(shù)據(jù)庫連接。自調(diào)用失效前面已經(jīng)講過了。無法精確控制提交時機想先做幾步提交再繼續(xù)做Transactional實現(xiàn)不了。這時候就該上手編程式事務(wù)了。Spring提供了TransactionTemplate。4.1 TransactionTemplate的用法Service public class OrderService { private final TransactionTemplate transactionTemplate; public OrderService(PlatformTransactionManager transactionManager) { this.transactionTemplate new TransactionTemplate(transactionManager); // 可以設(shè)置默認配置 this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); } public void createOrder(OrderDTO dto) { transactionTemplate.executeWithoutResult(status - { stockMapper.deduct(dto.getSkuId(), dto.getQuantity()); orderMapper.insert(buildOrder(dto)); }); } }TransactionTemplate.execute回調(diào)里你可以在任何地方開啟事務(wù)塊粒度完全由自己控制。更重要的是它徹底繞開了自調(diào)用問題——因為你是直接調(diào)用事務(wù)管理器不走代理。還有一個場景強烈推薦用TransactionTemplate大批量循環(huán)插入。如果用Transactional包住整個for循環(huán)幾萬條數(shù)據(jù)一個事務(wù)提交時數(shù)據(jù)庫壓力巨大一旦失敗全部回滾代價太高。改成循環(huán)內(nèi)用TransactionTemplate每100條一個事務(wù)失敗了只回滾這一批配合日志記錄失敗批次整體效率和可靠性都高很多。4.2 手動控制TransactionStatus如果execute回調(diào)不適合你比如需要事務(wù)中間做分支判斷、需要中途提交可以用更底層的PlatformTransactionManagerAutowired private PlatformTransactionManager transactionManager; public void complexBiz() { DefaultTransactionDefinition def new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status transactionManager.getTransaction(def); try { // 業(yè)務(wù)邏輯1 dao.update(...); // 到這里先提交一次 transactionManager.commit(status); // 開啟新事務(wù) TransactionStatus status2 transactionManager.getTransaction(def); try { // 業(yè)務(wù)邏輯2 dao.insert(...); transactionManager.commit(status2); } catch (Exception e) { transactionManager.rollback(status2); throw e; } } catch (Exception e) { transactionManager.rollback(status); throw e; } }這段代碼展示了如何手動控制多段事務(wù)但我強烈不建議在業(yè)務(wù)代碼里寫這種底層代碼——容易出錯而且代碼很難讀。99%的場景TransactionTemplate夠用了。4.3 編程式事務(wù)的注意點TransactionTemplate是線程安全的可以做成Bean注入不要每次new一個。executeWithoutResult和execute的區(qū)別后者可以返回業(yè)務(wù)結(jié)果前者只能執(zhí)行不能返回。需要返回值就用execute。事務(wù)回調(diào)里拋出的異常RuntimeException會觸發(fā)回滾檢查型異常默認不會。要回滾檢查型異常需要手動status.setRollbackOnly()或者包裝成RuntimeException。5. 多數(shù)據(jù)源與分布式事務(wù)跳出單庫思維的邊界單庫單事務(wù)的好日子總有到頭的時候。微服務(wù)一拆、分庫一搞Transactional就管不住跨庫的數(shù)據(jù)一致性了。我先講清楚Spring事務(wù)在多數(shù)據(jù)源下的表現(xiàn)再展開分布式事務(wù)。5.1 多數(shù)據(jù)源下的事務(wù)各管各的如果你配置了兩個DataSource比如一個主庫一個從庫Spring里注冊了對應(yīng)的兩個PlatformTransactionManager同一個Transactional方法里操作了兩個庫——那這兩個庫的事務(wù)是互相獨立的。主庫提交成功、從庫提交失敗你沒有任何辦法通過單機事務(wù)解決。Spring Boot里處理多數(shù)據(jù)源的常規(guī)姿勢是Transactional(transactionManager xxxTransactionManager)指定用哪個事務(wù)管理器。方法里操作另一個庫那份數(shù)據(jù)不在事務(wù)保護范圍內(nèi)。所以多數(shù)據(jù)源場景下的策略是一個事務(wù)只操作一種數(shù)據(jù)源。跨數(shù)據(jù)源的業(yè)務(wù)要么拆分方法要么引入分布式事務(wù)方案不要指望Transactional救你。5.2 分布式事務(wù)的主流方案對比分布式事務(wù)是個大話題我只挑主流方案講給個選型思路。XA協(xié)議兩階段提交2PCXA是最正統(tǒng)的分布式事務(wù)協(xié)議分兩步準備階段所有參與者執(zhí)行SQL但不提交各自保留Undo/Redo log和提交階段協(xié)調(diào)者發(fā)提交指令各參與者提交。問題在于準備階段會一直持有數(shù)據(jù)庫鎖高并發(fā)場景下鎖沖突嚴重性能非常差。Java里典型的實現(xiàn)是Atomikos、Bitronix。說實話互聯(lián)網(wǎng)高并發(fā)場景用XA的很少了更多出現(xiàn)在金融等強一致性要求的內(nèi)部系統(tǒng)。TCCTry-Confirm-CancelTCC把每個操作拆成三個階段Try預(yù)留資源、Confirm確認執(zhí)行、Cancel取消釋放。優(yōu)點是業(yè)務(wù)層面控制粒度性能比XA好很多缺點是侵入性極強每個業(yè)務(wù)都要寫三套邏輯。典型場景賬戶轉(zhuǎn)賬。Try階段凍結(jié)轉(zhuǎn)出金額Confirm階段扣款Cancel階段解凍。這個方案需要深入理解業(yè)務(wù)才能寫得對如果你只是想快速實現(xiàn)一個分布式事務(wù)TCC的學(xué)習(xí)成本挺高的。消息事務(wù) 最終一致性這是目前最常用、成本最低的方案。思路很簡單利用本地事務(wù)把業(yè)務(wù)操作和發(fā)消息綁定在同一次數(shù)據(jù)庫事務(wù)里通過消息中間件RocketMQ/RabbitMQ最終把數(shù)據(jù)變更同步給其他服務(wù)。舉個訂單和積分的例子開啟本地事務(wù)插入訂單表同時插入積分消息表。本地事務(wù)提交后后臺任務(wù)或MQ的事務(wù)消息機制把積分消息表里未發(fā)送的記錄發(fā)到MQ。積分服務(wù)從MQ消費消息給用戶加積分。如果積分服務(wù)失敗消息進入重試隊列直到成功。這種方案做不到強一致中間會有一段數(shù)據(jù)不一致的時間窗口但絕大多數(shù)業(yè)務(wù)都能接受。核心機制是本地消息表實現(xiàn)成本低、不用引入重量級中間件是目前國內(nèi)互聯(lián)網(wǎng)公司的首選方案。Seata的AT模式Seata是阿里開源的分布式事務(wù)框架AT模式的思路是代理你的SQL記錄Before Image和After Image數(shù)據(jù)快照在全局提交時自動執(zhí)行補償SQL。對業(yè)務(wù)代碼侵入性很小但性能有一定損耗每行數(shù)據(jù)要記錄前后快照。如果你的系統(tǒng)需要跨服務(wù)事務(wù)、又不想太動代碼Seata AT是可以考慮的。5.3 選擇建議場景推薦方案單體應(yīng)用單數(shù)據(jù)庫什么都不用本地事務(wù)夠用微服務(wù)對一致性要求不高本地消息表 MQ最終一致微服務(wù)強一致要求高Seata AT 或 TCC金融級強一致低并發(fā)XA/2PC非核心數(shù)據(jù)可以容忍短暫不一致MQ異步 對賬補償分布式事務(wù)沒有銀彈。選型的核心不是哪個方案高級而是你的業(yè)務(wù)能容忍多大程度的不一致。6. 事務(wù)排查工具箱從日志到監(jiān)控的一整套姿勢事務(wù)的問題一旦出現(xiàn)往往都是線上的、隱性的、難復(fù)現(xiàn)的。所以一定要有一套預(yù)防和排查的手段而不是等出了問題再手忙腳亂。6.1 日志配置把事務(wù)邊界打印出來Spring的事務(wù)日志默認是DEBUG級別不打開根本看不到。在application.yml里配置logging: level: org.springframework.transaction: DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager: DEBUG org.springframework.jdbc.datasource.JdbcTransactionManager: DEBUG打開后你會看到類似這樣的日志Obtained JDBC transaction from DataSource [HikariDataSource (HikariPool-1)] Participating in existing transaction Initiating transaction commit Initiating transaction rollback這些日志的排列能幫你快速判斷事務(wù)有沒有開啟、是新建還是復(fù)用、提交還是回滾、有沒有因為rollback-only被強制回滾。6.2 ThreadLocal狀態(tài)的運行時監(jiān)控如果你懷疑某個方法執(zhí)行時事務(wù)狀態(tài)不對可以在代碼里手動檢測import org.springframework.transaction.support.TransactionSynchronizationManager; boolean isInTransaction TransactionSynchronizationManager.isActualTransactionActive(); System.out.println(當前是否在事務(wù)中: isInTransaction);isActualTransactionActive()返回true說明當前線程確實有數(shù)據(jù)庫事務(wù)處于活動狀態(tài)。如果外面標了Transactional但這里返回false說明代理沒生效——自調(diào)用、final方法、私有方法逐個排查。還可以查看當前事務(wù)名Object name TransactionSynchronizationManager.getCurrentTransactionName();這能幫你快速定位當前事務(wù)是哪個方法開啟的。6.3 監(jiān)控事務(wù)耗時與連接占用事務(wù)另一個容易忽略的問題是連接泄漏和長事務(wù)。一個事務(wù)如果執(zhí)行了幾十秒連接就占用了幾十秒連接池很快被打滿。建議做法在DataSource層加慢SQL日志HikariCP有connectionTimeout、validationTimeout配置同時開啟leakDetectionThreshold檢測連接泄漏。用TransactionSynchronizationManager.registerSynchronization注冊事務(wù)同步回調(diào)統(tǒng)計每個事務(wù)的耗時。Transactional public void bizMethod() { long start System.currentTimeMillis(); TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { Override public void afterCompletion(int status) { long cost System.currentTimeMillis() - start; if (cost 1000) { log.warn(事務(wù)耗時過長: {}ms, status{}, cost, status); } } }); }這個方法能精確定位哪個事務(wù)方法最耗時但它需要每一個業(yè)務(wù)方法都加一遍侵入性強。更好的方案是寫一個AOP切面統(tǒng)一攔截Transactional方法做耗時統(tǒng)計。6.4 事務(wù)失效排查的標準操作流程如果線上出現(xiàn)了疑似事務(wù)失效的問題我的排查順序是這樣的看日志打開事務(wù)DEBUG日志確認方法執(zhí)行時有沒有Obtained JDBC Transaction記錄。沒有就是代理沒生效走第2步有就繼續(xù)看提交/回滾記錄走第5步??捶椒ê灻遣皇莗ublic類或方法有沒有final看調(diào)用方是不是同一個類內(nèi)部調(diào)用是不是沒有被Spring管理的對象比如new出來的看注解Transactional有沒有寫對rollbackFor有沒有配多數(shù)據(jù)源下transactionManager指對了沒有看異常異常有沒有被try-catch吞掉異常類型是不是RuntimeException看數(shù)據(jù)庫表引擎支不支持事務(wù)連接是不是走到了正確的DataSource這套流程走一遍90%的事務(wù)問題都能定位。7. 最后的實戰(zhàn)建議事務(wù)規(guī)范從我做起寫到這里我把這些年跟事務(wù)打交道沉淀下來的幾條規(guī)矩放在最后算是個人的實戰(zhàn)總結(jié)也是新項目啟動時的檢查清單。事務(wù)方法要短小精悍。事務(wù)范圍之內(nèi)不要做遠程調(diào)用、不要做復(fù)雜的文件IO、不要進行大批量循環(huán)。否則連接池遲早被打死。把非數(shù)據(jù)庫操作移到事務(wù)外或者拆成多個事務(wù)塊。事務(wù)邊界要盡可能晚開啟盡可能早提交。前置校驗、參數(shù)組裝這些放事務(wù)外真正需要數(shù)據(jù)庫原子性的操作才放進事務(wù)塊。很多人習(xí)慣方法一進來就開事務(wù)其實很多操作根本不需要事務(wù)保護?;貪L配置要顯式寫。Transactional(rollbackFor Exception.class)這行字雖然啰嗦但它能擋住95%的回滾失效問題。自定義的業(yè)務(wù)異常統(tǒng)一繼承RuntimeException省得每個方法都要考慮這個異常會不會回滾。批量處理用TransactionTemplate而不是Transactional。循環(huán)里的事務(wù)一定要用編程式事務(wù)精確控制粒度Transactional包整個循環(huán)就是把數(shù)據(jù)庫往死里逼。分布式事務(wù)不要貪多求全。能靠業(yè)務(wù)流程設(shè)計規(guī)避的就盡量規(guī)避比如通過本地消息表做最終一致性比引入一套重量級分布式事務(wù)框架劃算得多。選型之前先想清楚你的數(shù)據(jù)不一致容忍度。事務(wù)這個東西說到底是數(shù)據(jù)庫連接和錯誤處理時機的管理藝術(shù)。理解底層機制比背多少面試題都管用。希望這篇文章里踩過的坑、總結(jié)的思路能讓你少走幾條彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩成人av在线| 婷婷九九色| 熟女网站久久| 色综合播放| 激情丁香社区| 欧美日韩成人在线网站| 另类激情五月天| 激情综合九月| 99热很操老逼| 欧美97超碰| 五月激情综合网| 日本五月丁香| 婷婷丁香五月天欧美| 91久久九九| 五月婷婷久久综合| 狠狠干在线| www.色婷婷| 影音先锋 婷婷| 99久久精| 婷婷五月天激情四射| 青青久久91| 五月丁香在线| 天天操综合网| 久久9视频| 东京热免费视频| 婷婷五月天深爱| 色色色色色九九九九九| 色色色9| 综合久色五月| 五月天丁香成人社| 99久| A久久| 婷婷中文字幕版| 五月婷婷久久网| 亚州操操| 色婷婷丁香香香蕉视频| 五月天丁香六月综合| 密着浓厚中出乚交尾GvG935| www.99在线| 97精品人人A片免费看| 五月天色视频| 26UUU成人网| 伊人大香蕉爱聚| 91狠狠色色丁香婷婷综合久久| 欧美情月伍月天| 午夜亚洲AV日韩无码| 舔色婷婷| 成 久久| …亚洲黄色在线播放日韩、av中文a…| 色婷婷小说网| 98永久精品| 丁香激惜男女| 97在线刺激| 国产精品A成V人在线播放| 婷婷五月视屏| 五月丁香亚洲五月| 五月天婷婷基地| 五月婷视频| 99热老司机| 五月天伊人手机在线播放AV| 热无码A∨| 五月丁香婷婷激情四射迷人| 久久国产一区二区三区| 狠狠综合| 色色色婷婷五月天| 99综合| 五月婷婷六月丁香激情综合网| 日本久久9| 久久98| 淑女丝袜bi操逼123| 色五月丁香五月五月婷婷| 亚洲无码你懂的| 国产欧美精品AAAAAA片| 思思热这里只有精品| 五月婷婷在线综合| 久久人人人人妻| 99热都是精品| 欧美在线看| 骚逼视频一区2区| 五月婷婷AV| 亚洲天码视频www蛋播视频| 丁香五月激情宗合网| 六月丁香婷婷大香蕉| 亚洲亚洲人成综合网络| 久久人妻视频| 婷婷五月丁香五月| 激情五月婷婷| 天天做天天爱天天爽| 日日操夜夜爽| 79精品视频在线观看,| 婷婷五月激情丁香激情| 色六月丁香婷婷狠狠干| 久久精品国产色| 亚洲在线操| 激情五月婷婷色色| WWW.久久99| 色综合99无码| 五月丁香色停停啪啪啪| 色婷婷狠狠禁18久久| 婷婷久久久| 丁香五月激情啪啪| 色五月天婷婷| 丁香六月天| 97热这里精品在线视频| 国产精品视频免费看| 亚洲日日日| 开心五月深爱五月丁香五月激情五月| 五月天激情开心网| VfJxEwPH| nvrentiantang av| 色色色在线观看| 五月天激情无码| 99热这里只有的精品视| 色 色 色综合com| 亚洲99视频| 五月丁激情| 久久精品在线| 互月天综合| 99热精品一区| 人妻久久久久久久久久久| 天天爽日日爽夜夜爽| 日韩欧美骚货| 丁香五月五月婷婷| 欧美日韩成人高清在线| 久久只有18视频| www.久久99| 另类小说五月天| 人人人人人人人人人草| 天天做天天爰天天爽天天无遮挡| 先锋男人99资源| 色婷婷色五月丁香| 欧美色爱五月天| 激情五月天综合| 婷婷五月六月| 国产日比| 久久在线视频免费观看| 色婷婷av综合网| 天天插操| 狠狠色丁香婷婷久久综合| 99人人操人人爱久久久| 色婷婷WWW| 婷香五月网在线| 日日操夜夜操狠狠操| 99热香港| 97碰碰视频在线观看免费| 五月婷婷婷综合网| 天天操夜夜啊| 五月天激情无码专区| 久久婷婷六月综合综合色| 色五月激情| 丁香五月婷婷综合精品素人| 五月丁香综合激情| 变态另类色图| 日韩成人综合网| 色五月婷婷五月丁香五月激情五月视频| 99色色热| 国产婷婷五月在线视频| 色狠狠综合| 日韩啪啪网| 国产精品18久久久| 五月婷婷久久大香蕉| 久久婷婷五月| 婷婷欧美激情| 偷拍五月丁香| 天天操天天国产三级片处女学生妹| 激情综合色婷婷啪啪六月天| 欧美性丁香色色五月天综合爱爱| 婷婷五月天激情开心网| 婷婷色色五月天| 九九热狼人| 99热欧美偷拍| 奸逼视频| 超碰操网| 91干99| 99激情网| 天天色天天色天天色天天色天天色| 亚洲综合五月天| 五月天亭亭俺也| 久久桃花网色婷婷| 综合久久婷婷| 久久九九re热| 五月丁激情| 天堂五月婷婷| 万月丁香狠狠爱| 91狠狠色色丁香婷婷综合久久| 热的国产99热| 类似婷婷激情综合网站| 青青草大香| 久婷婷婷| 亚洲色色香蕉| 亚洲最大成人综合网720P| 欧美人人女女精品综合五月天| 综合欧美五月婷婷| 99久久婷婷五月综合| 深爱五月天| 男人天堂AV在线一区二区| 那里有AV网址| 色七七九九| 中文字幕无线久必| 伦乱美欧| 丁香婷婷五月综合色情| www久久久久| WWW五月天| 久草a片| 四川BBB搡BBB爽爽视频| 玖月婷婷爱丁香| 激情五月婷婷丁香| 亚洲成AV人片在线观看| 丁香五月AV综合激情| 丁香六月激情四射| 五月天色色色色色| 六月色丁香中文字幕| 天天色播| 9久热在线视频精品| 五月六月激情| 欧美午夜乱妇午夜福利| 天天插天天插天天日| 中文在线成人| 嫩草国产| 婷婷五月激情在线视频| 超碰操日| 五月丁香五月天现场视频| 六月婷婷综合| 日日骑夜夜撸| 另类图片五月天婷婷| 五月丁香六月| 青青草Avb在线| 成人婷婷五月| 日韩一本操| 五月久久五月激情| 色色婷婷五月| 涩五月婷婷| 天堂综合久| 久操大屁股女人av| 99久热这里只有精品| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 日日夜夜天天| 色婷婷色五月另类综合| 天天操天天干天天日| 色噜噜狠狠色综合网| 婷婷开心激情五月激情网| 国产肥白大熟妇BBBB视频| 久久机热这里只有精品免费视频| 青青操avbb| 成人av在线网址| 天天撸天天干天天插| 老妇六区| 大地资源色婷婷视频在线| 午夜少妇在线观看视频| 亚洲五月婷婷在线| 熟妇无码乱子成人精品| 六月丁香婷婷网| 九九热精品| 丁香六月婷月91婷月| 久99久在线| 七七九色| 九九热在线99| 五月丁香综合网色欲| 99精品性爱| 超碰大香蕉网| 激情综合网五月婷婷| 色九九综合| 99操99| 久久xxxx| 亚洲亚洲人成综合网络| 伊人丁香花综合影院| 亚洲A片成人无码久久精品青桔| 这里只有精品99视频| 91丨九色丨东北熟女| 丁香六月婷婷缴情欧美| 日韩国产在线精品| 日本视频欧美观看免费| 五月色综合| 五月 激情视频| 99九九热视频| 婷婷成人网五月天| 大地资源色婷婷视频在线 | 亚洲激情视频在线观看| 大香蕉综合在线| 第四色五月激情网| 中文婷婷狠狠| 综合久久影院| 夜夜涩涩涩| 麻豆WWWCOM内射软件| 深爱五月亚洲| 久久丁香社| 成人免费在线电影| 色色色视频免费无码 | 在线色五月婷婷| 亚洲情综合五月天| 激情五月天社区| 超碰人人91| 欧美日韩999| 天天日天天插天天操| 日本精品久久久久中文字幕| 五月婷婷综合久久| 级情九色| 日韩AC在线免费观看| 99视频精品全部观看10| 深爱激情网五月| 99精品偷自拍| 性热视频99精品| 婷婷五月天AV网| 欧美叉叉叉BBB网站| 五月丁香激情婷婷| 国产成人网址| 欧美久久久中文字幕| 2025天天日爽| 五月天婷婷自拍图片在线观看| www,99视频| 婷婷色综合av| 六月丁香婷婷色综合| 激情综合九| 亚洲操精品| 内射干少妇亚洲69XXX| 丁香五月婷在线| 五月丁香激情综合啪啪| 思思久久99热只有频精品66| 五月婷婷成人| 亚洲婷婷激情888精品久| 婷婷五月天AV在线| 色伊人91在线视频| 粉嫩av懂色av蜜臀av熟妇| 99热这里有精品6| 无码一级片| 99热在这里只有精品| 色五月婷婷激情五月| 99re热在线视频观看| 五月天大香蕉| 亚洲欧洲午夜成人精品av| 色的色综合| 国产日韩av片| 婷婷福利影院| 色色五月婷婷| 激情四射五月天| 亚洲成人va| 精品久久99| 日韩AV成人电影| 五月婷婷中文字幕| 9l视频自拍九色9l视频在线观看| 另类激情五月| 五月婷婷干干干| 在线成人av播放| 人妻久久久| 六月婷婷五月丁香| 九九久久视频| 密臀久久| 色就是色婷婷五月亚洲激情| 狠狠五月激情丁香六月| 国产综合A片| 色婷五月天| EEUSS鲁片一区二区三区| 狠狠狠五月婷婷六月丁香| 91操片| 久久久天天啊| 米奇影视资源777狠狠色婷婷五月天激情网 | 亚洲婷婷五月| 精品视频网| 激情五月激情综合网| 成人电影AV在线观看| 五月天婷婷乱| 久久视频这里都是精品| 九九热这里只有精品5| 美国天天操无码| 99ER热精品视频| 夜夜干 夜夜操| 五月婷婷导航| 亚洲激情五月| 久久六月天| 婷婷丁香激情| 激情亚洲婷婷六月| 婷婷色5月天在线。| 99精品久久| 婷婷九月亚洲| 99re热在线观看| 久久精99| 9在线9在线婷婷在线国产| 香蕉人妻AV久久久久天天| 日本高清久久| 欧美人妻一区二区| 99自拍视频在线观看| 婷婷五月天视频免费在线观看| 五月激情丁香| 五月丁香婷婷开心| 婷婷久久亚洲| 五月亭亭六月天| www.五月天社区| A A色色| 内射激情在线| 深爱开心五月天| 九九99视频精品| 丁香五月1页| 97久久人人操| 99噜噜噜在线播放| 天天插天天射| 中文字幕日产A片在线看| 天天插天天干| 无码91中文字幕| 内射人妻视频国内| 欧美五月停| 国精产品一区一区三区免费视频| 日韩黄色中文字幕| www.色五月.com| 日日艹思思热| 五月六月丁香激情| 久久总和99| 激情五月丁香社区| 丁香五月天堂网| 九九热视频在线观看| 99热免费观看| .精品久久久麻豆国产精品| 国产精品美女久久久久AV超清| 婷婷五月天丁香花| 日本婷婷激情四射中文字幕在线观看| 男女激情久久| 久热丁香| 狠狠色色| 五月婷综合性中心| 色五月婷婷丁香五月| 深爱五月激情| 狠狠丁香| 中字幕视频在线永久在线观看免费| 国产一区二区三区影院| 视频一区二区在线| 五月丁香综合成人社区| 丁香五月电影| 久久有码| 五月丁香六月天| 丁香激情网| 婷婷另类小说| 伊人香大香蕉视频| 婷婷五月天精品| 大香蕉五月婷婷| 婷婷丁香六月五月天| 丁香五月天天日| 丁香六月天之亚州热女| 欧美啪啪9| 婷婷香五月天| 91嫩草国产线观看亚洲一区二区| 99精品视频推荐| 99ri视频| 天天色天天色天天色天天色天天色| 五月天婷婷在线观看| 手机旧版看人妻1025| www狠狠| 成人做爰黄A片免费看直播室男男| 久久久五月天婷婷| 337p大胆噜噜噜噜噜91Av| 台湾综合丁香五月蜜桃| 无码人妻一区| 色五月五月婷婷| 99热草草| 91狠狠综合久久| 六月丁香婷婷色综合| 五月婷婷之综合激情| 9999久久久久| 久久曰9| 欧美色色色色色| 五月丁香成人| 91人人爽狠狠狠| 丁香五月天AV在线 | 97人人射| 在线成人国产| 日本的α片xxxwww| 婷婷丁香五月色| 色婷婷五月在线| 色吧网综合| 97久久久| 成人丁香五月| 北京熟妇搡BBBB搡BBBB| 182TV亚洲| 丁香婷五月| 91丁香五月| 第四色在线观看| 2016日日夜夜操| 五月丁香色五月| 九九视屏| 欧美精品狠狠色丁香婷婷| 久久久久久综合88| 五月天激情国产综合婷婷| 亚洲成人免费在线| 97资源碰碰| 99综合免费视频| 亚洲精品婷婷| 98色花堂98t.R| 校园激情 亚洲| 91精品丝袜久久久久久| 综合超碰熟| 色丁香综合影院| 成人国产综合| 丁香花操逼| 五月丁香久久综合精品| 九九亚洲| 五月色婷婷影院| 婷婷五点亚洲| 激情内射人妻1区2区3区| 丁香五月色色| 激情九色| 久久码久久无清| 影音先锋 91工厂| 在线观看中文字幕| 国産精品| 色综合久久88色综合天天看| 五月激情久久| 天天插天天干天天舔| 久久五月丁香| 久婷| 五月丁香好婷婷A片网| 狠狠色中色| 五月激情开心婷婷| 午夜丁香| 五月天天天综合| 99久久婷婷国产综合| 国产AV不卡福利| 狠狠色综合网站久久久久| 免费超碰在线观看| 天天爽曰日爽| 日本不卡高字幕在线2019| 天天干,天天舔| 国产操碰| 亚洲无码成人| 九九婷婷综合| 丁香五月婷婷偷拍| 丁香婷婷激情| 精品亚洲日韩99欧美片| 色99在线观看| 天天干天天操天天射| 六月丁香VA| 丁香五月婷婷激情蜜桃| 思思精品热在线| 欧美色激情四射| 婷婷五月天视频在线观看| 这里只有精品视频在线| 另类综合激情| 丰满少妇乱A片无码| 久热2025无码| 精品人妻午夜一区二区三区四区| 天天操天天操综合| 久久您您综合网| 丁香五月第四色88| 亚洲综合色激情色五月| 曰日爽日日操| 97碰碰视频| 在线观看婷婷5月| 99久久97久久欧美综合网| 第四色五月婷婷| 久99久在线观看| 婷婷精品在线| 丁香五月天AV在线| 熟女人妻一区二区三区免费看| 99高级会所久久| 国产精品a无线| 丁香五月婷婷激情123| 五月激情四射网站| 亚洲色视频| 久一网站| 色婷婷av在线观看| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 国产操碰| 99无码精品| 激情久久天天| 97久久超视频| 99色热视频| 九九九这里只有精品| 色区久久| 五月婷婷人妻| 99在线精品视频| www色五月| 678五月丁香亚洲综合| 精品人妻在线免费观看| 俺去也综合| 五月丁香六月香香蕉| 久久激情视频| 婷婷五月成人系列| 日本久热| 精品国产AV色一区二区深夜久久| 五月激激激情综合网| 久久久宗合| 色色五月婷| 亚洲婷婷激情888精品久| 亚洲成片在线观看| 激情综合一| 五月天婷婷黄色| 超色欲天天| 99热精品免费| 久久免费婷婷视频| 99人人干| 亚洲操女| 色综合色综合网| 青青草蜜臀| 九九中文字幕九| 五月天精品视频| 婷婷激情六月天视频| 91青娱乐青青草| 婷婷六月激情丁香| 视频1区2区| 操碰97| 日本va欧美va欧美精品88| 99精品久久久久久久婷婷| 色伦专区97中文字幕| 五月婷婷婷丁香播| 五月激情网五月综合网| 激情文学第四色婷婷丁香五月| 色五月综合| 99热.com| 26UUU成人网| 激情性爱网站| 图片区 小说区 区 亚洲五月 | 99这里只有精品99| 天天日天天做天天舔| 99久热在线精品99re6热| 99热这里全是精品| 丁香六月婷婷综合啪啪| 亚州激情网| 五月天婷综合| 激情婷婷丁香| 五月婷婷六月激情| 天天插天天干| 3www激情| 天天干天天日天天插| 精品亚洲国产成AV人片传媒| 国产在线激情视频| 久久这里只精品| 播五月丁香三月婷婷| 五月天欧美 另类小说| 五月天婷综合| 5Www色5夜| 国产这里只有精品| 色色激情网| 热思思| 欧美综合激情五月丁香| 久九色| 婷婷综合九月| 久久XX日本综合| 日韩成人精品中文字幕| 亚洲第一黄网| 天天日天天舔| 婷婷综合精品视频97| 777.色色| 久久久久妻| 欧美激情中文字幕| 91碰九色| 欧美精品狠狠色丁香婷婷| 99精品网| 思思久久99| 99九九精品视频| 丁香婷婷五月| 丁香五月婷婷手机| 99re这里只有精品在线观看| oVV4WIB3vFi8D| 日本欧美成人片AAAA| 色综合色五月| 一区二区免费看| 综合色色色| 婷婷五月18永久免费视频| 丁香婷婷六月激情| 都市激情蜜桃婷婷五月天| 91九色在线| 色婷婷综合亚洲| 99久热精品在线| 二区成人视频| 日韩AV在线电影| 狠狠ri| 乱乱av| 久久人妻熟女一区二区| 伊人激情AV一区二区三区| 婷婷五月天小说| 天天干狠狠| 丁香六月婷婷| 99视频在线| 99久久网站| 激情五月色婷婷| 99热亚洲精品| 91精品综合久久久久久五月丁香| 五月天激情啪啪| WWW.桔色成人.COM| 99久久er| 丁香五月在线看| 五月草影视| av免费人人| 婷婷色成人| 综合图区激情| 欧州色色| 丁香六月欧美| 色综合另类| 久久98热re| 91婷婷色 | 人人操av| 亚洲亚洲人成综合网络| 丁香五月花| 色色亚洲99com| 182无码| wwww.9免费视频| 婷婷五月天首页激情| 久久青草国| 色婷六月| 97碰久久| www。88热在线视频免费观看| 69堂午夜视频最新地址| 色色色.com| 婷婷五月开心中文字幕在线| 婷婷五月天小说网| 欧日韩成人| 欧美日韩五月婷婷| 九九激情综合| 色色色精品无码区| www.亚洲激情| 免费观看的av| 婷婷99狠狠躁天天躁| 高清无码网址| 2025超碰| 婷婷丁香综合在线| 色婷| 久久性爱视频免费| 婷婷色爱| 99色精品| 疯狂做受XXXX高潮A片| 在线播放人妻| 五月婷婷丁香啪啪| 五月丁香六月色婷| 精热在线综合网| 亚洲十月婷婷综合| 婷婷五月六月| www.夜夜操.com| 久久小说网| 97干在线看| 婷婷导航| 激情五月四色| 91黄操| 国产AV一区二区三区最新精品 | 婷婷五月俺要去| 99热这里只有精品最新网址| 五月丁香啪综合| 99国产精品白浆在线观看免费| 91聚色综合网| 婷婷丁香五月色偷偷| 青草网在线观看| 天天日天天做天天操| 性色婷婷| 国产特级毛片AAAAAAA高清| 色五月婷婷天堂| 久热超碰| 色五月激情五月天| 操骚货在线| 久久综合九色综合88i| 欧美色久| 五月婷久久在线| 综合另类视频| 亚洲va久久久噜噜噜久久天堂| 99热在线资源| 色情播放| 久久久久久激情| 操97在线观看| 日本久久99| 综合网视频| 97人人干人人操| 亚洲一级AV在线免费播放| 五月天激日本色情在线| 天堂综合久久| 久久人妻少妇嫩草AV| 久久精品婷婷| 欧美色爱五月天| 成人丁香五月天| 国内久久婷婷| 九九成人精品免费视频| 五月丁香婷婷成人网| 色色婷婷综合网| 婷婷五月丁香久久| 丁香五月玖玖| 狠狠婷婷爱| 久久丁香五月| 五月天激情亚洲| 五月欧美色播| 婷婷午夜激情| 国产人人操| 99热99精品在线观看| 婷婷性爱网| 久久婷婷六月综合综合| 婷婷丁香六月影视| 五月天大香蕉| 4399欧美另类视频| 性生活久久人妻| 婷婷五月天综合网| 色色免费网站| 色丁香五月| 999热这里只有美国精品| 亚洲精品乱码久久久久久按摩观| 色欧美影院| 国内自拍97在线| 日韩五月天婷婷| 五月婷婷综合激情网| 99在线视频女女视频| 丁香婷婷啪啪啪| 99这里只有精品| 97久久久久| 六月婷婷啪啪| 98热精品| 婷婷五月天狠狠搞干| 国产毛片精品一区二区色欲黄A片| 永久无码色| 成人综合AV| 九九青草热| 五月婷婷香| 开心久久网婷婷| 五月色欧洲| 202丰满熟女妇大| 在线视频另类| 日韩成人中文字幕| 99碰碰碰| 一级操逼内射在线视频| 少妇高潮A片无套内谢麻豆传| 97福利视频| 俺去也五月天婷婷| 国产成人av在线| 亚洲综合网 665566| 特级操b片| www.色婷婷.com| 色色婷婷丁香五月天| 天天搞天天爽| 伊人影院久久网| 国产在这里只有精品| 激情国产五月| av操一操| 婷婷五月天丁香久久| 色婷婷久久综合中文久久一本| 日本性视频| 婷婷干五月综合在线播放| 亚洲xx在线| 99热中文字幕久久| 久久九九热re6这里有精品| www.色五月天.com| 99色在线观看视频者| 五月婷婷色激情| 丁香五月婷婷影视先锋| 六月丁香五月天| 日逼影音先锋AV男人资源站| 日本高清综合网五月丁香| 91操在线| 噜噜精品| 中文字幕AV网址| 久热99| 久思思久视频| 9久久狠狠的| 天天干肏夜夜| 99久久色| 99色在线视频| 色色五月婷| 五月 丁香 欧美| 色五月美女| 国产在这里只有精品| 外国碰视频网站97| 久久综合丁香激情五月| 色必久悠悠影院| 婷婷中合| 97色色色| 亚洲婷婷久久综合| www狠狠| 六月婷婷国产| 91在线观看www| 在线网黄| 久久er这里只有精品| 亚洲视频一区| www夜夜操com| 九九久久五月天| 色色99| 色色哒五月婷婷六月丁香| 国产免费一区二区三州老师F1F1……| 久久精品视频99| 丁香五月自拍| 99精品久| 色五月在线观看| 五月婷婷激情色情网| 九九久久精品國產| 五月丁香啪啪啪| 婷婷综合网伊人| 91久草五月天婷婷| 26uuu成人网| 六月婷色六月| 97在线/亚洲| 婷婷五月天伊人| 丰满熟女人妻一区二区三| 九月色婷婷综合| 99精品在线观看| 丁香婷婷视频在线| 五月综合激情图片 | 久热九九| 国产精品五月丁香| 热久久色| 五月天综合在线| 新精品99| 五月丁香啪啪啪| 羞羞嫩草视频| 婷色五月| 天天檫天天爽| 我爱大香蕉| 在线视频区| 91久久久久久久久| 婷婷五月天激情综合| 蜜桃婷婷狠狠久久综合| 激情五月综合网| 五月婷婷六月丁香激情| 色婷婷婷av| Caoub青青超碰| 色999五月色| 综合色五月| 天天爽天天日人人爱| 久久R激情| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 成人一级片| 这里只有精彩视频| 99热超| 激情五月色综合| 奇米色大香蕉| 五月激情婷婷开心| 欧美一级毛卡片无码| 丁香婷婷六月天| 丁香婷婷激情| 国产阿姨日皮艹逼内射视频| 五月丁香六月情| 噜噜色五月| 天天干天天干天天干| 五月婷婷中字在线| 五月丁香影院| 夜夜骑日日夜夜| 丁香五月亚洲综合丝袜| 人人人操97| 91传媒无码人妻精| www.99成人视频| 亚洲AV无码成人精品电影| 五月丁香婷婷六月| 久久在线92| 丁香婷婷影院| www.久久久久久久| 成年人丁香五月| 婷婷 久综合| 亚洲日韩乱码一区二区三区四区 | 成人网在线视频| 激情五月综合网最新| 超碰人人干| 色玖玖| 婷婷深爱五月亚洲综合| 超碰婷婷五月| 激情五月婷婷视频一区二区三区| 欧美操综合| 大香蕉五月丁香| 色亚洲无码| 日本色色色色色色色色一色二色| 婷婷丁香五月亚洲综合网在线视频观看| 九热网站| 日本色色网站| 九九色热| 天天日天天肏天天奸| 五月婷婷久草在线视频综合| 91嫩草久久| 综合网天天| 呦呦v线| 丁香六月色| 五月丁香婷婷在线| 丁香婷婷少妇| 精品国婬伦V无码久久久| 人妻啪啪啪| 丁香婷婷久久| 色情终和网| 日熟女| 秋霞黄色一级久久| 色综合激情图区| 五月婷婷成人| 中海油常州环保涂料有限公司| 爱久久小说下载网| 国产在这里只有精品| 9.1综合网| 色婷婷五月天| 丁香六月成人| 免费国产VA国产免费| 97人碰人操| 久久久99视频| 国产日批视频免费播放| 碰久久精品w| 激情五月天在线视频| 丁香六月婷婷色XXXX| 狠狠色噜噜狠狠| 九月丁香| 超碰a女人的天堂| 婷婷在线午夜| 五月天婷婷綜合院| 大香伊人久色| 欧洲不卡视频| 婷婷久久亚洲| 欧日韩AV| 99在线热视频| 丁香五月欧美婷婷综合| 色天堂A| 婷婷开心激情综合五月天| 日韩综合网络男女香蕉a片| 午夜天堂一区人妻| 91一起操| 五月婷婷之美女图片| 五月丁香A片| 婷婷玖玖丁香| 国产毛片精品一区二区色欲黄A片| 色婷久九| 六月激情婷婷色| 性爱五月丁香| 国成人网| 午夜不卡久久精品无码免费| 五月天综合激情网| 五月色婷婷在线观看| 久久在线大香蕉| 色综合99无码 | 四虎成人精品永久免费AV九九| 久热99中文字幕| 精热在线综合网| 久久99久久久久久久噜噜| 色九九综合| 色婷婷大香蕉| 婷婷五月综合网| 五月婷久久| 婷婷久久综合久| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 激情五月丁香激情综合网| 97人人操在线| 99久久五月丁香野外| 天天干天天av天天射| 婷婷色六月| 97AV在线视频| 久久这里只有精品99| 五月亭亭综合五码| 丁香五月狠狠综合欧美| 日韩成人精品中文字幕| 婷婷五月综激情| 野外99热| 婷五月天| 拍色综合| 婷婷香草网| 欧美精品中文字幕亚洲专区| 亚洲天堂99| 97在线精品| 色五月超碰| www.激情五月| 丁香五月天色婷婷| 色婷婷丁香五月在线观看| 99热这里只有精品2016| 天天干天天日天天插| 开心深爱五月天| 色五月婷婷久久| 婷婷综合五月| yirenjiqingshiping| 这里只有精品96| 日韩AV在线影片| 亚洲亚洲人成综合网络| 国产成人一区二区三区在线观看| 99在线精品观看99| 狠狠色噜噜狠狠狠狠综合| 色播五月婷婷| 伊人婷婷五月天| 亚洲热久久| 另类小说五月天| 九九精品免费| 激情五月天色色| 乱岳熟女50岁| 国产高潮A片羞羞视频涩涩| 一点色成人网| 九月婷婷在线视频| 九九伊人网| 五月综合久久| 日本黄色三级片内射| 欧美熟女视频 色婷婷| www.金莲av| 婷婷五月娱乐在线| 97碰免费精采视频| 亚州操逼网| 久热成人| 色色色在线播放| 69五月天视频| 99热在线观看亚洲区| 深爱五月激情| 丁香激情网| 国产99热| 免费看欧美成人A片无码| 青柠影视免费高清电视剧| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 97五月天婷婷午夜| 日韩av干| 丁香五月婷婷在线观看| www婷婷| 东京热免费视频| A片试看50分钟做受视频| 色色色色欧美| 狠狠色狠狠爱| 婷婷六月色| 人人舔人人色人人高潮| 婷婷久久亚洲| 97干欧美| 色婷婷综合网站| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 国产一级片| 国产色色色色色| A片一曲| 99热6这里只有精品6| 激情网综合| 一区视频网站| 五月丁香激情综合| 九九久久久综合| 激情九月婷婷| 五月丁香综合久久| 五月天色丁香| 九九热精品| 婷婷丁香激情五月天色色色| 五月天狠狠色| 婷婷色无码| 五月天激情无码| 九月色婷婷| 伊久大香蕉| 色情五月婷| 天天插天天很| 久久精品系列| 超碰在线看| 十区av| 思思热99er在线视频| 国产午夜精品久久久观看| 日日爽日日| 欧美三级视频| 91色在线/日韩| www.狠狠干com| 九九色欲网| 日日躁夜夜躁狠狠久久AV| 天堂久久婷婷| 五月婷六月天| 五月婷婷丁香大陆免费| 亚洲狠狠爱婷婷| www超碰| 婷婷五月天手机版视频| 久久伊人婷婷| 婷婷六月香| 久久久久妻| 色色性爱视频| 99噜噜噜在线播放| 欧洲综合视频| 亚洲中字AV电影在线网站| 91偷拍视频| 五月婷六月天| 色婷五月天| 婷婷五月精品中文字幕| 偷拍九九热| 六月婷婷色综合| 久久er99热精品一区二区| 色开心五月婷婷丁香HD| 久久五月天合网| 久久婷婷国产| 婷婷丁香91综合| 婷婷四月 成人 狠狠干| 热久精品| 日本三级成人秘书精品片| 91久久婷婷| 这里只有精品视频| ztEJj| aⅤ79成人片| 色五月成人| 婷婷丁香六月天激情四射网| 九九综合视频在线观看| 欧美va在线观看| 色天使久久综合| 99热日本| 人妻久久久久久久| 色婷婷综合亚洲| 色婷婷久久综合久色综| 国产FREESEXVIDEOS性中国| 99人人干| 成人 视频免费观看网站| 激情五月婷婷她| 婷婷五月精品在线| 亚洲另类电影| 婷婷色亚洲| 天天综合五月| 91人碰| 亚洲热视频在线| 综合色在线| 天天插夜夜爽| 天天做天天爱| 天天操天天曰天天射| 人。妻久久| 日韩有码一区| 久热A| 99人妻碰碰久久久禁片| 天天摸天天舔天天爽| 大香蕉520| 99久视频| 色欧洲| 久热这里只有国产| 色婷婷视频在线| 色五月婷婷综合| 97碰| 天天搡日日搡aaaaⅩ| 五月丁香六月婷婷啪啪| 99久久精彩视频| 极品另类| 大香线蕉伊人| 99人妻碰碰碰久久久久视| 99免费偷拍视频| 丁香五月欧美色综合| 亚洲 欧洲 国产 伦综合| 日日操天天操| 4399人妻无码久久久| 久99久在线| 97资源碰碰| 99无码视频| AV天堂淫乩| 夜精品无码A片一区二区蜜桃| www..com色爱| 爆乳熟妇一区二区三区四区| 米奇影视五月天| a免费在线| 99乱视频| 五月婷婷影| 亚洲天堂aaaa| 4399在线观看免费高清黄色视频| 大香蕉婷婷久久| 婷婷大香蕉| 国产成人亚洲综合A∨婷婷| 色综久久久| 婷婷五月天国产传媒| 夜夜噜夜夜奇| 五月天久久色| 欧美成人A片AAA片在线播放| 色婷婷综合影院| 婷婷射综合| 婷婷六月丁香在线| 婷婷色情 | 综合久久五月天| 四月婷婷五月丁香| 激情久久久| 人妻久久久久久久久妻久久久久| 日本色色视频| 狠狠色狠狠操| 五月丁香六月婷综合成人综合| 色爱综合网| 色五月成人婷婷| 男人的天堂婷婷色五月| 九九99久久| 五月开心婷婷极品激情| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 久久九九@| 婷婷五月天久久| 亚洲一区二区无码蜜乳av| caopeng97人人| 激情五月婷| 久色中文| 黄网在线观看免费| 丁香五月色情| 五月丁花六月丁香综合| 色情婷婷。| 色优久久| www.国产色| 综合亚洲六月婷婷在线| 99国产精品久久久久久久久久久| 无码 色| av在线资源| 亚洲精品第一国产综合亚AV | 激情深爱五月天| 六月丁香影院| 日本三级日本三级99| 久久婷婷五月综合色区| 天天操B| 无码激情精品色婷婷久久久久| 色综合香蕉| 国产午夜精品AV一区二区麻豆|