99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

TransactionTemplate實戰(zhàn):Spring編程式事務的靈活控制之道

TransactionTemplate實戰(zhàn):Spring編程式事務的靈活控制之道 我個人的經(jīng)驗里很多人對 Spring 事務的第一印象都是 Transactional 注解寫起來確實方便一行注解把事務邊界劃得清清楚楚。但它的問題也恰恰藏在方便里——事務的開啟、提交、回滾全都被框架接管了遇到需要精細控制事務邊界的場景比如一次業(yè)務里要分階段提交、要在一個事務里執(zhí)行多個回調、要把多個事務操作組合編排Transactional 就有點使不上勁。這時候就該 TransactionTemplate 登場了。TransactionTemplate 是 Spring 提供的編程式事務管理模板核心思路是把事務生命周期管理封裝起來但把控制權交還給你通過回調機制把事務邊界變成一段可執(zhí)行的代碼塊。簡單說它解決的是 Transactional 沒法覆蓋的場景動態(tài)事務邊界、條件提交、細粒度回滾、事務內多步驟編排、以及更復雜的嵌套事務組合。適合在支付回調、批量任務、消息消費、異步處理這類需要精細控制事務行為的業(yè)務里使用。這篇文章會從原理到實戰(zhàn)拆一遍 TransactionTemplate包括它和聲明式事務的底層關系、核心 API 的完整走讀、事務屬性怎么配、嵌套事務怎么玩、以及在真正落地的時候會踩哪些坑。雖然是一個比較老的類但我在近期幾個項目里實測下來它依然是處理復雜事務場景最可靠的方案之一。1. 先搞清楚一個問題為什么有 Transactional 還不夠1.1 聲明式事務的管理模型Transactional 是聲明式事務的入口它的底層是通過 AOP 代理在方法調用前后織入事務邏輯??蚣茉诜椒ㄩ_始時開啟事務方法正常返回時提交拋出異常時回滾開發(fā)者不需要寫任何事務代碼。這個模型的核心是方法即事務邊界——一個 public 方法的執(zhí)行過程對應一個完整的事務生命周期。這個設計在絕大多數(shù)場景下是合理的。比如一個下單流程從扣庫存到寫訂單表整個方法就是一個事務要么全部成功要么全部不成功。但在實際項目里業(yè)務永遠比理想模型復雜。我遇到過幾個典型的場景聲明式事務處理起來很別扭第一種事務邊界需要動態(tài)變化。比如一個批量對賬任務要遍歷幾千條差異記錄每條記錄獨立的更新操作我希望每條記錄單獨一個事務某條失敗只回滾它自己不影響整體進度。用 Transactional 放方法上所有記錄共用一個事務失敗一條全部回滾。拆成多個方法再通過外層調用來隔離事務代碼會零散得沒法看。第二種事務中間需要人為干預。比如某個網(wǎng)關同步任務落庫之后要調一個外部系統(tǒng)對方返回結果來決定整個事務要不要提交。Transactional 只有在方法異常時才回滾沒法在正常流程里主動說等一下我覺得這筆賬不對別提交了。第三種事務內需要多次組合編排。比如一個復雜的賬戶遷移任務先查一批數(shù)據(jù)做一部分更新稍作邏輯判斷后再更新另一批數(shù)據(jù)每一步之間的事務狀態(tài)是連續(xù)的而且中間可能需要根據(jù)狀態(tài)決定是繼續(xù)還是終止。這不是一個簡單的方法內順序執(zhí)行而是事務控制的編排邏輯。這些場景的共同點是事務邊界經(jīng)常變化或者事務流程不可固定——聲明式事務的靜態(tài)邊界限制了大展拳腳的空間而 TransactionTemplate 正是為這類場景設計的。1.2 TransactionTemplate 的事務管理模型通過回調來控制生命周期TransactionTemplate 的事務模型從根本上就不一樣。它實現(xiàn)的 TransactionOperations 接口核心就一個方法public interface TransactionOperations { T T execute(TransactionCallbackT action) throws TransactionException; }這里的核心思想是模板方法 回調。框架幫你處理事務的開啟、提交、回滾、異常處理這些樣板代碼但你通過 TransactionCallback 接口把業(yè)務邏輯塞進去public interface TransactionCallbackT { T doInTransaction(TransactionStatus status); }在這個回調方法里你拿到的 TransactionStatus 對象就是你在事務里的控制手柄。這個對象可以做幾件事調用 setRollbackOnly() 主動標記事務回滾即使業(yè)務代碼沒有拋異常檢查當前事務狀態(tài)比如 isNewTransaction()、isRollbackOnly()了解當前事務處于什么階段在嵌套事務場景里協(xié)調不同層級的事務行為。所以整個模型就變成你定義事務邊界里要做的所有事回調框架按圖索驥把事務生命周期管理好模板。事務什么時候開始、什么時候提交、什么時候回滾都在這段代碼塊的范圍里而這個范圍是你自己在運行時動態(tài)定義的。1.3 模板與回調模式讓事務控制變得靈活可控模板方法模式把這個靈活性的價值發(fā)揮得淋漓盡致。你可以把事務的開啟、提交、回滾想象成一個流程框架比如烤肉店里客人下單 — 后廚備菜 — 上桌 — 結賬。模板要解決的是怎么把晚餐流程穩(wěn)定跑完而回調是今天晚上這一桌客人具體吃什么??蚣懿糠譄o論誰來吃都是同樣的流程菜品的差異全部封裝在回調里而你可以隨時決定這道菜不做、換成別的。TransactionTemplate 把事務相關的樣板代碼全部收編業(yè)務代碼只需要專注在這個事務里做什么剩下的邊界、狀態(tài)管理、資源清理全部由模板保證。最常見的對比是這樣的// 傳統(tǒng)的手動事務管理 Connection conn dataSource.getConnection(); try { conn.setAutoCommit(false); // 執(zhí)行業(yè)務代碼... conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); conn.close(); }跟上面的代碼相比下面的寫法要清爽得多而且還能利用 Spring 管理的資源、統(tǒng)一異常處理機制、以及嵌套事務的協(xié)調能力transactionTemplate.execute(status - { // 執(zhí)行業(yè)務代碼... return result; });在真實項目里這種模板化帶來的可維護性收益在業(yè)務復雜之后會非常明顯地體現(xiàn)出來。2. 核心 API 與行為機制TransactionTemplate 的底層邏輯2.1 TransactionTemplate 本身如何完成事務管理TransactionTemplate 是一個類它自己并不直接操作數(shù)據(jù)庫連接而是依賴 Spring 事務機制里的 PlatformTransactionManager。初始化它的時候你需要給它設置一個事務管理器Configuration public class TransactionConfig { Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) { TransactionTemplate template new TransactionTemplate(); template.setTransactionManager(transactionManager); return template; } }DataSourceTransactionManager 是 JDBC 層面的實現(xiàn)負責 DataSource 上連接的獲取、提交、回滾。如果你用的是 JPA需要配置 JpaTransactionManager如果同時操作多個數(shù)據(jù)源用 JtaTransactionManager 或者分布式事務方案。TransactionTemplate 本身是與具體數(shù)據(jù)源技術解耦的它只依賴 PlatformTransactionManager 接口約定的事務生命周期。關鍵點在于 execute 方法執(zhí)行的完整流程拆開看大概是這樣的根據(jù)設定的傳播行為事務管理器決定是新建一個事務還是加入已有事務如果新建事務把數(shù)據(jù)庫連接綁定到當前線程自動提交關閉執(zhí)行回調里的業(yè)務代碼拿到返回值如果業(yè)務代碼拋出運行時異常并且沒有被標記為不回滾事務管理器執(zhí)行回滾如果業(yè)務代碼正常返回或者拋出的異常被標記為提交前不可回滾比如業(yè)務上主動 setRollbackOnly 后又想繼續(xù)事務管理器決定提交或回滾最后清理事務資源、恢復自動提交狀態(tài)、把連接釋放回連接池。這里有個容易忽略的技術細節(jié)TransactionTemplate 在事務管理過程中主要依據(jù)回調拋出的異常類型來判定是否回滾。默認情況下它是遇到 RuntimeException 和 Error 就回滾遇到受檢異常不回滾。這個默認行為繼承自 Spring 事務管理的整體設計——因為受檢異常在方法簽名中顯式聲明通常是為了捕獲后做補償或重試而不是為了回滾。讓我用一個實際場景來解釋這個機制的價值。比如一個銀行轉賬接口轉出方扣款成功之后轉入方入賬失敗正常情況下應該整筆回滾。但如果異常已經(jīng)被外層捕獲并轉換成了受檢異常Transactional 默認不會觸發(fā)回滾。而用 TransactionTemplate 的話由于你是直接在回調里控制狀態(tài)可以更明確地指定什么情況必須回滾??匆欢胃咏鎸崢I(yè)務的代碼public TransferResult transfer(TransferCommand command) { return transactionTemplate.execute(status - { try { accountService.debit(command.getFromAccount(), command.getAmount()); accountService.credit(command.getToAccount(), command.getAmount()); return new TransferResult(true, success); } catch (AccountNotFoundException e) { status.setRollbackOnly(); return new TransferResult(false, e.getMessage()); } catch (Exception e) { status.setRollbackOnly(); // 如果希望受檢異常也導致回滾需要在這里顯式處理 throw new RuntimeException(e); } }); }這段代碼里catch 到的受檢異常 AccountNotFoundException 本身不會自動觸發(fā)回滾但通過顯式調用 status.setRollbackOnly()事務依然被標記為回滾同時能返回一個結構化的業(yè)務結果而不是把異常直接拋出去讓上層還要做一層異常處理。這就是編程式事務比較適合做 API 類接口落到 DB 操作的場景的原因——事務回滾的決定權和業(yè)務返回結構是統(tǒng)一的。2.2 事務傳播行為與 TransactionTemplate 的搭配玩法事務傳播行為Propagation是 Spring 事務模型里比較繞的一部分但跟 TransactionTemplate 搭配起來非常自然。TransactionTemplate 可以通過 setPropagationBehavior 來設定事務邊界與當前存在事務之間的關系TransactionTemplate template new TransactionTemplate(txManager); template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);常用傳播行為對照傳播行為語義典型場景PROPAGATION_REQUIRED當前有事務則加入無則新建大多數(shù)業(yè)務默認行為PROPAGATION_REQUIRES_NEW掛起當前事務新建一個獨立事務日志記錄、審計、操作記錄PROPAGATION_NESTED當前有事務時使用 Savepoint無則新建分段回滾部分失敗只回滾子段PROPAGATION_SUPPORTS當前有事務則加入無則以非事務方式執(zhí)行只讀查詢、非關鍵輔助操作PROPAGATION_NOT_SUPPORTED始終以非事務方式執(zhí)行掛起現(xiàn)有事務事務中有非事務性操作如大文件操作PROPAGATION_MANDATORY必須有現(xiàn)有事務無則拋異常強約束某些操作必須在事務內PROPAGATION_NEVER絕不能有事務有則拋異常事務里不能執(zhí)行的特定操作這里值得展開的是 NESTED它跟 REQUIRES_NEW 經(jīng)常有人混淆。REQUIRES_NEW 的特點是徹底隔離它新建一個完全獨立的事務跟外部事務互不影響。外部事務回滾不影響內部事務已經(jīng)提交的數(shù)據(jù)內部事務回滾也不影響外部事務待提交的數(shù)據(jù)。這聽起來很省事但代價是物理上開了兩個數(shù)據(jù)庫事務連接占用、鎖等待、性能消耗都會增加。NESTED 則完全不同它是基于 Savepoint 的嵌套。如果外部事務存在NESTED 事務會在當前事務里創(chuàng)建一個 Savepoint內部業(yè)務如果回滾只回滾到 Savepoint 位置外部事務仍然可以繼續(xù)。這個語義像把事務切了幾段某一段壞了只重做這一段。它是邏輯上的嵌套而不是另開一個物理事務。場景差異就很明顯了。比如一個報表任務先匯總一筆總賬寫到匯總表再寫大量的明細記錄。明細中偶發(fā)一條數(shù)據(jù)格式錯誤我希望只回滾出錯的那段明細不動總賬還要繼續(xù)處理后面幾條用 NESTED 比較合適。但如果是寫審計日志要求不管主流程成不成功日志一定留下來那就得用 REQUIRES_NEW因為日志事務必須脫離主事務的生命周期。需要注意的是NESTED 依賴底層數(shù)據(jù)庫的 Savepoint 支持在 MySQL 的 InnoDB、PostgreSQL、Oracle 上都能正常工作但如果你用的數(shù)據(jù)庫不支持 Savepoint比如某些老版本 MyISAM它會在運行時拋異常。所以選 NESTED 之前先確認數(shù)據(jù)庫能力。在 TransactionTemplate 上設置傳播行為之后配合不同的回調組合就能很靈活地控制嵌套事務。比如外層一個 template內部某段業(yè)務又注入另一個配了 REQUIRES_NEW 的 template那這段業(yè)務會單獨事務執(zhí)行。2.3 隔離級別、超時與只讀TransactionTemplate 三個容易被忽略的屬性TransactionTemplate 除了傳播行為還可以設置事務的隔離級別、超時時間、是否只讀。這幾個屬性在實際項目中經(jīng)常被漏配但其實都很有用。隔離級別事務隔離級別解決的是并發(fā)下數(shù)據(jù)可見性的問題。TransactionTemplate 支持標準的五個級別DEFAULT使用數(shù)據(jù)庫默認隔離級別MySQL 默認是 REPEATABLE_READREAD_UNCOMMITTED能讀到未提交數(shù)據(jù)可能會臟讀READ_COMMITTED只能讀到已提交數(shù)據(jù)解決臟讀REPEATABLE_READ同一個事務里多次查詢結果一致解決不可重復讀SERIALIZABLE完全串行化解決幻讀但性能影響很大。數(shù)據(jù)庫并發(fā)場景不同選法也不同。比如一個統(tǒng)計報表任務讀多寫少用 REPEATABLE_READ 就能保證一次事務里多次查詢看到的快照一致如果要做賬務核對類操作精度要求高的話就要考慮 SERIALIZABLE但要衡量對并發(fā)性能的影響。在 TransactionTemplate 上設置隔離級別template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);超時時間事務超時是針對事務內所有數(shù)據(jù)庫操作耗時總和的約束。設置之后如果超過時間限制Spring 會讓事務回滾并拋出異常。默認超時是 -1表示使用底層數(shù)據(jù)源的默認值或不設限制。這個屬性在長時間運行的批處理任務、運營后臺的 Excel 導入里很有用。沒有超時約束時如果數(shù)據(jù)庫鎖等待時間過長事務會一直占著連接連接池耗盡之后整個應用就假死了。設一個合理的超時時間比如 30 秒就能在事務卡住的時候快速失敗并釋放連接。template.setTimeout(30); // 單位秒但要注意一點這個超時是通過 JDBC 層的定時檢查來實現(xiàn)的如果在事務里有一個特別耗時的第三方調用那是不會被這個超時約束的。它只約束數(shù)據(jù)庫操作自身的時間。只讀事務把事務標記為只讀可以讓數(shù)據(jù)庫優(yōu)化器做一些查詢路徑上的優(yōu)化在 MySQL 里主要是提示服務器不產(chǎn)生讀鎖寫日志等開銷同時也是一種語義約束——在只讀事務里發(fā)生的寫操作通常會在提交階段報錯。在查詢類任務里把事務標記為只讀配合 REPEATABLE_READ 隔離級別能減少不必要的開銷。比如template.setReadOnly(true);要注意的是如果這個對象還被復用于寫操作那就不能設置只讀否則后續(xù)的寫操作會出問題。因此模板如果是被多個業(yè)務共享的建議針對不同用途配置多個 TransactionTemplate 實例而不是一個模板走到底。2.4 使用 TransactionCallbackWithoutResult 簡化無返回值場景TransactionTemplate.execute 需要返回一個值但很多時候我們只是在事務里執(zhí)行更新不需要返回任何對象。Spring 提供了一個子接口 TransactionCallbackWithoutResult它把返回值定義為 void執(zhí)行完成之后模板自動提交或者根據(jù)異?;貪L。transactionTemplate.execute(new TransactionCallbackWithoutResult() { Override protected void doInTransactionWithoutResult(TransactionStatus status) { orderDao.updateStatus(orderId, OrderStatus.PAID); accountDao.incrementBalance(userId, amount); } });使用 Lambda 表達式可以更簡潔transactionTemplate.executeWithoutResult(status - { orderDao.updateStatus(orderId, OrderStatus.PAID); accountDao.incrementBalance(userId, amount); });代碼里的 executeWithoutResult 是 TransactionOperations 接口的 default 方法內部會把回調包裝成 TransactionCallback返回 null然后模板統(tǒng)一處理事務生命周期。這個寫法適合那些通知一下、更新幾個字段、不需要拿返回值的事務操作可以讓業(yè)務方法表達出真實意圖——我不關心返回值只要這段代碼在一個事務里執(zhí)行。2.5 編程式事務 vs 聲明式事務怎么選才合適很多團隊會有這種討論到底是用 Transactional 還是 TransactionTemplate我的結論是不是二選一而是看事務邊界的可預測性。事務邊界固定整個方法就是事務方法結束即事務結束那就用聲明式 Transactional代碼最簡潔意圖最清晰。事務邊界動態(tài)需要根據(jù)運行時的數(shù)據(jù)、狀態(tài)或者外部調用結果來決定事務怎么結束那就用 TransactionTemplate。事務粒度細分一個業(yè)務里需要多次獨立事務、嵌套事務、分段提交那也適合用 TransactionTemplate。新舊代碼混合老項目里已經(jīng)有聲明式事務新加的功能又需要更靈活的控制可以在同一個服務里混用只要互相清楚各自的事務邊界。我實際看到過一種比較推薦的做法是在 Service 層定義一個注入的 TransactionTemplate用它來完成所有需要編程式事務控制的方法其他地方保持 Transactional 做透明事務。兩者職責分開不會互相干擾。3. 深入事務狀態(tài)對象TransactionStatus 背后的設計思想3.1 TransactionStatus 能做什么回調里拿到的 TransactionStatus 接口定義了幾個關鍵方法public interface TransactionStatus { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted(); }逐個說isNewTransaction()當前事務是否是新建的。如果因為傳播行為加入了外層已有事務這個方法返回 false。這個判斷在嵌套編排里特別有用——如果你需要一個獨立事務但發(fā)現(xiàn)自己是在外層事務里就要考慮調整傳播行為或者拆分模板。hasSavepoint()當前事務是否保存了 Savepoint。跟 NESTED 傳播行為配合判斷當前是否處于嵌套層級。setRollbackOnly()把事務標記為只能回滾不能提交。調用這個方法之后即使回調正常結束事務在提交階段也會被強制回滾。這是編程式事務最核心的控制能力。isRollbackOnly()查詢當前事務是否已經(jīng)被標記為回滾。flush()強制把當前會話中的修改同步到數(shù)據(jù)庫。在 JPA/Hibernate 這類帶持久化上下文的場景下有時候需要提前 flush 以讓后續(xù)查詢看到更新或者讓數(shù)據(jù)庫約束檢查提前觸發(fā)。isCompleted()事務是否已經(jīng)結束提交或回滾。3.2 setRollbackOnly 的實際價值setRollbackOnly 在實際業(yè)務中有兩個關鍵應用場景。場景一是業(yè)務上判定失敗但代碼沒拋異常。比如在業(yè)務校驗中某個賬戶已經(jīng)凍結再往下執(zhí)行沒有意義但你要的是回滾而不必制造一個異常transactionTemplate.executeWithoutResult(status - { deductionService.deductPoints(userId, points); if (memberService.isFrozen(userId)) { status.setRollbackOnly(); return; } // 繼續(xù)其他正常業(yè)務... });這里如果直接 throw new RuntimeException會導致業(yè)務異常堆棧被包裝成框架異常調用方要解析這一層而 setRollbackOnly 直接回滾事務同時代碼還能正常返回業(yè)務狀態(tài)可以繼續(xù)處理。場景二是外部調用成功后本事務主動放棄。比如支付回調本地事務先更新訂單狀態(tài)再調用外部支付系統(tǒng)確認如果外部確認結果要求本地事務取消則 setRollbackOnly 回滾本地變更。需要特別注意的是一旦調用了 setRollbackOnly這個事務就被打上了回滾標簽。在同一個事務里即使你后續(xù)再執(zhí)行其他操作也無法撤銷這個標記。這也是一個經(jīng)典的踩坑點——在一個共享事務里某個組件標記了回滾但外層業(yè)務還繼續(xù)執(zhí)行并且最終想提交結果整個事務還是回滾了。3.3 flush() 在 ORM 場景中的應用如果你在 TransactionTemplate 里使用 JPA那么 flush() 的使用頻率會比 JDBC 高得多。原因是 JPA 是一種延遲寫的模型實體更新之后不會立刻刷到數(shù)據(jù)庫而是攢到事務提交前統(tǒng)一 flush。如果業(yè)務邏輯緊接著要查詢剛剛更新的數(shù)據(jù)或者要讓數(shù)據(jù)庫唯一約束提前生效就需要主動 flush。舉個例子事務里先給用戶分配一個優(yōu)惠碼然后立刻判斷這個優(yōu)惠碼是否已被使用過。如果依賴數(shù)據(jù)庫的唯一索引來校驗而 flush 發(fā)生在事務提交時那么第二次查詢可能還沒把第一次的寫入刷進去導致查不到數(shù)據(jù)。顯式調用 status.flush() 會把當前的實體變化同步到數(shù)據(jù)庫讓后續(xù)邏輯能看到最新狀態(tài)同時唯一索引沖突也能提前暴露。這個知識點在先寫后查同一事務的場景里很容易救你一命。4. 實操篇一個事務模板搞定復雜業(yè)務場景4.1 方法一標準模板配置與復用在實際項目里強烈建議不要每次 new 一個 TransactionTemplate而是把它作為 Spring Bean 注入使用。原因有兩個一個實例配置一次事務屬性后續(xù)復用省去重復配置另外 Spring 容器管理生命周期也更符合統(tǒng)一配置原則。最典型的配置方式Component public class TransactionTemplates { Bean public TransactionTemplate requiredTemplate(PlatformTransactionManager tm) { TransactionTemplate template new TransactionTemplate(tm); template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); template.setTimeout(30); return template; } Bean public TransactionTemplate requiresNewTemplate(PlatformTransactionManager tm) { TransactionTemplate template new TransactionTemplate(tm); template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); return template; } }這樣你在 Service 里就能按場景選擇合適的模板Service public class OrderService { private final TransactionTemplate requiredTemplate; private final TransactionTemplate requiresNewTemplate; public void createOrder(OrderCommand command) { requiredTemplate.executeWithoutResult(status - { orderDao.insert(command.toOrder()); // 給用戶加積分 requiresNewTemplate.executeWithoutResult(innerStatus - { pointsDao.increment(command.getUserId(), command.getPoints()); }); }); } }這段代碼的含義是創(chuàng)建訂單和加積分在同一個事務 REQUIRED 里但給用戶加積分這個動作又單獨做了一個 REQUIRES_NEW 事務。即使創(chuàng)建訂單的事務最終回滾積分增加的記錄也已經(jīng)被獨立提交了這在某些場景下恰恰是業(yè)務需要的比如只要用戶點擊了下單按鈕積分就要加不管訂單最終有沒有落庫成功。當然真實業(yè)務要不要這么做要看產(chǎn)品定義但 TransactionTemplate 的組合使用方式就是這么靈活。4.2 方法二在一個事務里分階段執(zhí)行業(yè)務并決定提交還是回滾很多系統(tǒng)對接場景需要本地更新 遠程確認的組合。比如支付回調處理過程中本地先更新訂單狀態(tài)、記賬然后調用遠程接口做風控確認確認結果決定事務走向。用 TransactionTemplate 實現(xiàn)public PaymentResult handleCallback(PaymentCallback callback) { return transactionTemplate.execute(status - { // 階段一本地數(shù)據(jù)更新 orderService.markPaid(callback.getOrderId()); paymentLogService.record(callback); // 階段二遠程確認 RiskCheckResult riskResult riskClient.check(callback); if (!riskResult.isPass()) { status.setRollbackOnly(); return PaymentResult.reject(riskResult.getReason()); } // 階段三本地數(shù)據(jù)二次更新 orderService.confirmPaid(callback.getOrderId()); return PaymentResult.accept(); }); }這里有幾個好處事務邊界覆蓋整個本地數(shù)據(jù)更新鏈路任何一步發(fā)現(xiàn)需要終止setRollbackOnly 就能讓全部本地變更回滾返回結果是一個結構化的業(yè)務對象不用依賴異常傳播來表達失敗語義遠程調用的時間被包含在事務生命周期里如果超時可以設置整體事務超時兜底在回調里可以自由編排階段順序、跳過某些步驟代碼直觀。4.3 方法三批量任務中實現(xiàn)行級事務與隔離批量處理是 TransactionTemplate 比較能發(fā)揮優(yōu)勢的場景。比如定時任務要遍歷一個比較大的數(shù)據(jù)集合幾萬條每條記錄執(zhí)行獨立的更新 校驗 記錄流程。要求是單條失敗不影響后續(xù)記錄且每條記錄的事務互不干擾。實現(xiàn)方式有兩種思路取決于對事務邊界的理解。第一種每一條記錄一個獨立事務for (Record record : records) { try { transactionTemplate.executeWithoutResult(status - { validate(record); update(record); audit(record); }); } catch (Exception e) { log.error(記錄處理失敗, recordId{}, record.getId(), e); // 單條失敗不影響循環(huán)繼續(xù) } }這里的 TransactionTemplate 配 PROPAGATION_REQUIRED每次循環(huán)開啟一個新事務處理完立即提交。某條失敗異常被 catch 捕獲本事務回滾其他記錄照常處理。這個模式在數(shù)據(jù)庫鎖競爭不大、單條操作耗時不長的任務中很高效。第二種如果單條處理邏輯內部還分多個階段可以用 NESTED 做局部回滾transactionTemplate.executeWithoutResult(status - { // 匯總更新 summaryDao.updateSummary(records); // 分階段處理細分回滾段 try { transactionTemplate.executeWithoutResult(innerStatus - { for (Record record : records) { detailDao.insert(record); } }); } catch (Exception e) { // 明細插入失敗回滾到 Savepoint但匯總結論還在 log.error(明細處理失敗但匯總已更新, e); } });這里外層事務控制總體內層用 NESTED 細分回滾讓明細失敗但匯總保留成為可能。實際項目中具體怎么設計取決于業(yè)務要求的隔離粒度。4.4 方法四事務模板與 CompletableFuture 異步任務的組合TransactionTemplate 在異步場景里也有獨特的價值。Spring 聲明式事務是綁定在線程上的異步線程里如果用 Transactional 會面臨事務上下文丟失的問題。而 TransactionTemplate 因為把事務邊界的控制權交給你可以在異步任務內部開啟獨立事務天然規(guī)避了這個坑。比如某個任務需要先同步做一段預處理再異步插入大量明細public void processAsync(ListData batchData) { transactionTemplate.executeWithoutResult(status - { prepareMainData(batchData); }); CompletableFuture.runAsync(() - { transactionTemplate.executeWithoutResult(status - { for (Data data : batchData) { detailDao.save(data); } }); }).exceptionally(ex - { log.error(異步寫明細失敗, ex); return null; }); }這里同步部分先提交一個事務異步部分另起一個事務兩個事務互不干擾異步里如果失敗也不影響主流程已提交的數(shù)據(jù)。這正是 TransactionTemplate 在異步場景里相對聲明式事務的優(yōu)勢體現(xiàn)。當然異步場景下真正需要注意的是分布式事務的一致性方案比如本地消息表 定時任務、事務消息等。但只要你把事務邊界定義清楚這些方案里的本地事務部分TransactionTemplate 都可以承擔。4.5 TransactionTemplate 和 Transactional 的混合使用技巧可能有人會問一個 Service 里能不能同時用 TransactionTemplate 和 Transactional可以的Spring 的事務管理是雙通道的只要事務管理器一致它們就共享同一個事務設施。一個常見的設計是對外暴露的入口方法用 Transactional 聲明統(tǒng)一事務內部某些特殊步驟用 TransactionTemplate 做獨立的子事務REQUIRES_NEW 或 NESTED。示例如下Transactional public void processOrder(Order order) { // 主事務處理 orderDao.updateStatus(order.getId(), OrderStatus.PROCESSING); // 子事務記錄操作日志即使主事務回滾也保留 auditTemplate.executeWithoutResult(status - { logDao.insert(processOrder, order.getId()); }); }這里 processOrder 用 Transactional 劃定了主事務邊界而審計日志使用獨立的 REQUIRES_NEW 事務。這樣即使主流程后續(xù)拋異常導致回滾審計日志也已經(jīng)落庫了可以追溯這個訂單確實被嘗試處理過?;旌鲜褂玫年P鍵約束是參與同一個物理事務的代碼必須保持一致的傳播行為認知不能出現(xiàn)一邊期待獨立回滾、一邊又共享事務狀態(tài)的邏輯混亂。因此混合使用之前最好寫清楚每個方法的事務語義注釋。5. 踩坑記錄與排查實錄TransactionTemplate 使用中的高發(fā)問題5.1 坑一事務管理器配置錯了導致事務根本沒生效TransactionTemplate 最典型的配置錯誤是給它塞了一個跟實際數(shù)據(jù)源不匹配的事務管理器。比如項目里用了 JPA卻從容器里拿了一個 DataSourceTransactionManager或者配置了兩個數(shù)據(jù)源但只給事務管理器設了一個。排查思路出現(xiàn)明明在事務里執(zhí)行的代碼異常了卻沒回滾的詭異現(xiàn)象第一步去看 TransactionTemplate 的 transactionManager 到底是什么類型。如果事務管理器跟數(shù)據(jù)源對不上整個事務就是空轉狀態(tài)——業(yè)務代碼執(zhí)行了但根本沒有物理事務來保護它。另外如果多個數(shù)據(jù)源配置了多個事務管理器那么 Spring 容器會有多個 PlatformTransactionManager Bean注入 TransactionTemplate 時要通過 Qualifier 明確指定Bean public TransactionTemplate orderTemplate(Qualifier(orderTransactionManager) PlatformTransactionManager tm) { return new TransactionTemplate(tm); }這個錯誤隱蔽性比較強因為代碼不會編譯報錯日志也看不出明顯異常。5.2 坑二事務鎖與連接池耗盡問題長事務占用連接是最常見的高危場景。TransactionTemplate 的 execute 從進入回調到方法返回整個期間都持有一個數(shù)據(jù)庫連接。如果回調里有個慢查詢或者同步調用了外部接口事務就一直掛著連接遲遲不歸還。這種情況在并發(fā)上來之后容易出事連接池默認 10 個連接10 個請求都在事務里等外部接口后續(xù)請求全部阻塞在獲取連接的環(huán)節(jié)系統(tǒng)假死。解決經(jīng)驗回調里盡量別做耗時操作外部 HTTP 調用建議放在事務外配置合理的超時時間至少讓連接不無限等待監(jiān)控連接池使用率超過閾值要報警。如果確實需要在事務里做外部調用某些強一致場景無法避免至少要給外部調用設置單獨的短超時別讓一個事務等外部接口 60 秒。5.3 坑三setRollbackOnly 之后還想提交事務已經(jīng)回滾這個坑的迷惑性很強。比如某個嵌套事務里內層事務調用了 setRollbackOnly但外層邏輯覺得不影響大局繼續(xù)提交。結果是整個事務在提交階段被強制回滾代碼上沒有拋出任何異??雌饋砭拖袷裁炊紱]發(fā)生但數(shù)據(jù)沒落庫。我碰到過一次經(jīng)典的案例一個交易系統(tǒng)主流程調用了內部記賬模塊記賬模塊在某個分支里 setRollbackOnly 后返回了一個正常對象主流程繼續(xù)執(zhí)行其他步驟最終想提交整個事務結果數(shù)據(jù)完全沒有寫入。當時排查了很久才發(fā)現(xiàn)是內部模塊的 rollbackOnly 標記傳遞到了整個物理事務上。這個問題的根源是在 REQUIRED 傳播行為下內層事務和外層事務共享同一個物理事務setRollbackOnly 修改的是整個物理事務的狀態(tài)。解決辦法如果內層業(yè)務對標記回滾有獨立語義應該配置 REQUIRES_NEW 讓內層單獨開物理事務或者在外層調用前檢查 status.isRollbackOnly()提前中斷別讓后續(xù)代碼繼續(xù)空跑。5.4 坑四受檢異常默認不回滾數(shù)據(jù)部分成功回想一下TransactionTemplate 的默認回滾策略跟 Spring 其他事務策略一致遇到 RuntimeException 和 Error 回滾受檢異常默認不回滾。這就會導致一個隱蔽問題如果你的業(yè)務代碼 catch 了一個受檢異常并向上層拋出比如轉換為自定義業(yè)務異常事務不會回滾但之前的數(shù)據(jù)改動已經(jīng)留在數(shù)據(jù)庫里了看起來像部分數(shù)據(jù)更新成功。例如transactionTemplate.executeWithoutResult(status - { accountDao.deduct(userId, amount); transferDao.record(transfer); throw new BusinessException(賬戶凍結); // BusinessException extends Exception });BusinessException 如果是受檢異常上面的代碼不會觸發(fā)回滾扣款和記錄都已經(jīng)提交了。這就需要顯式處理要么讓 BusinessException 繼承 RuntimeException要么在 catch 中調用 status.setRollbackOnly()。排查方法如果發(fā)現(xiàn)數(shù)據(jù)異常但沒拋錯先從哪些異常是不會觸發(fā)回滾的查起確認異常體系是不是用了受檢異常。5.5 坑五事務內操作跨線程事務上下文丟失Spring 的事務核心是把連接綁定在 ThreadLocal 上的所以它天然是線程綁定的。如果你在回調里使用 new Thread 或線程池異步執(zhí)行數(shù)據(jù)庫操作這些異步線程不持有當前線程的事務上下文它們跑的 SQL 會走獨立連接、獨立提交完全不受事務控制。典型錯誤transactionTemplate.executeWithoutResult(status - { orderDao.update(order); new Thread(() - logDao.save(log)).start(); // 這個 logDao.save 不在當前事務里 });如果需要異步操作參與當前事務必須想辦法把事務上下文傳遞過去比如 TransactionSynchronizationManager 的機制但它也只適用于少數(shù)可控線程池場景實現(xiàn)成本高。更推薦的做法是讓異步任務用自己的事務模板明確它的事務邊界不要指望它繼承外層事務。5.6 坑六事務模板被多個業(yè)務共用時屬性互相污染TransactionTemplate 實例內部保存了事務屬性傳播行為、超時、只讀等如果有多個業(yè)務流程共用同一個實例其中一個業(yè)務修改了屬性雖然少但可能有人會 set 一下其他業(yè)務也會受影響。更常見的是你設置了 readOnly后續(xù)的寫操作全被拒了或者設置了超時 5 秒一個跑批業(yè)務進來直接超時。最佳實踐是針對不同場景拆分模板每個模板的配置固定不要運行時改動屬性。如果需要動態(tài)改變傳播行為可以 new 一個新的 TransactionTemplate 實例而不是去改共享實例。5.7 常見問題速查表問題表現(xiàn)可能原因排查/解決思路事務沒回滾數(shù)據(jù)成功寫入事務管理器類型不匹配檢查注入的事務管理器和實際數(shù)據(jù)源事務回滾了但整體沒報錯內部模塊 setRollbackOnly 傳播檢查嵌套調用的 propagate 配置連接池耗盡系統(tǒng)卡住長事務 慢SQL / 外部調用縮短事務內耗時配置合理超時受檢異常沒觸發(fā)回滾默認回滾策略不含受檢異常改為 RuntimeException 或顯式 setRollbackOnly異步線程數(shù)據(jù)不在事務里事務上下文是線程綁定的異步任務用單獨模板開事務模板屬性互相影響多個業(yè)務共用同一實例按場景拆分模板運行時不改屬性6. 工具選型與設計建議讓 TransactionTemplate 發(fā)揮最大價值6.1 事務管理器的選擇與配置建議DataSourceTransactionManager 是 JDBC 場景的標準選擇在絕大部分單體項目中就夠用了。JpaTransactionManager 適合 JPA/Hibernate 項目它會同時管理 JPA 的 EntityManager 和底層 JDBC 連接保證兩者在同一個事務里協(xié)同。如果項目里同時用 MyBatis 和 JPA那可能需要兩個數(shù)據(jù)源管理器按用戶維度切分或者用 JtaTransactionManager 處理跨資源事務但后者復雜度更高。配置建議單一數(shù)據(jù)源 MyBatis/JDBCDataSourceTransactionManager單一數(shù)據(jù)源 JPA/HibernateJpaTransactionManager多數(shù)據(jù)源按數(shù)據(jù)源各配一個事務管理器業(yè)務上用路由或分布式事務方案微服務跨服務不建議直接用 TransactionTemplate 去控制分布式事務而是用 TCC、事務消息、SAGA 等專門方案TransactionTemplate 在其中的本地事務部分仍然可用。6.2 事務模板實例的生命周期管理在一個 Spring 項目中TransactionTemplate 實例可以交給容器管理作為單例 Bean 使用。它本身是無狀態(tài)的屬性在構造時設定運行時不修改線程安全可以被多個線程并發(fā)調用。這個特性讓它可以放心地注入到任意 Service 里。如果你的服務需要不同的事務屬性組合創(chuàng)建多個 Bean 是合理的方式命名上建議語義清晰比如 orderRequiredTemplate、auditRequiresNewTemplate、readOnlyTemplate 等。這樣代碼里一看名字就知道這個模板的語義比直接在調用處 new 要清晰得多。6.3 與聲明式事務的邊界設計原則在同一個項目里混用 TransactionTemplate 和 Transactional需要的人為約束是明確每種事務方式的管轄邊界。我的建議是三層劃分入口層Controller / API / 定時任務入口用 Transactional 做整體事務邊界一個入口對應一個業(yè)務完整流程服務層Service內部特殊環(huán)節(jié)用 TransactionTemplate 控制局部事務數(shù)據(jù)層Dao / Repository保持無事務語義事務完全由上層決定。這條邊界規(guī)則能有效避免到處開事務的混亂。而且一旦團隊形成這種習慣代碼評審時看到某個 Service 方法里又出現(xiàn) Transactional 又要特別注意嵌套邊界就能快速判斷是否合理。6.4 測試與調試工具如何驗證事務行為真的符合預期TransactionTemplate 寫完之后測試驗證是必要的。我用過的幾個比較實用的調試手段在回調里故意拋一個 RuntimeException然后斷言數(shù)據(jù)庫數(shù)據(jù)沒有變化驗證回滾路徑在回調里調用 setRollbackOnly 后正常返回斷言數(shù)據(jù)沒有落庫驗證邏輯回滾路徑配置一個極短超時觀察超時之后事務狀態(tài)是否被正確清理用日志輸出當前線程的事務狀態(tài)TransactionSynchronizationManager.isActualTransactionActive()、isCurrentTransactionReadOnly() 可以快速確認當前是否真的在一個物理事務里。這些測試不需要復雜的框架寫在集成測試里就能早一點發(fā)現(xiàn)問題尤其是那些沒有異常但數(shù)據(jù)沒落庫的隱蔽坑靠這個能提前暴露。7. 最后再分享一點個人經(jīng)驗坦率地說TransactionTemplate 并不是一個炫技的技術點它的價值在于讓事務控制回歸到開發(fā)者手里。如果你所在的團隊經(jīng)常被 Transactional 的邊界問題困擾、批量任務經(jīng)常因一條臟數(shù)據(jù)拖垮整個事務、異步場景里事務上下文總是丟來丟去那么花時間把 TransactionTemplate 用熟回報率會非常高。我個人在項目中偏向一套固定的寫法事務模板全部由 Spring 容器管理并按業(yè)務命名回調方法命名以 doXxxInTransaction 開頭異常處理盡量在回調內部消化并返回業(yè)務結果實在要拋出異常就顯式 setRollbackOnly 或者繼承 RuntimeException。這套規(guī)則一旦跑習慣事務相關的代碼不僅穩(wěn)定而且一年后回來翻代碼還能一眼看明白當初為什么要這么寫。最后再提一個小技巧如果團隊里有人總是分不清一個事務到底是提交了還是回滾了可以在回調末尾打印一下 TransactionSynchronizationManager.getCurrentTransactionName() 和當前事務的 rollbackOnly 狀態(tài)。這兩行日志在很多疑難問題上會節(jié)省大量排查時間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
伊人五月天在线| 五月婷婷天天色| 久久婷婷综合网| 婷婷五月天视| 人妻激情综合| 99色.com| 综合激情四射一theav| 久久98热re| 丁香五月激情六月| 五月婷婷在线短视频| 96自拍视频九色在线观看| 国产无套精品一区二区| 丁香六月成人网| 狠狠99| 丰满老熟妇BBBBB搡BBB| 九九黄色网| 26UUU精品一区二区c〇m| 9热在线观看| 疯狂做受XXXX高潮A片| 国产免费一区二区三州老师F1F1| 99啪视频在线观看| 熟妇高潮一区av| 五月天另类小说| 色五月婷婷色五月| 婷婷开心激情综合五月天| 另类亚洲2| 99久久色| 成人在线高清| 97久久超级| 99精品视频在线观看| 99色干| 成人丁香五月| 亚洲激情综合| 人人操av| 五月丁香免费视频| 人妻内射视频| 久热超碰| 婷色天堂| 99国产97在线,| 欧美精品在线观看| 五月婷婷影视| 婷婷基地成人五月天| 无码激情AAAAA片-区区| 久久性爱99国产| 天天爱天天操| 97碰碰碰免费公开在线视频| 免费视频WWW在线观看网站| 综合久久99| 五月婷婷啪啪啪| 99这里热| 亚洲九九视频| 五月丁香做爱视频| 五月天天爱| 五月天俺去也| 五月天停婷基地| 深爱1激情网| 婷婷丁香综合| 91凹凸在线| 亚洲另类视频| 亚洲国产成人在线| 狠狠穞A片一區二區三區| 欧美综合123区| 97se视频在线| 涩五月婷婷| 五月婷色| 五月天婷婷Av| 黄色三级日本| 五月天欧美激情| 涩涩五| 色五月五月天| 激情亭亭五月| 六月丁香网| 国外亚洲成AV人片在线观看| 99热在线看| 99色久| 婷婷五月花| 99小视频| 99啪在线| 色情五月丁香婷婷网| 丁香六月婷婷开心| 精品人妻一区二区三区四区不卡在| 色婷婷五月天激情在线观看| 九九99精品| 91精品久久久久久久久久| 丁香五月天AV在线| 日韩成人电影AV| 五月丁香啪啪啪免费看| 桃色激情网| 五月婷网| 国产免费av网站| 99ri在线播放| 久久这里有| 99热亚洲精品| 超碰9799| www,五月天com| 国产探花AV在线| 婷婷激情六月| 婷婷五月天VI| 九九热10| 狠狠色综合网| 欧美日韩五月婷婷| 丁香色五月婷婷91桃色| 色五月婷婷五月天| 91九九| 天天爽天天干天天| 精品一二三区久久AAA片| 午夜成人av在线| 六月婷婷av| 久久人人添人人爽添人人片αV | 婷婷六月丁香色| 久 久9 9 热 视 频| 亚洲AV日韩无码| 91se精品国产| 丁香五月成人论坛| 激情五月丁香五月| 欧美情月伍月天| 婷婷淫淫狠狠六月| 影音先锋 萱萱| 五月色婷婷影院| 九九久久这里只有精品XB| 亚洲操精品| Av狠狠色丁香婷| 色色五月天激情| 色视频五月天| 色欲色香综合网站| 激情五月丁香综合网站| www.lchjjc.com| 欧美性二区| 天天骑天天操| 淫视馆av三区| 五月丁香九九九综合| 九九热最新| 日日躁夜夜躁狠狠久久AV| 99色日本| 另类国产综合| 婷婷婷色五月| 中文字幕在线日亚洲9| 99热www| 婷婷六月婷婷| www.夜夜操| 999九九九久久久99HD| 天天爽人人综合免费7799| 182tv992tv人之初午夜免费观看| tingting五月天亚洲| 无码髙清| 久re热视频| 99爱免费在线视频| 久久男人网婷婷| 五月丁香啪啪拍| 色欲婷婷五月天| HD久久精品视频| 狠狠干五码| 色婷婷五月天| WWW色综合| 婷婷在线免费| WWW,色五月| 六月亚洲婷婷6月中文字幕| 热99玖玖99玖玖99九九| 九九在线精点品| 天天色综合天天| www.日韩艹| 色欲五月丁香| 九九久久精品國產| 99热 这里只有精品 国产 日韩| 久久五月天激情| 亚洲午夜在线视频| 亚洲无码九九| 五月婷婷日| 亚洲综合激情五月| 婷婷五月婷婷| 亚洲精品在线视频| 五月婷婷偷拍| 日木狠狠干| 久久99网| 天天射综合网天天插| 99精品在线| 天天拍夜夜撸| 激情婷婷护士激情| 天天肏高清在线| 91|九色|动漫| 97婷婷色| 深爱激情五月天婷婷网| 五月丁香成年黄色| 天天看A片| 色五月婷婷五月丁香五月激情五月视频| 香蕉综合在线| 欧美猛片| 狠狠色丁香婷婷五月| 天天干天天干天天| 色欲婷婷夜夜| 九月色婷婷婷| 五月丁香777| 99这里只有精品视频免费| 婷婷色网站| 色色日韩| 婷婷综合国产| 爱性综合网| 五月婷婷啪啪| xxx日本东京热| 国产女人十八水真多1| 九九婷婷网五月天| 久月丁香爱婷婷综合| 97丨九色丨国产丨PORNY| 26uuu另类亚洲欧美日本一| 9 9热这里有精品| 99碰碰视频| www久久五月com| 黄色国久久| 99热这里只有精品在线观看| 亚洲日本激情| 99九九视频精彩在线| 欧美日比视频| 色五月激情基地| 九九青草热| 亚洲欧美成人在线| 婷婷久久五月天| 99er这里只有精品| 91色干| 五月天综合| www一区二区三区| 五月丁香激情婷婷| www.夜夜爱.com| 色五月天成人| av性爱在线| 99色综合网| 久月久在线视频| 色欲五月婷婷| 美女丁香五婷婷| 美女五月激情| 亚洲日韩国产黑丝黑丝AVAV一区二区三区 | 久久9久久| 色情五月丁香| 激情九色| 超碰激情五月| a级毛片一区二区免费视频| 中文字幕在线免费| 国产亚洲色婷婷久久99精品91| 综合丁香婷婷五月天| 日本nghangse中文字幕| 大操人妻| 午夜在线成人网站免费观看| 欧类av怡春院| 久久五月情| 婷婷色婷婷亚洲成人| 婷久久久| 亲子乱AV-区二区三区| 91久热| 狠狠五月激情婷婷直播片| 亚洲区,视频区,视频区免费| 天天色图| 亚洲成人一区| 超碰人人操人人干| 99免费热在线精品| 99热思思在线观看| 九九热再线九九视频免费在线观看| 婷婷丁香社区| 人妻激情视频| 五月天操逼网| 九九热99视频| 97操操| 日本九九视频| 在线中文av| 丁香五月天狠狠操| 久草五月婷婷| 他改变了拜占庭| 狠狠干狠狠色| 婷婷五月天777| 精品五月视频婷婷在线观看| 这里只有精品视频在线观看免费| 丁香婷婷五月天网站| 精品99在线看| 五月天无码| 九九人妻福利| 亚洲另类婷婷五月综合| 5月丁香六月婷婷| 激情婷婷丁香五月| 色五月婷婷内射| 人妻尝试久久久久久久久久久久| 婷婷五点亚洲| 色欲午夜无码久久久久久张津瑜| 婷婷久久五月天丁香| 丁香五月色| 五月婷婷深深爱| www.99热这里精品| 激情综合网五月丁香| 婷婷狠狠18禁久久| 色色网站| 五月婷婷香蕉| 天天综合 99久久婷婷| 激情五月天的婷婷| 超碰三级秋霞| 五月天色婷婷基地| 日本人妻A片成人免费看片| 五月婷婷AV| 99久视频| 久久婷婷九月国产精品| 五月丁香啪。| 婷婷五月天改成什么了| 79色色色色| 天天插天天插| 国产小精品| 九月丁香婷婷网| 国精产品一区二区三区| www.狠狠操.co m| 开心五月丁香啪| www激情| 精品激情| 大香久久综合网| 久久久久亚洲AV成人无码电影| 激情综合5| 九九这里精品| 丁香五月Av| 婷婷色色网站| 五月丁香久人妻中文| 久婷婷久草| 色五月婷婷小说亚洲中文字幕组| 亚洲五月婷婷| 丁香天堂夜| 99这里是99在线视频| 亚洲性图一区二区| 激情欧美五月丁香| 天天综合网~91| 蜜桃婷婷五月| www色色com| 黄色片久久| 热99在线精品| 欧洲第一久色| 色99在线| 九九精品网站| 久操97| 日韩在线观看网址| 五月丁香激情片| 久久人妻伦理| 五月天大香蕉av| 91无码视频| 五月婷婷综合色啪首页| www.色婷婷| 性爱网六月丁香| 九九视频精品这里只有| www.91.com黄| 色呦呦美女| 我爱婷婷五月天综合88| 婷婷成人五月天| 中文字幕五月久久婷| 五月亭亭六月激情| 丁香六月婷婷| 国产伊人五月天| 久久天堂| 伊人碰碰婷婷| 日日操夜夜爽| 日本久久超碰| 青青草原伊人网| www.99操| 欧美黄色韩日网| 久久AAAA片一区二区| 国产日产成人亚洲欧美国产VA| 色五月天电影| 大胆伊人久久| 激情五月丁香亭亭| 九九精品热播| 成人网在线视频| 最新日韩AV中文字幕| 99热精品在线播放观看| 色色激情五月天| 丁香婷婷五月激情| 九九av| 丁香婷婷网| 操九色| 无码色综合| 五月亭亭直播| 五月婷婷久久久久| www.婷婷,com| 丁香六月啪啪| 99国产精品白浆在线观看免费| 超碰在线成人| 网站免费一站二站| 色色永久| 五月丁香婷婷激情图片| 激情综合网五月激情| se色婷婷视频| 五月婷婷成人| 日韩一级片| 婷婷五月天色色| 色综合婷婷| 另类在线| 丁香婷停五月激情综合深爱| 91男人资源站| 色五月色图| 色婷操逼| 色五月激情| 亚洲五月婷婷在线| 影音先锋一区二区资源站| 天天热夜夜操| 婷婷中文字幕网| 天天操夜夜操| 五月丁香综合啪啪啪啪啪| 婷婷五月婷婷| 武汉美女啪啪视频免费一级片| 婷婷在线网| 毛片毛片毛片毛片| 人人澡玖玖一| 国产成人精品一区二三区熟女在线| 亚洲爱爱无码婷婷色五月| 日本人妻伦在线中文字幕| 9久热这里只有精品| 成人丁香五月婷| www,久久久| 另类丁香五月天区图| 五月婷婷影视| 久99视频| 久久精品亚洲一级牲爱综合 | 91九九热| 五月婷六月| 婷婷综合五月激情| 久久久久8888| 久热精彩视频98| 久久九区| 日韩AV大全| 丁香五月色色| 婷婷伊人綜合中文| 99在线观看| 人人人人人人人草| 亚洲精品乱码久久久久久按摩观| 99草视频在线观看| 天天色天天操天天射| 九九在线视频| 色五月视频,小说| www.五月婷婷久久.com| 欧美日韩精品一区二区三区钱| 五月天婷婷免费| 欧美综合婷婷欧美综| 亚洲乱码w在线观看| 亚洲视频在线观看| 91九色首页| 性生活久久人妻| 大香蕉精品视频| 中文AV网站| 夜夜干 夜夜操| 五月天 另类图片| 婷婷六月色丁香视频在线观看| 久久艹网| 91色综合久久| 99热 精品在线| 99人妻碰碰碰久久久久禁片| 国产在这里只有精品| 日韩抽插操逼| 色狠狠五月天| 午夜婷婷丁香| 久9热在线视频| 丁香五月天社区婷婷| 大香蕉520| 99久久玖玖| 无码 色| 婷婷五月丁香狠狠| 五月激情日本在线| 79精品在线视频| 超碰人人操在线| 停停六月 综合| 丁香五月大香蕉在线99| 成人无码髙潮喷水A片| 五月天激情小说| 九九色人| 99热老网站| 大香蕉婷婷五月天| 超碰免费人人| 日日综合网| 99综合在线| 99色中文| 五月丁香综合| 色情久久久| 伊人久久婷| 97色欧美| 99热在这里只有精品| 国产成人AV在线| 色久女| 色婷婷网| 狠狠狠狠狠干| 超碰人人摸AV| 99综合成人视频在线观看| 影音先锋一区二区资源站 | 蜜桃婷婷狠狠久久综合| www.99精品视频| 偷拍九九五月丁香婷婷| 99久.| 激情床戏| 色婷五月婷婷| 另类图片五月天婷婷| 蜜臀av无码久久久久久久久| 天天婷婷操| 五月丁香拍拍激情综合| 武汉美女啪啪视频免费一级片| 久久婷婷一级片| 五月婷婷激情综合视频| 丁香六月久久| 五月色影院| 日韩婷婷| 99在线看片| 超碰色人妾| 九九热re99re6在线精品| 激情网五月天| 狠狠五月激情丁香六月| 激情五月天婷婷| 欧洲一区二区| 激情婷婷色色| www.第四色99| 日本啪啪天堂| 人人添人人| 久久激情五月天| www热久久yy9| 亚洲中文字幕在线观看| 国产欧美日韩综合精品一区二区| 一级二级色大片| 性韩日色婷婷五月天激情啪啪XXX| 丁香五月天天| 激情五月综合| 久久婷婷五月天| 超碰成人影视| 草综合网| 九九热精品在线| www.激情五月| 日韩无码乱轮| 天天爱天天做天天舔| 婷婷十月激情综合网| 久久艹99| 狠狠五月天| 日韩肏屄网| 天天插天天插天天操| 五月花亭亭| 99热首页| 麻豆忘忧草午夜| 91日本在线观看| 天插天啪天啪天啪| 亭亭五月色男人| av操B网站| 色婷婷狠狠爱| 欧美丁香五月天| 99热6这里只有精品| 婷婷在线日韩综合| 六月丁香婷婷拍拍| 激情久久久久久久久久久| 亚洲欧洲中文日韩久久AV乱码| 狠狠爱夜夜| 婷婷五月天激情影片| 99热精品中文字幕| 狠狠色噜噜狠狠| 狠狠操天天日| 婷婷伊人綜合中文字幕| 久久久激情视频| 日 日干 日日做| jiZZdr| 色综合色婷色基地| SESE无码AV| 欧美激情综合色综合啪啪五月| 久久婷婷五月天激情四射| 99国产精品久久久久久久久久久| 白天AV月月| 人人插操| 综合激情站| 丁香婷婷五月人体| 综合超碰熟| 第四色婷婷日本| 久久A V无码视频| 成人午夜无码视频| 全亚洲最大的婷婷五月天网站COM| 毛片毛片毛片毛片| 亚洲综合网在线| 五月丁香WWW| 色五月色五天色情网| 自拍视频99| 五月丁香六月香综合激情| 九九性视频| 婷婷激情肏屄网| 婷婷五月天人妻| 丁香,开心成人,久久| 青青操avbb| 天天日夜夜爽| 五月六月丁香婷婷在线观看| 996热| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 热99这就是精品视频| www.色9| 97人人做| 久久九九视频网站| 思思热在线| 国产夫妻操逼内射视频| 艹B高清无码| 婷婷开心综合人妻小说网址| 久久丁香综合香蕉| 无码 色| 日本色超碰| 丁香五月另类小说| 色播婷婷大香蕉| 日本啪啪天堂| 狠狠干天天内射| 丁香六月婷婷综合| 五月丁香六月合| 五月天久久小说| 丁香五月激情六月| 国产探花一片区| 播五月,色五月,开心五月播放器 | 丁香五月精品视频| 在线看的免费网站| 色五月婷婷九月| 欧美三级黄色片久久| 色婷久久| 丁香婷停五月激情综合深爱| 久久久久久久久久久久久久久久久精典| 99er免费在线观看| 色五月婷婷91在线| 婷婷丁香五月综合| 丁香八月综合激情| 五月丁香视频色色| 99国产在线| 五月天婷婷激情干干| 9999综合99综合人| 俺去也五月天婷婷| 五月综合六月婷婷| 人人97碰| 欧美色图片88| 五月婷婷激情网| 成人小说 五月天 婷婷| 99色视| 九九这里有精品| 色婷婷六月性| 丁香五月婷婷欧美成人色图| 色五月丁香婷婷| 综合综合色色| 99人妻碰碰碰久久久久| av大香蕉| 超碰在线人人| 五月天婷婷在线播放免费| 美欧日韩国产成人在战| 国产伦亲子伦亲子视频观看| www.日本91| 婷婷激情九月| 久久综合9| www.超碰在线| 天天综合精品| 激情五月五月五月婷婷| 翔田千里 50岁 无码| 五月婷婷激情| 色婷婷婷婷| www.ppypp| 大香蕉啪啪网| 色情五月婷| 99色综合久久| 国产精品人成A片一区二区| 色在线99| 婷婷开心激情| 99视频精品8| 婷婷综合久久| 五月丁香六月婷婷成人| 激情综合在线播放| 任你弄在线视频免费| 99色综合| 99性视频| 久久大香蕉同僚| 色播五月| 丁香激情综合| 狠狠狠狠狠操| 色婷婷婷综合五月天| av色婷婷| 9视频1在线| 六月婷婷综合网2| www.91色| 五月天婷婷丁香| 欧美三日本三级少妇三99| 亚洲激情电影五月天色婷婷丁香一起草 | 99精品久久| 婷婷娌伦网| 色播播婷婷| 丁香 婷婷 亚洲 熟女| av婷婷丁香 六月| 婷综合| 天堂久久婷婷| www.91婷婷| 五月丁香六月婷婷的女人| 人碰人人人玩91| 亞洲自怕| 97成人在线视频| 综合色五月亭亭| 国产精品久久久久久久久久免费| 久热超碰| 日本不卡高字幕在线2019| 国产精品美女久久久久AV超清| 97碰在线视频| 色婷婷六月| 亚洲久热| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 99视频超级精品| 97色在线观看视频| 啪啪婷婷五月天激情| 狠狠色大香蕉| 99久热这里只有精品| 99黄色性生活| 天天做天天爱天天爽| 成人做爰A片免费看视频| 午夜不卡久久精品无码免费 | 五月天婷婷导航| 伊人五月成人| 操逼三区| 96丁香六月婷婷蜜桃综合久久| 日日天天干| 久久综合九九| 九月婷婷激情久久| 色婷婷久久天天性爱| 超碰人人在线| 颜射 精品性爱av| 色婷婷五月中文字幕在线dvd| sewuyuejiqingwang| 亭亭五月色男人| 另类 在线| site:pnnrt.com| 国产乱子轮XXX农村| 碰99在线| 99热99色| 激情宗合网激情五月天| 狠狠操天天干| 99久久九九| 成人精品免费在线观看| 黄网免费观看| 天天干天天干天天干天天干天天干天天| 天天情色五月天| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 日韩成人综合网| 超碰99热精品在线| 久久久91| 婷婷五月色丁香在线看| 色婷婷综合久久久久| 天天色粽合合合合合合合| 欧美色必爱| 91九色精品女同系列| SS丁香五月婷婷| 日本美女上人| 大香伊人久色| 亚洲天堂热| av狠狠操| 国产精产国品一二三在观看| 婷婷丁香六月天激情四射网| 一逼色综合| 中文不卡一二区| 99碰碰| 在线不卡的视频| 操人91| 激情久久 婷婷| 激情五月六月婷婷综合啪啪| 国产精品色婷婷99久久精品| WWW嗯嗯啊啊啊啊| 婷婷五月播| 九九热精品视频| 一本大道熟女人妻中文字幕在线| 五月丁香网站| 日本 @ va 免费| 国产成人精品亚洲线观看| 99噜噜| 婷婷五月丁香网| 亚洲综合激情五月久久| 97操碰日本女人| 婷婷综合五月色播| 亚洲精品亚洲人成人网| 七七九色| 婷婷五月天开心网| 男人的天堂99| 99色看| 五月天色色网站| 超碰93在线观看| 99久久性爱| 在线不卡AC| 六月色婷婷欧美| 婷婷五月天色色| 激情av在线| 欧美韩日AAA网站| 人妻丰满精品一区二区A片| 国产精品电影网| 人人操五月天| 国产永久一黄| 舔色婷婷| 99免费青青蜜臀| www.99成人视频| 激情综合色五月丁香| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 99超级碰免费视频| 9+1视频网址| 日韩啪| 欧美日韩成人在线网站| 狠狠色丁香婷婷| 欧美综合激情丁香五月六月婷| 欧美黄色一级| 天天舔天天摸视频| 狠狠爱五月婷婷综合六月| 深爱五月亚洲| 日韩AV免费| 色色色成人网| 成人在线视频男人的天堂4399| 五月丁香六月婷婷亚洲综合| 激情丁香婷婷| 丁香五月AV综合激情| 俺也去色| 婷婷丁香五月六月激情| 国产成人综合亚洲| 综合色婷婷| 天天久| 98永久精品| 91黄址| 色五月婷婷中文字幕在线观看| 激情网五月天| 人妻videos人妻高清| 九九99九九精品免费 | 中文字幕婷婷9月天| 综合网五月天123| 久久久久久99日本| www夜夜| 五月天丁香综合久久国产| 久久丁香| 人妻videos人妻高清| 丁香六月成人| 深爱激情综合| 欧美激情五月天在线观看| 成人综合视频网址| 婷婷网五月天| 91九色网| 婷婷欧美| 精品免费99| 婷婷五月天综合久久| 无码色色色| 天天综合永久| 大香av| 性做久久久久久久免费看| 婷婷伊人久久综合| 五月天激情四射网站| 九九热在线精品视频| 翔田千里无码| 色色五月丁香婷婷| 97caop| 成人va在线播放| 亚洲激情丁香五月天色| 久久久久久久久久久久63| 天天肏夜夜肏| 影音先锋人妻出差| 91色逼| 无码字幕中文| 99在线精品观看99| 天天日天天做天天操| 色五月天丁香婷婷色| 精品久热| 99国产小视频| 综合激情五月天| 色综啪啪| 激情综合网五月婷婷| 五月婷婷六月丁香综合视频在线| 成人AV综合在线| 九月色婷婷| 色欲婷婷五月天丁香| 人妻操操色| 五月停亭六月,六月停亭的英语| 狠狠干.com| 日韩成人av在线| 天天插综合| 亚洲 25P| 91碰| 9热在线视频| 熟妇高潮一区av| 亚洲精品视频在线播放| 日日操天天操| 久久66精品| 99九九久久| 激情五月天色播| 涩涩网五月天| 色五月丁香总合网| 久久99免费视屏| 久久五月婷婷视频| 九九色婷| 国外亚洲成AV人片在线观看| 色婷婷六月天| 26UUU欧美激情一区二区| 人人爽亚洲| 深爱开心激情网| 五月色情婷婷| 久久久8| 91丨九色熟女丨首页| 婷婷五月激情欧美大胆视频| 99精品偷自拍| 日本狠狠色| 五月天久久婷婷| 色综合99| 人人操av| 天天色天天日| 久久综合人妻| 亚洲 五月 婷婷 成人| 99亚洲综合| 久久婷婷五月天激情新地址| 99久久www| 伊人五月综合网| 国内在线99视频| 91高潮喷水久久久久久久久| 日韩性爱AV| 岛国AAAV| 伊人喵咪a V| 婷婷五月丁香五月基地| 91色色五月天| 9热在线| 日本色99网站| 日本色超碰| 国产女生爱爱AA| 六月婷婷最新网址| 国产亚洲色婷婷久久99精品9j| 黄色av网站在线免费播放| 超碰成人黄色网| 婷婷综合天堂| 色色九区| 一区二区免费看| 婷婷伊人欧美| 丁香激情五月| 婷婷五月天奸女| 五月丁香久久网| 97干在线观看视频| 999热在线视频| 这里只有精品免费在线视频| 国产中文亚洲欧美日韩性交| 79成人网| 丁香五月婷婷色偷偷| 激情五月,婷婷五月,丁香五月| 亚洲婷婷丁香五月亚洲| 五月丁香六月婷婷视频| 日韩在线婷婷五月天综合| 永久精品| 97精品综合| 国产真人做爰视频免费| 最新无码专区| 人人干人人操外国| 99超级碰免费视频| 思思99精品视频在线观看| 狠狠色五月| 日日懆天天懆| 另类视在线| 色欲一区二区三区精品A片| 日本色婷婷| 色九月综合| 国产成人AV在线播放| 色色色国产| 色天天综合色| 日韩色色视频| 色婷婷影视| 91九九九九| 丁香婷婷色情| 99久久99热| 操人妻视频91| 思思re99视频在线观看| 九九热这里只有精品31| 色婷婷天堂| 九九在线精品| 91久久九久久九久久九久久九久久| 天天色天天射天天日| 久久综合伊人综合在线| 99色在线视频| 欧美大片免费播放器| 婷婷伊人五月丁香天堂网| 91操人视频| wuyuedingxiang99| 色色热| 人妻丰满精品一区二区A片| 在线日韩av| 噜噜色五月| 天天插天天插天天插天天插| 思思热视频| 波多野结衣不卡AV| 97视频91| 色五月首页| 色婷婷色99国产综合精品| 久久综合五月婷婷| 99久久这里只有精品免费官网| 色色色.COM| 婷婷五月天av| 欧美久久九九| 丁香五月婷婷综合视频| 天天做天天爱天天爽| 91精品国产综合久久久不卡电影| 97性视频| 无码色色| 天天综合精品| 五月婷婷|欧美| 九九亚洲小视频| 婷婷五月天激情四射| 99人人操| 婷婷五月天综合中文| 99综合网| 成人五月天丁香| 小视频久久久aaa| 欧美在线| 99玖玖免费视频| 色五月影视| 亚洲亚洲人成综合网络| 久/久精品99看9| 9l视频自拍九色9l视频在线观看| 婷婷.com| 激情网狠狠干| 丁香五月天社区| 97干97色| 九九re精品视频在线观看| 伊人玖玖婷婷| 日日操夜夜骑| www超碰com| 天天综合情| 香蕉综合网| 九九色综合网| 99热免费| 婷婷五月色图| 精品人妻伦一二三区久| 无毒黄色网址| 午夜激情五月天| 日本婷婷色| 五月天婷婷永久免费视频| 七七婷婷综合| 五月丁香六月婷婷免费| 欧美一级色| 丁香玖玖| 97性视频| 日本三久久| 99热在线观看| 超碰色色综合| 亚洲色啪| 色激情五月| 开心婷婷五月激情网小说| 久久99网| 影音先锋xfplay资源男人网| 久久丁香五月天| 狠色狠色狠狠色综合网| 可以免费观看的AV| 免费99情趣网视频| 99视频在线观看地址| 日日操日日干| 极骚大香蕉伊人| 日日爽日日爽| 五月丁香婷婷啪啪综合| 激情开心五月天| www.久久久久| 香蕉久久国产AV一区二区| 99r久久这里只有精品| 免费无码毛片一区二区A片| 激情五月亚洲综合网| 久99999热视频在线观看免费| 凹凸操Av| 丁香久月| 亚洲成人高清在线| 丁香婷婷色| 丁香五月婷婷影院| 26uuu国产色| 天天日天天操心| 丁香 婷婷五月| 成人草榴视频| 久久综合五月| 91婷婷色五月| 91av传媒高清在线视频网| 丁香五月激情鲁| 亚洲午夜Av| 人妻久热| ,99视频久久| 9|人妻人人操| 超碰成人在线观看| 99热精品在线播放观看| 婷婷丁香激情五月天色色色| 色婷六月| 欧洲精品欧洲情| 国模九区| 色综合com| 甈吧vv| www.99精品视频| 思思久久99热只有频精品66| 久久精品亚洲一级牲爱综合 | 97日在线视频| 超碰九色| 天天爽天天| 色婷婷91激情小说| 人妻有码乱操| 日韩AAAAA| 亚城区在线| 五月婷婷色| 91婷婷五月丁香碰| 99热这里都是精品| 激情五月开心五月丁香五月| 成人av免费观看| 超碰99热精品在线| 色婷婷丁香五月| 深爱激情婷| 五月天婷婷日日爱| 色欲久久久久久综合网综合网| 国产精品18久久久| 五月综合久久| 激情五月天www| 久操婷婷| 综合AV网| 色狠狠色| 五月婷婷在线免费| 六月婷色六月| 五月丁香亚洲校园欧美| 久久五月热| 午夜少妇在线观看视频| 成人网在线视频| 激情五月视频在线婷婷| 久久视屏这里只有久久| 五月天丁香婷婷社区| 97日本在线播放| 丁香五月天堂| 激情综合色婷婷啪啪六月天| 五月天黄色激情小说| 婷婷丁香色五月亚洲| 九九综合图片网| 中文超碰视在线| 欧美激情性做爰免费视频| 中文字幕在线日亚州9| 婷婷伊人网| 五月天自拍视频| 99小精品| 婷婷五月天av| 久久综合五月婷婷| 秋霞少妇AV网站| 99热这里只有精品9| 丁香五月天网站| 丁香五月成人| 婷婷五月婷| 五月婷婷丁香在线| 五月婷婷色吧!| 六月五月久久丁香| 成人五月天婷婷| 色啪影院| 超碰在线看| 9久久久久久久久久久| 婷婷99狠狠躁天天躁中文| 亚洲天堂碰碰婷婷| 婷婷五月丁香基| 欧美性爱丁香五月| 影音先锋91在线资源站| 日韩成人中文| 五月丁久久| 少妇真实被内射视频三四区| 专区无日本视频高清8| 婷婷久久五月| 国产精品VIDEOSSEX久久发布| 五月丁香在线| 午夜丁香| 大伊香蕉精品视频在线| 第九色区av天堂| 国产古装妇女野外A片| 国产高潮A片羞羞视频涩涩| 色综合色综合网| 性色做爰片在线观看WW| 国产XXXX搡XXXXX搡麻豆| 婷婷D区| 婷婷六月激情在线视频| 五月天堂婷婷| 成 久久| 激情综合网激情五月丁香| 色久五月天| 亚洲中文乱字字幕在线永久| 五月丁香六月激情综合| 五月婷婷色播| 成人短视频在线| 色色五月天婷婷| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 激情深爱婷婷网| 激情五月天开心网丁香无码| 天天碰天天插天天操| 天天夜夜六月丁香五月婷婷老师| 天天激情| 久久久精品人妻| 激情婷婷丁香五月天| 激情五月婷婷五月| 精品色色| 91猫咪国产在线播放| 色蜜婷婷| 九月婷婷综合| www好屌操| 五月天综合图片| 天天操B| 91狠狠色丁香婷婷综合久久| 伊人久久丁香五月91| 综合九色| 伊人碰碰碰| 五六月丁香激情视频| 五月花综合视频| 狠狠综合久久| 成人精品视频99在线观看免费| 粉嫩AV久久一区二区三区| 伊人喵咪a V| 肏屄色播伊人97婷婷| 青青热久精品视频在线观看| 婷婷综合五月激情| 不卡在线中文字幕无| 国产av第一专区| 九九精品热播| 五月丁香亚洲校园欧美| 5月丁香六月婷婷| 久碰婷婷视频| 亚洲情综合五月天| se99热久久一本| 亚洲AV免费国产电影| 91精品电影18T| 丁香五月亚洲| 婷婷99| 九九美女视频| 久久这里只有精品07| 六月合五月婷| 伊人久久大香线蕉av一区| 99ER热精品视频| 91精品又长又大又粗又爽又猛| 五月丁香va| www婷婷| 狠狠婷婷色| 97操在线视频| 婷婷综合色播网| 99A片| 99五丁香月| 欧美美女国产日韩一区二区久| 这里只有精品在线视频在线观看| 538在线精品| 色色五月婷婷久久| 色五月婷婷五月丁香五月| 婷婷色在线| 婷婷丁香社区| 欧美综合激情五月| 天天在线XXX| 色青青视频| 在线视频99| 白度黄视频| 狠狠狠狠免费| 五月丁香久久| 丁香五月激情月| 人妻久久久久久久久久| 色五月婷婷网| 成人一区在线观看| 99精彩视频在线观看| 综合久久99| 婷婷激情五月天桃花网| 激情美女五月天| 思思久久精品| 国产熟女一区二区三区五月婷| 色哟哟精品| 欧美日本高清视频99| 啪到高潮激情丁香五月| 99ER热精品视频| 欧美亚洲999| 天天爽天天干| 六月丁香久久| 天天激情| 久久9精品视频| 五月天激情综合| 亚洲啪啪啪啪| 婷婷丁香成人| 婷婷五月骚厕所| 99资源人人| 日本色五月| sewuyuejiqingwang| 天堂亚洲 在线| 婷久看人爽| 色色激情五月天| www.91.com处女在线直播| 99精品偷自拍| 五月丁香综合在线| 怡红院院在线导航网 | 免费看欧美成人A片无码| 97色在线视频| 五月天婷婷基地| 久久网日本| 九月色婷婷| 色五月婷婷中文字幕在线观看| 丁香五月婷婷基地|