日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

C#火車訂票系統(tǒng)實戰(zhàn):并發(fā)控制與事務(wù)一致性設(shè)計

C#火車訂票系統(tǒng)實戰(zhàn):并發(fā)控制與事務(wù)一致性設(shè)計 簡介一份基于C#與SQL Server的火車訂票系統(tǒng)完整項目面向初學(xué)C#窗體編程及數(shù)據(jù)庫開發(fā)的讀者用于理解訂票、退票、改簽、車次管理等核心業(yè)務(wù)流程并掌握WinForms事件驅(qū)動設(shè)計與SQL數(shù)據(jù)操作。壓縮包共128個文件以cs源碼文件為主輔以resx資源、resources編譯資源、jpg界面素材、exe可執(zhí)行程序及sln工程文件等整體約1.85MB目錄結(jié)構(gòu)清晰方便直接打開編譯與二次修改。目前已有1437人學(xué)習(xí)/下載適合課程設(shè)計、畢業(yè)設(shè)計或項目實訓(xùn)參考。通過該項目可獲得整套窗體源碼、界面設(shè)計文件、數(shù)據(jù)庫交互邏輯及運行程序覆蓋用戶模塊、車次管理模塊和訂單管理模塊的實現(xiàn)細(xì)節(jié)并包含常見錯誤處理與異常捕獲寫法可幫助讀者快速搭建同類訂票系統(tǒng)提升C#與SQL Server的工程實踐能力。1. C#火車訂票系統(tǒng)不是查個數(shù)據(jù)庫那么簡單C#火車訂票系統(tǒng)聽起來就是把車次存進數(shù)據(jù)庫、讓用戶查一查訂一訂但真正實現(xiàn)過的人都知道這個項目的核心難點根本不在增刪改查而在余票扣減的一致性兩個用戶同時搶最后一張票系統(tǒng)憑什么只讓一個人成功訂單生成到一半網(wǎng)絡(luò)閃斷余票和訂單怎么保持一致說到底訂票系統(tǒng)是一個典型的并發(fā)寫密集型業(yè)務(wù)系統(tǒng)能用 C# 把它做扎實你對事務(wù)、鎖、連接池、異步 UI 的理解都會上一個臺階。這篇文章面向正在做課程設(shè)計的學(xué)生、想練手完整業(yè)務(wù)閉環(huán)的初級開發(fā)者和需要把內(nèi)部訂票需求落地的工程師帶你從技術(shù)選型、數(shù)據(jù)庫設(shè)計一路走到并發(fā)壓測驗證。2. 技術(shù)選型與三層架構(gòu)先決定系統(tǒng)長什么樣再寫代碼開始寫業(yè)務(wù)代碼之前先回答三個問題系統(tǒng)給誰用、部署在哪里、誰來維護。火車訂票系統(tǒng)在 C# 生態(tài)里有三種常見形態(tài)選型直接決定你后面要寫多少界面代碼、能不能方便地?fù)Q數(shù)據(jù)庫、以及項目寫到一半會不會因為架構(gòu)問題返工。2.1 三種形態(tài)WinForms、WPF、ASP.NET Core 怎么選如果你做的是課程設(shè)計或公司內(nèi)部的小工具最常見的選擇是 WinForms。它拖控件就能出界面DataGridView 綁個 DataTable 就能展示車次列表開發(fā)速度最快答辯演示也直觀。缺點同樣明顯界面樣式老舊部署時目標(biāo)機器要裝對應(yīng)版本的 .NET Desktop Runtime而且窗體代碼很容易越寫越臃腫最后 SQL 全部拼在按鈕點擊事件里調(diào)試一次要重啟一次窗口。如果你對界面有要求可以考慮 WPF。WPF 的綁定和樣式機制更適合做出復(fù)雜的座位選擇界面但 MVVM、依賴屬性、觸發(fā)器這些東西的學(xué)習(xí)成本對新手不太友好一個訂票系統(tǒng)的主要工作量會從業(yè)務(wù)邏輯轉(zhuǎn)移到界面框架上時間容易失控。如果想做一個真正能上線、手機和網(wǎng)頁都能訪問的系統(tǒng)我建議選擇 ASP.NET Core WebAPI 加一個簡單的前端頁面。這種形態(tài)沒有 WinForms 那樣的窗體生命周期業(yè)務(wù)層以 Controller 為入口天然適合對接小程序或網(wǎng)頁客戶端。缺點是得額外維護一套前端工作量會大不少。三者對比我一般這樣看形態(tài)適用場景界面開發(fā)速度部署成本我的建議WinForms課程設(shè)計、內(nèi)部工具快拖控件即可需裝 Desktop Runtime練手首選WPF復(fù)雜界面、座位圖慢需先學(xué) MVVM需裝 Desktop Runtime對 UI 有執(zhí)念再選ASP.NET Core WebAPI線上系統(tǒng)、多端訪問需額外寫前端只需 .NET Runtime簡歷/生產(chǎn)推薦我的建議比較直接如果你的目標(biāo)是快速跑通整個業(yè)務(wù)閉環(huán)、把精力放在事務(wù)和并發(fā)上選 WinForms后面章節(jié)的代碼也按 WinForms 來寫如果你是想拿這個項目做簡歷上的代表作選 ASP.NET Core業(yè)務(wù)層代碼幾乎可以平移過去。還有一個隱藏因素數(shù)據(jù)庫。WinForms 項目最常見的搭配是 SQL Server LocalDB 或 Express部署簡單如果機器上沒裝 SQL Server也可以換成 SQLite但 SQLite 的并發(fā)寫鎖比 SQL Server 嚴(yán)格得多后面章節(jié)講的并發(fā)方案要相應(yīng)調(diào)整。2.2 三層架構(gòu)拆分UI、BLL、DAL 的職責(zé)邊界不管選哪種界面形態(tài)我都強烈建議把項目拆成三層。一個典型的解決方案結(jié)構(gòu)是這樣TrainBooking.sln ├── TrainBooking.Model # 實體類ScheduleInfo、OrderInfo ├── TrainBooking.DAL # 數(shù)據(jù)訪問層只負(fù)責(zé) SQL 和數(shù)據(jù)庫交互 ├── TrainBooking.BLL # 業(yè)務(wù)邏輯層余票扣減、下單、退票規(guī)則 ├── TrainBooking.UI # WinForms 界面只負(fù)責(zé)展示和用戶輸入 └── TrainBooking.Common # 連接字符串、密碼哈希、訂單號生成等公共方法這樣拆有實打?qū)嵉暮锰?。第一業(yè)務(wù)規(guī)則可以單測。比如退票邏輯你不需要打開窗體直接調(diào)用 BLL 的 CancelOrder 方法就能驗證狀態(tài)流轉(zhuǎn)。第二換界面不換業(yè)務(wù)。昨天用 WinForms明天想改成 WebAPIUI 層扔掉BLL 和 DAL 原封不動。第三連接字符串和 SQL 不會散落在各處換一臺數(shù)據(jù)庫服務(wù)器只改一個配置文件。我見過太多把數(shù)據(jù)庫操作直接寫在 Form 里的項目一個按鈕點擊事件里幾百行代碼查詢、更新、彈窗全混在一起。分層之后DAL 只負(fù)責(zé)拿到參數(shù)、執(zhí)行 SQL、返回結(jié)果BLL 只負(fù)責(zé)判斷業(yè)務(wù)規(guī)則UI 只負(fù)責(zé)把用戶輸入傳給 BLL 再綁定結(jié)果。出了問題可以按層排查界面表現(xiàn)異常查 UI業(yè)務(wù)規(guī)則不對查 BLL數(shù)據(jù)不對查 SQL不用再從幾十個事件方法里翻找。實體類在 DAL 和 BLL 之間傳遞數(shù)據(jù)。以車次信息為例namespace TrainBooking.Model; public class ScheduleInfo { public int ScheduleId { get; set; } public string TrainNo { get; set; } string.Empty; public string StartStation { get; set; } string.Empty; public string EndStation { get; set; } string.Empty; public TimeSpan DepartTime { get; set; } public TimeSpan ArriveTime { get; set; } public byte SeatType { get; set; } public int RemainingCount { get; set; } public int TotalCount { get; set; } }這里 DepartTime 和 ArriveTime 用 TimeSpan 而不是 DateTime因為車次表里存的是每天幾點發(fā)車這個重復(fù)性時刻不是某個具體時間點。很多初學(xué)者在這里用 DateTime后面查票時還得反復(fù)做日期拼接純屬給自己挖坑。連接字符串放在 Common 層的一個靜態(tài)類里讀取 App.config 或 appsettings.json換服務(wù)器時只改一處。另外密碼不要在數(shù)據(jù)庫里明文存儲注冊時用加鹽哈希后存 Hash 列這是訂票系統(tǒng)的底線。.NET 的文檔不建議新代碼繼續(xù)用 MD5練手項目至少也得用 SHA256 加鹽比大部分課程設(shè)計已經(jīng)強了。三層架構(gòu)的代價是多寫一層代碼但對訂票系統(tǒng)這個業(yè)務(wù)復(fù)雜度來說這點代價非常值得。后面章節(jié)里所有代碼我都按這個分層來組織你可以在自己的項目里直接照抄這個結(jié)構(gòu)。3. 數(shù)據(jù)庫設(shè)計五張核心表與余票扣減的關(guān)鍵約束數(shù)據(jù)庫設(shè)計是訂票系統(tǒng)最容易返工的部分。返工不是因為表不夠多而是因為一開始沒想清楚余票這個數(shù)據(jù)模型。把余票拆成獨立的表而不是在車次表里放一個 RemainingCount 字段這是整個設(shè)計的第一個關(guān)鍵決策。3.1 核心表結(jié)構(gòu)用戶、車次、排班、余票、訂單怎么建先看建表腳本我把一個最小可用的訂票系統(tǒng)拆成了五張表CREATE TABLE Users ( UserId INT IDENTITY PRIMARY KEY, Username NVARCHAR(50) NOT NULL UNIQUE, PasswordHash NVARCHAR(64) NOT NULL, -- 哈希后的密碼不存明文 RealName NVARCHAR(50) NOT NULL, IdCardNo NVARCHAR(18) NOT NULL ); CREATE TABLE Trains ( TrainId INT IDENTITY PRIMARY KEY, TrainNo NVARCHAR(20) NOT NULL UNIQUE, -- 車次號如 G1234 TrainType TINYINT NOT NULL, -- 1高鐵 2動車 3普速 StartStation NVARCHAR(50) NOT NULL, EndStation NVARCHAR(50) NOT NULL ); CREATE TABLE Schedules ( ScheduleId INT IDENTITY PRIMARY KEY, TrainId INT NOT NULL REFERENCES Trains(TrainId), DepartDate DATE NOT NULL, -- 只存日期 DepartTime TIME NOT NULL, -- 每天的發(fā)車時刻 ArriveTime TIME NOT NULL, CONSTRAINT UQ_Schedule UNIQUE (TrainId, DepartDate) ); CREATE TABLE SeatInventory ( InventoryId INT IDENTITY PRIMARY KEY, ScheduleId INT NOT NULL REFERENCES Schedules(ScheduleId), SeatType TINYINT NOT NULL, -- 1二等座 2一等座 3硬臥 4軟臥 TotalCount INT NOT NULL, RemainingCount INT NOT NULL, CONSTRAINT UQ_Inventory UNIQUE (ScheduleId, SeatType) ); CREATE TABLE Orders ( OrderId INT IDENTITY PRIMARY KEY, OrderNo NVARCHAR(32) NOT NULL UNIQUE, -- 對外訂單號 UserId INT NOT NULL REFERENCES Users(UserId), ScheduleId INT NOT NULL REFERENCES Schedules(ScheduleId), SeatType TINYINT NOT NULL, TicketCount INT NOT NULL, Status TINYINT NOT NULL DEFAULT 1, -- 1已支付 2已退票 3已過期 CreateTime DATETIME NOT NULL DEFAULT GETDATE(), CancelTime DATETIME NULL );有幾個設(shè)計點值得說清楚。Trains 和 Schedules 分開是因為一趟列車如 G1234每天都在跑如果車次直接帶日期同一趟車每天都要復(fù)制一份始發(fā)站、終到站、車次號這些不變信息數(shù)據(jù)冗余而且改一個站名要改幾百行。Schedules 表用 (TrainId, DepartDate) 唯一約束從數(shù)據(jù)庫層面杜絕同一趟車同一天被重復(fù)錄入人工維護車次數(shù)據(jù)時這個約束特別有用。SeatInventory 是余票的核心。為什么單獨建表而不是在 Schedules 上掛一個 RemainingCount因為一趟車有多種席別二等座、一等座、硬臥、軟臥的庫存互相獨立拆成行才能各自扣減、各自加鎖。RemainingCount 落在獨立的行上數(shù)據(jù)庫行鎖才能精確控制并發(fā)。Orders 表則承擔(dān)交易憑證的角色OrderNo 對外唯一客戶退款、改簽都靠這個號碼定位。索引方面查詢車次的典型條件是始發(fā)站、到達站、出發(fā)日期所以 Trains 加一個 (StartStation, EndStation) 聯(lián)合索引Schedules 加一個 DepartDate 索引Orders 的 OrderNo 已經(jīng)由 UNIQUE 約束自動帶索引。如果用戶要查歷史訂單給 Orders.UserId 加一個非聚集索引否則按用戶查訂單會掃全表。3.2 余票扣減為什么先查再改一定會超賣余票扣減是訂票系統(tǒng)里最容易出事的一段代碼。新手最常見的寫法是兩步走先 SELECT 余票判斷大于 0 再 UPDATE 減一。這個邏輯單用戶下沒問題一旦兩個用戶同時買最后一張票就會同時讀到 RemainingCount 等于 1同時通過判斷同時執(zhí)行 UPDATE最終結(jié)果是兩個人下單成功余票變成 -1。這就是典型的超賣。正確的做法是讓扣減變成一個原子操作把判斷和更新合并到一條 SQL 里UPDATE SeatInventory SET RemainingCount RemainingCount - count WHERE ScheduleId scheduleId AND SeatType seatType AND RemainingCount count這條語句在 SQL Server 里執(zhí)行時會對命中的行加排他鎖兩個并發(fā)事務(wù)同時執(zhí)行時第二個事務(wù)會一直等到第一個提交或回滾然后重新讀取行數(shù)據(jù)發(fā)現(xiàn) RemainingCount 已經(jīng)不足更新影響行數(shù)為 0。代碼只需要判斷 ExecuteNonQuery 的返回值等于 0 就是庫存不足等于 1 才是扣減成功。這里有一個隱含的坑UPDATE 語句自帶鎖但 SELECT 和 UPDATE 分開寫的話SELECT 默認(rèn)不加排他鎖讀到的可能是已提交的舊值。所以要么像我上面這樣把判斷放進 UPDATE 的 WHERE要么給 SELECT 加 WITH (UPDLOCK) 提示強制加更新鎖。前者簡單直接推薦優(yōu)先用。注意判斷余票是否扣減成功唯一可靠信號是 ExecuteNonQuery 的返回值不要依賴扣減前先查一次的舊值。返回值 0 時事務(wù)里后續(xù)步驟不應(yīng)繼續(xù)執(zhí)行必須回滾并返回失敗。另外一個容易被忽略的問題是扣減順序。在一個訂單事務(wù)里先扣余票再插訂單比反過來的死鎖概率低。因為所有事務(wù)都按同樣的順序拿鎖就不容易出現(xiàn)兩個事務(wù)各自持有一把鎖又等對方釋放鎖的循環(huán)等待。記住這個原則多個資源要按固定順序加鎖。最后再加一道數(shù)據(jù)庫防線給 SeatInventory 建一個CHECK (RemainingCount 0)約束萬一業(yè)務(wù)層有漏洞數(shù)據(jù)庫層面還能兜底這個約束的成本幾乎可以忽略。4. 核心功能落地查票、下單、退票的代碼實現(xiàn)這一章把三個核心業(yè)務(wù)操作完整寫出來。代碼里用的都是 SqlClient 的同步方法WinForms 下我會在界面層用異步方式調(diào)用避免卡界面具體見 5.4 的坑。所有方法都按 BLL 層來設(shè)計不依賴任何控件類型。4.1 查票參數(shù)化查詢與 DataTable 綁定查票接口的輸入是出發(fā)站、到達站、出發(fā)日期輸出是符合條件的車次和對應(yīng)席別余票。SQL 需要關(guān)聯(lián) Trains、Schedules、SeatInventory 三張表public DataTable QueryTickets(string fromStation, string toStation, DateTime departDate) { const string sql SELECT s.ScheduleId, t.TrainNo, t.StartStation, t.EndStation, s.DepartTime, s.ArriveTime, i.SeatType, i.RemainingCount FROM Schedules s INNER JOIN Trains t ON s.TrainId t.TrainId INNER JOIN SeatInventory i ON s.ScheduleId i.ScheduleId WHERE t.StartStation fromStation AND t.EndStation toStation AND s.DepartDate departDate ORDER BY s.DepartTime, i.SeatType; using var conn new SqlConnection(_connString); using var cmd new SqlCommand(sql, conn); cmd.Parameters.AddWithValue(fromStation, fromStation); cmd.Parameters.AddWithValue(toStation, toStation); cmd.Parameters.AddWithValue(departDate, departDate.Date); var adapter new SqlDataAdapter(cmd); var table new DataTable(); adapter.Fill(table); return table; }關(guān)鍵點有三處。第一所有查詢條件都用 SqlParameter 傳參絕不能拼字符串。拼字符串的后果是用戶輸入特殊內(nèi)容時SQL 語句被注入改寫輕則查詢異常重則數(shù)據(jù)被刪。第二departDate 傳參前調(diào)用 .Date 把時分秒清零。如果界面用日期控件取到的值往往帶當(dāng)前時間直接用會導(dǎo)致 DepartDate 是 2024-05-01 00:00:00 但參數(shù)是 2024-05-01 14:30:00等值匹配永遠(yuǎn)查不到數(shù)據(jù)。第三函數(shù)返回 DataTable 是 WinForms 場景下的便捷做法直接賦值給 DataGridView.DataSource 就能顯示省去手工逐行賦值。有一個細(xì)節(jié)要提醒AddWithValue 在某些版本的 SQL Server 驅(qū)動下可能把參數(shù)類型推斷為 NVARCHAR導(dǎo)致查詢優(yōu)化器生成不了好的執(zhí)行計劃。如果你的系統(tǒng)數(shù)據(jù)量大、查詢慢可以改成顯式類型聲明cmd.Parameters.Add(new SqlParameter(departDate, SqlDbType.Date) { Value departDate.Date });cmd.Parameters.Add(new SqlParameter(departDate, SqlDbType.Date) { Value departDate.Date });這個寫法明確告訴數(shù)據(jù)庫參數(shù)是 DATE 類型避免隱式轉(zhuǎn)換導(dǎo)致索引失效。項目規(guī)模小的時候不必較真但如果出現(xiàn)同一 SQL 每次都在編譯的現(xiàn)象先檢查這里。4.2 下單事務(wù)包裹的原子扣減與訂單生成下單是訂票系統(tǒng)的核心事務(wù)必須保證余票扣減和訂單插入要么一起成功要么一起回滾。我用 SqlTransaction 把兩步包起來public bool BookTicket(int userId, int scheduleId, byte seatType, int count, out string orderNo) { orderNo string.Empty; using var conn new SqlConnection(_connString); conn.Open(); using var tx conn.BeginTransaction(); try { // 第一步原子扣減余票扣不動直接失敗 const string updateSql UPDATE SeatInventory SET RemainingCount RemainingCount - count WHERE ScheduleId scheduleId AND SeatType seatType AND RemainingCount count; using (var updateCmd new SqlCommand(updateSql, conn, tx)) { updateCmd.Parameters.AddWithValue(count, count); updateCmd.Parameters.AddWithValue(scheduleId, scheduleId); updateCmd.Parameters.AddWithValue(seatType, seatType); if (updateCmd.ExecuteNonQuery() 0) { tx.Rollback(); return false; // 余票不足或車次不存在 } } // 第二步生成訂單號插入訂單 orderNo GenerateOrderNo(); const string insertSql INSERT INTO Orders (OrderNo, UserId, ScheduleId, SeatType, TicketCount, Status) VALUES (orderNo, userId, scheduleId, seatType, count, 1); using (var insertCmd new SqlCommand(insertSql, conn, tx)) { insertCmd.Parameters.AddWithValue(orderNo, orderNo); insertCmd.Parameters.AddWithValue(userId, userId); insertCmd.Parameters.AddWithValue(scheduleId, scheduleId); insertCmd.Parameters.AddWithValue(seatType, seatType); insertCmd.Parameters.AddWithValue(count, count); insertCmd.ExecuteNonQuery(); } tx.Commit(); return true; } catch { tx.Rollback(); throw; } }這段代碼有兩個重要設(shè)計。第一扣減余票和插入訂單共用同一個連接和同一個事務(wù)這是為了保證一致性。如果不用事務(wù)扣減成功但插入訂單時斷電余票就莫名其妙少了反過來訂單插入成功但扣減失敗就會出現(xiàn)空頭訂單。第二余票扣減放在事務(wù)最前面所有請求都按同一順序拿鎖降低死鎖概率。ExecuteNonQuery 返回 0 時立即回滾返回 false調(diào)用方可以提示余票不足。注意這里把支付和下單合并成一步是為了聚焦庫存一致性。真實系統(tǒng)通常先建待支付訂單支付回調(diào)確認(rèn)后再把狀態(tài)改成已支付。那個狀態(tài)流轉(zhuǎn)的原則與此處完全一致——狀態(tài)更新必須帶當(dāng)前狀態(tài)條件。訂單號的生成方法我一般這樣寫private static string GenerateOrderNo() { var now DateTime.Now; return now.ToString(yyyyMMddHHmmssfff) Random.Shared.Next(1000, 9999); }時間戳加隨機數(shù)的組合在演示項目里夠用但你要知道它的局限同一毫秒內(nèi)多個請求理論上有碰撞可能。生產(chǎn)環(huán)境我建議用全局自增序列或 Redis INCR 生成訂單號避免撞號或者干脆讓數(shù)據(jù)庫自增主鍵對外暴露雖然不好看但保證唯一。4.3 退票狀態(tài)守衛(wèi)與余票回補退票比下單容易但同樣有陷阱。最常見的錯誤是直接 UPDATE Orders SET Status 2 然后回補余票完全沒有檢查訂單當(dāng)前狀態(tài)。如果用戶把退票請求發(fā)兩次或者管理端代退后用戶自己又退了一次余票會被回補兩次系統(tǒng)里憑空多出票來。正確的退票要先做狀態(tài)守衛(wèi)只允許把已支付的訂單改成已退票public bool CancelOrder(string orderNo) { using var conn new SqlConnection(_connString); conn.Open(); using var tx conn.BeginTransaction(); try { // 第一步狀態(tài)守衛(wèi)只有 Status 1 的訂單能退 const string updateOrderSql UPDATE Orders SET Status 2, CancelTime GETDATE() WHERE OrderNo orderNo AND Status 1; int affected; using (var cmd new SqlCommand(updateOrderSql, conn, tx)) { cmd.Parameters.AddWithValue(orderNo, orderNo); affected cmd.ExecuteNonQuery(); } if (affected 0) { tx.Rollback(); return false; // 訂單不存在或已處于不可退狀態(tài) } // 第二步按訂單的席別和數(shù)量回補余票 const string restoreSql UPDATE i SET i.RemainingCount i.RemainingCount o.TicketCount FROM SeatInventory i INNER JOIN Orders o ON i.ScheduleId o.ScheduleId AND i.SeatType o.SeatType WHERE o.OrderNo orderNo; using (var cmd new SqlCommand(restoreSql, conn, tx)) { cmd.Parameters.AddWithValue(orderNo, orderNo); cmd.ExecuteNonQuery(); } tx.Commit(); return true; } catch { tx.Rollback(); throw; } }UPDATE Orders 的 WHERE 條件里帶 Status 1 就是冪等守衛(wèi)。第一次退票成功訂單狀態(tài)變成 2第二次執(zhí)行同樣的語句WHERE 匹配不到行影響行數(shù)為 0直接返回失敗余票也不會二次回補。這個模式在支付回調(diào)、退款、改簽等所有狀態(tài)流轉(zhuǎn)場景里都適用?;匮a余票的 SQL 用 UPDATE FROM JOIN 語法從 Orders 中取回 TicketCount 和 SeatType與 SeatInventory 按 ScheduleId 和 SeatType 關(guān)聯(lián)。注意賦值方向左邊 RemainingCount 加的是訂單里的票數(shù)而不是固定加 1。一張訂單可能包含多張票按固定值回補必然出錯。5. 踩坑與排查訂票系統(tǒng)最容易翻車的五個場景這一章整理的是我在類似項目里真實踩過、也幫別人排查過的五個高頻問題。每一個都按現(xiàn)象 → 原因 → 解決三段式展開你可以直接對照排查。5.1 并發(fā)超賣最后一張票被賣給了三個人現(xiàn)象用多線程模擬 50 個用戶同時搶同一車次的最后 1 張票數(shù)據(jù)庫里出現(xiàn)了多張成功訂單余票變成負(fù)數(shù)。原因業(yè)務(wù)代碼先 SELECT 余票再 UPDATE兩個請求同時讀到余票為 1同時通過判斷各自生成訂單。這是典型的檢查與動作分離導(dǎo)致的競態(tài)條件。解決把判斷合并進 UPDATE 語句用影響行數(shù)判斷是否成功代碼見 4.2 的 BookTicket。另外給 SeatInventory 建CHECK (RemainingCount 0)約束作為最后一道防線萬一業(yè)務(wù)層有漏洞數(shù)據(jù)庫層面還能兜底。這個約束成本極低強烈建議加上。5.2 連接池耗盡只 Open 不 Dispose 的后果現(xiàn)象程序運行一段時間后操作數(shù)據(jù)庫時報錯連接池已滿或超時時間已到尚未從池中獲取連接。原因SqlConnection 打開后沒有釋放。連接池默認(rèn)最大連接數(shù)是 100每次連接用完后如果只是 Close 而沒有 Dispose異常路徑提前 return 時連接就永遠(yuǎn)留在池里很快把連接池占滿。解決所有 SqlConnection 的創(chuàng)建一律用 using 聲明。C# 的 using 會自動調(diào)用 Dispose等價于把連接歸還連接池。如果項目里有手寫 DBHelper 的老代碼見到 new SqlConnection 后面沒有 using 或沒有 Close 的一律改掉。這是一個可以在代碼評審時快速核查的點用一個正則就能掃出來。5.3 日期格式化陷阱查當(dāng)天車票卻查不到現(xiàn)象用戶在界面上選了 2024-05-01查詢結(jié)果為空但數(shù)據(jù)庫里明明有當(dāng)天車次。原因最常見的是參數(shù)類型不匹配。日期選擇控件的值帶時分秒比如 2024-05-01 14:30:00而 Schedules.DepartDate 列是 DATE 類型等值比較時數(shù)據(jù)庫把參數(shù)隱式轉(zhuǎn)換實際變成 2024-05-01 00:00:00 與 2024-05-01 14:30:00 比較自然不相等。解決傳入?yún)?shù)前統(tǒng)一使用 departDate.Date 把時間清零參數(shù)顯式聲明為 SqlDbType.Date。查詢條件堅持用參數(shù)化不要日期 ToString 后拼進 SQL。遇到當(dāng)天查不到但前一天能查到的詭異問題第一反應(yīng)就去看日期參數(shù)的值十有八九是這里。5.4 UI 線程假死同步查詢阻塞窗口現(xiàn)象點擊查詢按鈕后窗口標(biāo)題出現(xiàn)未響應(yīng)過幾秒才恢復(fù)期間窗口無法拖動、無法關(guān)閉。原因WinForms 的按鈕點擊事件跑在 UI 線程上同步執(zhí)行數(shù)據(jù)庫查詢時UI 線程被阻塞消息循環(huán)無法處理重繪和鼠標(biāo)消息。數(shù)據(jù)量一大阻塞時間就越明顯。解決把數(shù)據(jù)庫調(diào)用放到后臺線程用 async/await 回到 UI 線程更新界面private async void btnQuery_Click(object sender, EventArgs e) { btnQuery.Enabled false; try { var from txtFrom.Text.Trim(); var to txtTo.Text.Trim(); var date datePicker.Value.Date; var table await Task.Run(() _ticketService.QueryTickets(from, to, date)); dataGridView1.DataSource table; } catch (Exception ex) { MessageBox.Show(查詢失敗 ex.Message); } finally { btnQuery.Enabled true; } }這里用到 Task.Run 把同步的 DAL 方法丟到線程池執(zhí)行await 之后自動回到 UI 線程更新 DataGridView。按鈕在查詢期間禁用避免用戶重復(fù)點擊疊加請求。注意async void 只能用在事件處理器這類沒有調(diào)用方的場景普通方法一律返回 Task否則異常會直接逃逸到同步上下文導(dǎo)致進程崩潰。5.5 重復(fù)下單雙擊一次生成兩個訂單現(xiàn)象用戶雙擊確認(rèn)按鈕或者網(wǎng)絡(luò)慢時連點多次數(shù)據(jù)庫里同一個用戶對同一個車次生成了兩條訂單。原因按鈕點擊事件沒有防重后端也沒有冪等判斷。前端禁用按鈕只能擋住正常人擋不住雙擊事件和網(wǎng)絡(luò)重試。解決前端在提交后立即禁用按鈕同時在數(shù)據(jù)庫層面加一道唯一約束。下單前由調(diào)用方生成一個請求標(biāo)識Orders 表增加 RequestId 列并建唯一索引第一次插入成功第二次插入同樣的 RequestId 會因為唯一約束被拒。事務(wù)里可以先查這個 RequestId 是否已存在存在就直接返回已有訂單不存在才走完整的扣減流程。雙重防護之下重復(fù)點擊的后果被徹底堵死。6. 并發(fā)壓測驗證你的余票扣減真的不會超賣寫完了業(yè)務(wù)代碼不能直接就說系統(tǒng)沒問題。訂票系統(tǒng)這種并發(fā)業(yè)務(wù)驗證手段就是模擬大量用戶同時搶票看最終訂單數(shù)和余票數(shù)是否對得上。我會寫一個小的控制臺壓測程序直接調(diào)用 BLL 層的方法繞開 UIstatic async Task Main(string[] args) { var service new TicketService(your_connection_string); // 假設(shè)數(shù)據(jù)庫里某車次 ScheduleId1001SeatType1RemainingCount1 const int userId 1; const int scheduleId 1001; const byte seatType 1; int success 0, fail 0; var tasks new ListTask(); for (int i 0; i 200; i) { tasks.Add(Task.Run(() { bool ok service.BookTicket(userId, scheduleId, seatType, 1, out _); if (ok) Interlocked.Increment(ref success); else Interlocked.Increment(ref fail); })); } await Task.WhenAll(tasks); Console.WriteLine($成功 {success}失敗 {fail}); }這個壓測有幾個要點。第一200 個任務(wù)并發(fā)調(diào)用同一個 BLL 方法直接測核心事務(wù)邏輯不摻雜界面因素。第二使用 Interlocked 累加結(jié)果因為 int 的 在并發(fā)下不是原子的直接寫 success 統(tǒng)計會丟數(shù)據(jù)。第三壓測前手動把余票改為 1壓測后驗證成功數(shù)是否恰好為 1。如果成功數(shù)大于 1說明你的扣減邏輯還有競態(tài)條件回到 3.2 檢查。壓測結(jié)果正常后再進一步觀察鎖等待。在 SQL Server 上執(zhí)行 sp_who2 或查看 sys.dm_tran_locks確認(rèn)同一時刻只有少量會話處于等待鎖狀態(tài)。如果等待會話特別多說明事務(wù)持有鎖的時間過長優(yōu)先檢查 4.2 里事務(wù)內(nèi)有沒有多余的查詢操作把查詢移出事務(wù)能顯著縮短持鎖時間。對于更高要求的場景可以再用 WITH (UPDLOCK) 寫一個備用方案事務(wù)內(nèi)先 SELECT 余票并加更新鎖阻塞其他事務(wù)的更新直到當(dāng)前事務(wù)結(jié)束然后再做業(yè)務(wù)判斷和 UPDATE。它適合業(yè)務(wù)判斷比較復(fù)雜、沒法塞進一條 UPDATE 的場景代價是持鎖時間更長。我的習(xí)慣是能用原子 UPDATE 就用原子 UPDATEUPDLOCK 只做兜底。壓測做到這個程度你的訂票系統(tǒng)在并發(fā)扣減這一關(guān)就站得住腳了。我自己的習(xí)慣是把這個壓測代碼留在項目里每次改完數(shù)據(jù)庫或事務(wù)邏輯就跑一遍余票從 1 變成 0、成功數(shù)永遠(yuǎn)是 1才敢放心把系統(tǒng)交給業(yè)務(wù)方使用。寫代碼容易真正讓人放心的是驗證過邊界條件的代碼。希望這篇筆記能幫你把 C# 火車訂票系統(tǒng)做扎實也少走我當(dāng)年走過的那些彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美人妻精品| 亚洲色图图片| 99热99re超碰精品| 日韩中文字幕二区| 欧美啪啪女女| 日本三级网页| 免费强奸av| 亚洲婷婷综合网| 狠狠操狠狠燥| 一区二区三区无卡视频在线观看| 99热精品在线在线| www.色婷婷色综合| 日本操嫩b网| 色呦呦国产精品免费看| 伊人操| 激情综合网一盗摄| 白 大 人妻 区 在线| 免费看美国人人爽,人人操| www色色色com| 日韩性爱小视频在线观看| 九九综合九九综合| 日韩无码人妻| 亚洲午夜福利视频| 亚洲精品视频在线播放| 久久婷婷亚洲| www.狠狠操| 婷婷大香蕉| 二色av| 91爆操视频| 国产最新小视频在线播放下载| 97亚洲在线| 福利天天都操| 久久久无码精品人妻二区| 午夜精品久久久久久久| 91n.欧美| 播播亚洲小说亚洲| 韩国一级婬片A片无码天美| 网站A V在线| 天天干人人看综合| 国产欧美日韩一区二区三区| 全球成人中文在线| 另类小说五月天| 精品少妇一区二区三区在线视频| 东京热免费视频| 超碰免费在线| 1区2区3区在线视频| 欧美拳交在线播放| 国产久久久9999| 超碰79人人乐| 亚洲综合113页| 二对二中文字幕。| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 欧美高清在线| 一区二区三区一亚洲中文字幕、综合区灬 | 中文激情网| 7777欧美成是人在线观看| 久久一区二区三区入口| 2011国产精品| 亚洲AV不卡在线观看尤物| 亚洲区限制级| 中文字幕无码不卡啪啪| 欧美成人精品欧美一级乱黄一区二…| 日产操逼| 五月天黄色av| 亚洲 综合 第一页| 国产白丝av| 国产一区二区三区白丝| 久久久久久久人妻| 国产91影院| 被男人吃奶很爽的毛片| 一本道综合色图| 色女女女导航| 国产精品久久久久久久久久二区三区| 国产性爱强奸乱伦大全| 99在线观看| 日日夜夜青青草母狗| 加勒比五月天| 午夜精品久久99蜜桃的功能章节| 人人摸人人添人人操| 色婷婷狠狠18禁| 欧美九九爱| 操逼999| 一二三区视频在线观看| 男女性感激情网站| 黑操B| …中文字幕亚洲乱,97人妻无码费视… | 亚洲图片欧美| 日韩欧美午夜视频在线| 天天舔九色婷婷| 国内毛片四区| 日韩乱中文 | 免费成人在线观看91| 男男H黄动漫啪啪无遮挡网站| 97干在线看| 国产丁香精品露脸视频| 人妻丰满熟妇一区二区三| 992这里有精品| 久久久久人| 中文字幕天堂在线| 五十路熟女人妻一区二区在线观看 | 中文字幕五月婷婷免费| 91丝袜在线观看视频在线观看| 偷拍片久久| 97国产精品| 无码国产精品午夜不卡(| 亚洲自拍另类丝袜综合| 久久久精品网站| 色五月婷婷久久| 18禁精品网站在线看| 久久天天性久久伊人| 亚州色阁| 亚洲一欧洲中文字幕在线| caopeng97人妻| 91综合中文字幕| 99热综合| 少妇三p| 亚洲操人| 日韩内| 色99在线| 亚洲欧洲日韩中文字幕一区| 色婷婷导航| 久久久精品一区二区| 2018天天干在线视频| 中文字幕亚洲欧美在线不卡| 精品久久久av无码免费| 欧美色图中文字幕| 13小男生GAY自慰脱裤子| 成人婷婷丁香| 久久伊人最新网址视频| 91精品国久久久久久无码| 中文字幕高清精品一区| 亚洲熟妇综合久久久久久| 亚洲一区二区三区不卡国产欧美| 综合视频91| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 91亚州| 看看小穴| 亚洲色图尤物视频| 日本熟妇自慰性高潮一区二区三区| 成人性爱AV在线免费观看| 蜜桃视频精品一区二区三区| 波多野结衣AV无码一区| 9ⅰ久久久天天| 久操婷婷| 免费福利视频中文字幕| 欧美草草| 丁香婷婷激情五月天无毒不卡| 影音先锋新男人| 久久久九精品| 中文字幕日韩综合| 日本成人A片免费看| 大香蕉之青青草原| 欧美图片偷拍| 国产精品女久久久久av爽| 国产97在线播放| 99热久| 色欲Av人妻精品一区二| 风间由美日韩欧美久久| 快点操死我| 91热色| 84YTCOM性无码| 色女女女导航| 日韩无码a片| 67914在线兔费成人视频| 九九性爱网| 白丝AV| 天天操天天谢| 99色悠悠| 麻豆啪啪啪视频| 69一区二区三区 | 97在线/亚洲| 丝袜喷水在线| 熟妇熟女视频一区二区三区| 亚洲Av无码成人精品国产| 男人天堂东京热| 91网站18在线| 福利风月五月天影院| 久久精品国产96精品亚洲拳交| 久久香蕉国产线看观看亚洲女人| 久久久久久中文版| 国精品一区二区三| 小草三级久久观看| 婷婷五月天av| 999国产精品999| av爱爱爱| 欧美日韩国第一区| 9999久久久久| 日本国产欧美高清在线| 大香蕉免费3| 婷婷人妻激情| 女人18精品一区二区三区| 久久伊人网视频一区二区三区| 超碰在线看| 丰满岳乱妇一区二区三区| 超碰97国产欧美| 欧美日韩亚洲五月天婷婷| 国产精品久久发布| 大稥蕉免费视频这里只有精品| 国产偷拍自拍在线视频| 韩日性爱av| 久操91视频| 屁股久久久久久| 国产精品一二三| 久久久久国产| 骚日日av| 欧美亚洲天天| 国产精品农村妇女精品| 欧美性色欧美| 日本大香蕉综合网红本杳社区| 国产视频小说| 欧美体内射精| 78精品在线| 综合自拍| 久久欲| 午夜福利av电影在线| 国产精品久久久久久久电影渣男| 自拍偷拍草一草| 丁香五六月啪啪| 男女啪啪啪18禁网站| 另类图片综合| 欧美五十路熟| 国产自产自拍| 婷婷五月天激情网| 啊啊啊97视频| 伊人嫩草| 日本成a人v网站在线观看| 天天看天天日天天操| 97狠狠| 国产精品懂色tv影视免费观看 | 久草电影网| julia ann久久| 青青草原伊人网| 成人无码欧美一级A片狼牙直播| 日韩欧美女求操每天更新| 农村妇女精品一二区| 久久久久熟女| 日韩日本欧美在线观看| 国产高清在线观看欧美| 99热超碰| 麻豆人妻少妇在线免费观看| 亚洲天天精品| 呦呦一区| 亚洲成熟国产精品美女| 久久久久免费少妇| 东京热熟女亚洲视频网站| 九热超碰| 18啪啪手机免费性爱| 日韩AV无码中文一区二区| 激情专区综合| 韩国女主播青草在线| 亚洲性少妇| 精品国产乱码久久久A| 国产9 9在线 | 亚洲| 围产精品一区二区三区视频播放| 久悠悠av| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 日韩欧美aⅴ综合网站发布| 日韩乱插| 久久久不卡区一区二区三区久久久| 美女丝袜激情小说| 女性喷水高潮在线观看| 99在线免费视频| 亚州春色| 91视频伊人| 欧美精品日韩一区二区| 久日91在线| 少妇的嫩逼图片| 亚洲色色探花| 久久国产99精品72福利| 少妇滛荡视频| 97免费视频网| aa片毛片| 91美女丝袜诱惑视频| 久久99999| 91亚洲欧美| 久久精品色欧美aⅴ一区二区| 少妇毛片久久| 麻豆精品.欧美精品.日韩精品.| xxxx网站亚洲精品| 免费9 1久久| 97综合激情| 无码免费精品高清| 欧美猛交黑寡妇中文字幕| 九九碰九九爱97超碰| 插欧洲美女欧美精品| oumeizonghese,www| 中文字幕av亚洲精品| 最新欧洲欧美日本激情网站| 99精品九九九九九九| 成人性爱美曰韩| 亚州人妻| 日韩欧美大力操| 国产原创精品| 啪啪视频免费在线观看| 中文字幕91综合| 97超碰9| 一区二区三区欧美激情| 97欧美资源| 亚洲中文字幕精品久久久久久直播| 亚洲有码第一页| 国产福利视频精品视频| 久久综合女优| 岛国黄| 一区二区不卡免费| 大香蕉综合| 久久久999国产精品| 免费A V在线| 爱做久久久久久| 日本顶级天天操狠狠操夜夜操中文字幕| 黄人人操人人操| 精品人妻一区二区免费蜜桃| 福利视频一区二区微拍| 人妻大香蕉| 极品色www影院| 狠狠爱大香蕉| 天天做天天爱天天爽AV| 91free福利| 日产精品久久久一区二区| 国产成人自拍视频在线| 美女裸体无遮挡永久免费观看网站| 久久手机视直播| 国产无码精品久久久久久| 日韩中文字幕熟妇人妻| av在线观看不卡网站| 亚洲天堂美臀在线| 蜜臀久久久久久999| 色屁屁影院www国产| 熟女AV一区| 99热伊人| 永久免费av无码网站国产app| 欧美色天堂网在线视频| 欧美视频在线视频免费va| 天天干人人乐| 性生活无遮挡纯毛片在线看| 婷婷91| 欧美性爽xyxOOOO| 久久久久久9999| 大香网伊人久久综合| 日韩欧无码一区二区三区免费不卡| 天天享受天天看| 婷婷深爱五月| 国产 亚洲 一二三四| 欧美激情亚洲情色| 熟妇熟女一区二三区| 精品v日韩欧美国产| 人妻欧美| 大香蕉一人| 夜夜狠狠躁日日躁色视频| 这里都是精品在线观看| 日本性爱欧美性爱| 成人午夜高潮av猛片| 高清不卡 中文 人妻| 极品白嫩福利在线| 97色婷| 交换娇妻呻吟声不停中文字幕| 暴力av在线| 老司机免费视频在线91| 国产一级内射高清视频 | 天天综合中文字幕 91| 欧洲亚洲人妻无码中字久久三区四区| 五月丁香| 国产精品无码论坛| 欧美午夜视频精品久久| 在线免费观看日韩一区| 日韩性爱免费观看视频| 一级二级在线观看| 97碰碰色| 久久香蕉国产线看观看亚洲女人 | 久久精品毛片免费不卡| 欧美的性爱网站免费| 亚洲高清91| 亚洲午夜蜜臀| 日本精品九九九| 黑人精品久久97| 性色avv| 色性综合| 成人资源中文字幕在线观看天天| 成人片在线播放| 亚洲综合一区二区| 免費黃色視頻觀看一| 国产中文精品一区二区在线观看| 国产在线激情视频| 艹精品| 欧美日韩色综合网| 国产第25页在线观看| 国产精品嫩草久久久久| 亚洲av影音先锋| 久久久久亚洲av综合波多野制衣| 另类TS人妖一区二区三区| 亚洲 欧美 日韩 国产一区二区| 亲子敌伦对白在线播放| 成人性爱免费播放| 亚洲国产成人7777| 日本操色导航| 日本精品高清一二区一本到| 在线性黄高清免费视频| 色色色网站| 一区二区 韩日AV| 日本人体九九九九九九| 日本一区二区电影网站| 欧美97视频| 人妻免费观看| 麻豆天美在线| 日韩福利电影网| 国产a片操逼| 成人性爱美曰韩| 色综合婷婷| 青青草这里只有精品| 熟女少妇视频| 亚洲日韩精品久久久久一区壹牛 | 97WW精品| 磁力99AV| 淫穴高潮色图| 成人国产视频在线观看| 新久久AV| 99色色网| 伊人丝袜美腿高跟在线观看高清| 亚洲 欧美 综合 91| 日本一线产区和二线产区伦理片| 日韩成人无码| A片 AV一级在线播放观看免费| www.色婷婷色综合| 九一精品牛牛一区二区| 日韩成人人妻网站| 国产91福利小视频在线观看| 黑人无码一区二区| 澳门成人网站久国产日韩| 99精品人人爽| 老妇女91| av天堂5| 亚洲国产精品乱码在线观看| 美女丝袜激情小说| 先锋影音av先锋一区| 亚洲午夜福利视频| 神马久久69| 97色综合中文网| 在线色导航| 欧州色图区| 人人澡人人澡人人| 国产精品露脸在线观看| 伊人久久青青草| 亚洲人精品午夜不卡| 蜜臀一区二区三区在线 | 嗯嗯啊啊用力视频免费| 丝袜视频网国产90| 日本成人A片免费看| 91老熟女逼| 亚洲少妇综合| 插入粉嫩少妇视频| 91大神精品长腿在线观看网站| 强奸乱伦动态污图免费 | 黑人娇小av在线播放| 国产麻豆一级精品视频| 久久同城AV| 人妻色偷色噜| 九久久九精品视频| 爱逼综合| 日韩一级二级| 2020中文字幕在线观看| 久久99久久99精品免视看婷婷| av线电影| 综合 欧美 亚洲 日本| 青青草在线视频人人想人人上| 少妇精品| 涩五月婷婷| 91中文字幕在线观看| 中文字幕亚洲热播人妻| 青青伊人加勒比海| 性爱乱伦视频免费| 9999九九九久久久| 少妇xx精品| 男人精品天堂一区| 日本高清_区二区三区| 日本大香蕉| 欧美日韩日产免费网站看| 91欧美美女日韩国产婷婷| 岛国黄片网站| 婷婷另类小说| 亚洲中文国际强奸字幕| 屁股久久久久久久久| 成年人一级黄色毛片大全在线观看| 亚洲一区亚洲天堂| 久久精品国产72国产精品福利 | h无码动漫在线观看| 熟女网站最新| 蜜乳av首页| 97亚洲色图| 少妇二级| 艹精品| 亚洲青青草| 九九RE视频在线精品| 亚洲情色 欧美| 国产剧情一区在线观看| 俄罗斯一区二区视频在线观看| 欧美日韩婷婷中文| 免费精品福利在线观看| 综合第一页| 精品人妻一区二区免费蜜桃| 欧美不卡二区| 蜜臀AV午夜精品久| 一本大道综合伊人精品热热| 天堂8在线新版官网| 东北女人高潮视频| 91精品人妻偷情| 欧美色图成人网一区二区 | 丁香五月av| 操逼无码操逼| 国产女主播视频在线观看| 日韩久久三区| www亚洲免费| 丰满熟女人妻一区二区三五十一路| 欧美男人一区| 久草网站免费在线观看| 国产精品久久蜜乳av| 青青草五月天| 亚洲精品视频二区| 亚洲成人久久一区二区| 少妇色| 精人妻无码一区二区三区伊人直播| 丁香啪啪| 亚洲少妇综合在线播放| 亚洲中文字幕在线视频一区二区| 手机av亚洲丝袜美腿日韩第一页二页| 嗯啊啊啊轻点视频 | 日日骚av| 97公开久久| 日韩成人色图| 制服乱伦| 日本三级网页| 黄视频免费| 伊人91| 九九九九九九免费视频| 男人天堂综合| 欧美日韩国产中文精品字幕自在自线,| 美國A片| 国产无码精品成人| 国产精品9999| 97色欧洲| 超碰97极品9| 97精品国产手机| 中文字幕91综合| 亚洲AV成人在线| 国产久久av| 二男一女成人A片| 99久久亚洲精品无码毛片潘甜甜 | 日本综合久久| 99久久网站| 亚洲天堂7777| www.久久最新地址| xxx0国产在线播放| 色综合天天| 成人自拍三级在线观看| 日本性交操一区二区不卡系列| 91亚洲人| 97综合在线| 国内一级精品| 亚洲激情在线| 91色宗合| 啪啪啪综合网| 沈阳熟女高潮对白视频| 免费人成毛片乱码| 91一区二区三区蜜桃| 家庭乱伦麻豆| 国产亚洲深夜激情| 影音先锋新男人| 国产黄色在线播放观看| 26uuu性物| 国产精品久久99日日| 奇米狠999| 日人妻视频91| AAA久久| 丰满人妻一区二区三区四| 欧美熟爽综合| 黄呦呦在线| 在线小视频| 208天天久久九九九| 日韩欧美中文字幕搭讪巨乳美人妻视频| 成人青青草原伊人| 狠狠 91| 96AV久久久| 久久日本熟妇熟色高清| 国产精品粉嫩福利在线| 青青草好吊色| 超碰精品日韩欧美国产| 午夜福利在线合集| 日韩有码一区三区| 日韩啪啪啪视频| 天天在线91| 日韩9区| 一个人免费视频观看在线WWW| ji熟女.com| 亚洲美女AV无码| 五月天婷婷综合网| 狠狠激情综合狠狠操中文字幕| 青女在线| 亚洲欧美91| 国产欧美日韩女同性恋ww喷水精品| 日韩乱码Av| 又摸又舔在线观看网站| 少妇熟女视频一二三区| 久久αⅴ| 91精品久久久久五月天精品| 果冻国产精品麻豆成人av| 男人的天堂在线有码| 中文字幕久久精视频久久大全| 日韩成人人妻网站| 欧美综合91| 精品视频免费在线一区| 人妻熟女字幕一区二区| 久久久久久久六六| 人妻少妇久久中文字幕一区二区 麻豆| 翔田千里无码一区| 久99热| 国产精品亚洲四五区在线观看| 天天日美女的B| 九九无码| av片在线观看免费播放| 97在线欧洲| 久久久一区二区三区麻豆| 激情五月综合开心五月| 色噜噜狠狠色综合日日| 日韩av色图| 沈阳熟女高潮对白视频| 国产精品久久久鸭无码的功能| 国产有码一区| 99夜夜操| 色综合网1| 性性欧美| 亚洲AV无码乱码| 日韩有码一区三区| 九九热只有精品| 国产啊v在线免费播放| 久久久久久久久久久六六| 人妻少妇久久中文| 97在线精品观看视频| 99久久无色码| 天天综合网~91| 欧美性爱伊人| A一级色女| 欧美探花网| 色诱中文字幕| 亚洲精品国产精品成人| 99久久无色码| 美国日韩黄片| 中文字幕制服欧美久久一区| 殴美大黄片| 超碰在线97国产| 亚洲无无码αⅴ每日更新| 一区二区久久天天干狠狠| 女优大全 - 91n| 丁香五月成人| 欧美色性情| 又黄又爽在线观看视频 | 五月丁香综合激情| 97伊人超碰| 噜噜吧,噜噜色,噜噜| 久久一二三四五六七八九区| 黄色高清无码无码破解免费暗网| 偷拍新久久| 9999久久久久| 日韩综合色图| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| AV中亚| 97操97色| 久久久国产av美女私房| 97色色,97综合| 手机在线视频国内精品| 天操天操夜操夜月操月年年操操| 国产激情在线观看| 蜜桃天美传媒AV一区二区三区| 丁香五月电影| 尤物网站91| 国产精品色哟哟| 日韩 欧美 另类 人妻| 久久久性少妇| 人妻少妇一区二区| 干我久操| 亚洲人码13| 免费黄色视频网址| 色欧美综合| 久久超碰免费的| 日韩探花精品在线视频| 国产精品农村妇女| www.高清无码诱惑一区.com | 69一区二区| 东北老女人的激情视频| 国产一区二区在线电影| 亚洲风情在线观看| 91N综合在线| 大香蕉丝袜一级片| 久久性爱视频免费看| 98超碰日本| 中文字幕精品一区二区精品| 日韩免费在线视频观看| 一区二区三区麻豆| 国产精品久久久久久久久久久久久久久久久久| 人妻乱仑一区二区三区| 熟妇乱伦一区二区| 91模特在线观看| 久久综合久久综合人久久夜精品| 日本高清_区二区三区| 婷婷激情四射| 成人日韩3| 99999国产精品| av久日| 青青青国产| 久草大| 免费又黄又裸乳的视频| 老熟女91| 91久久国产精品| 大肉棒导航| 国产久久久9999| 六十路日本| 亚洲自拍天堂| 三级日本一区二区三区| 一本色道久久综合精品婷婷| 日产123区精品免费观看| 99久久无色码| 色色色综合网| 亚洲熟女中文字幕在线| 免费自拍三级综合| 久久精品一区二区一8| 91无码人妻精品一区二区三区蜜桃| 中文字日本乱码| 67914亚洲精品| 999国产精品999| 国产精品麻豆视频网站| 欧美视频一| 2020中文字幕在线观看| 婷婷性网| 色九九久九九| 91精品操美女| 国产自啪精品视频网站黑丝| 伊人aaa| 日本男人插女人的逼黄色| 好湿好紧好爽 视频| 素人播放一区| 首页亚洲国产高跟丝袜诱惑视频| 国产久久久久久久久一区二区| 亚洲精品亚洲人成在线麻豆| 色色福利| 无码 有码 国产18p| 亚乱色| 国产亚洲日本精品在线| 欧美日韩国产高清在线一二三区 | 精品射1999| 久久熟女人| 久久手机视直播| 偷拍 亚洲| 国产四虎在线| 欧美狠狠鲁| 亚洲情色图片区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 女人的天堂大香蕉网| 超碰 av 女人天堂| 九九九九欧美| 久久九九精品一区二区| 亚洲资源吧| 91国模| 思思热在线视频在线| 白丝被操91| 欧美,日韩综合久久| 91成人在线免费视频| 曰韩av中文字幕专区| 亚洲一区二区麻豆影院| 久久9 9 9精品| 级品肉射| 欧美少妇高潮视频| 99色在线视频| 久久国产精品91| 蜜臀99999| 天天综合网亚洲综合网| 亚洲男人的天堂va亚洲男人社| 成人精品无码| 天天色天天干天天射| 亚洲熟女av日韩熟女| 理论久久婷婷网 8| 夜夜国产一区| 撸无码不卡免费视频| 翔田千里AV无码秘 三区| 人人妻人人爽 97人人看碰人免费公开视频 | 久久香蕉综合一本到3atv| 色色婷婷五月天| 97这里都是精品| 中文字幕av片| 日韩免费中文字幕视频| 色爱三区| 7月婷婷综合| 大香蕉色欲AV| 午夜精品久久一区二区| 中国国国产一级特黄毛片| 亚州少妇| 精品无码产区一区二| 日韩在线观看三级电影| 久久久久久精品免费看A级| 欧美淫穴| 亚洲AV人人澡人人爱| 九九九九热| 99久久精品无码一区二区| 熟女啪啪视频| 日本幼女18+| 91深夜夜| 久久的网站啊啊啊啊啊| 密臀成人视频久久久| 韩美日操逼| 欧美国产日韩清纯唯美| 色男人色天堂东京热| 欧美一二三| 97国产成人精品免费视频| 区一二区日韩亚洲乱码av电影| 96国产精品| 日本无码1| 九九热免费在线国产视频伊人五月| 欧美综合色综合| 一类无码操逼视频| 97激情97激情| 亚洲男人天堂av| 亚洲图片欧美在线视频| 激情黄色五月天| 国产精品白丝在线播放| 亚洲色图激情小说| 精品国产a∨一区天美传媒| 国产AV激情无码久久无码| 91av天美性媒精品视频| 狠狠操狠狠操操| 人妻少妇精品一区二区三区| 亚洲成人在线资源| 污污汅18禁网站在线永久免费观看| 久久理论字幕视频| 亚洲欧美日韩激情不卡| 玖玖色综合| 蜜臀99久久精品| 另类一区| 青青伊人这里只有精品| 啊啊啊好舒服好爽啊啊啊视频| 成年无码动漫av片无尽在线| 蜜臀久久99精品久久久久久久久| 亚洲自拍小说| 婷婷色五月激情| 91美女视频。| 这里只有精品久久| 无码人妻一区二区三区四区老鸭窝| 欧美视频边做饭边橾| 九九九九97| 欧美视频一区二区在线| 果冻传媒A片一二三区 | 亚洲清纯综合| 免费看日本操逼视频| 97久久超碰日韩精品| 久久草大香蕉| 伊人网高清| 精品一区二区三区蜜桃臀赵总 | 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 国产精品不卡av免费在线观看| AV天堂丝袜| 欧美成人一级麻豆| 99在线观看无大码| 国产偷拍自拍在线视频| 好一吊区二区| 伊人成人中文字幕久久网| 欧美97| 熟妇精品juliaannAV| 久久成人国产| 亚洲一区二区av| 天天操女人| 国产精品无码久久久久2028| 99日视频在线免费| 熟女人妻av在线资源,黄色的资源| 操东北女人| 日欧毛片久久| 天天色综合天天操| 青草综合| 青青欧洲黑| 婷婷久久网| 久久成年片色大黄全免费网站| 亚洲色图国产另类| 伊人五月天| 国产福利一区二| 黄久在线| 欧美熟妇视频| 秋霞免费AV| 天天操夜夜操| 中文字幕欧美日本乱码一线二线 | 情色图区| 亚洲色性情三级| 国产吞精a级片激情电影| 日本精品一区二区三区四区的功能| 欧美日韩婷婷中文| 婷婷五月天av| 欧美一级久久久久久久大片动画| 国产激情在线| 欧美成人综合| 水澄无码AV| 思思热影视| 男女啪啪网站免费视频| 激情久久日韩精品中文字幕麻豆| 日韩 人妻 精品| 90后性网国产欧美| 蜜乳AV.COM| 天天噜| 欧美色老汉| 天天日天天舔东京热| 亚洲成人网站在线观看| 日韩精品国产一区二区| 久久午夜色播影院免费高清| 肉丝中文无码高清| 啊啊啊在线观看免费视频| 69精品人人人人| 一级特级aaaa毛片免费观看 | 韩国成人精品久久久免费看| 国产精品九九九| 超碰精品97| 97网址97| 九九热在线精品视频| 九九玖玖精品| 婷婷五月天在线观看| www成人啪啪18秘 免费| 人人看欧美性爱| 国产丝袜美女在线一区| 久久69| 欧美综合天堂| 欧美丝袜亚洲| 亚洲综合 欧美| 一区二区三区成人| 国产精品视频播放| 亚洲精品欧洲精品| 狠肏骚人妻| 久久熟女人| 91爱综合| 亚洲有码 视频一区| 九九热超碰| 妺妺跟我一起洗澡没忍住| 艹比视频国产精品| 乳欲人妻办公室奶水| 欧美日韩另类在线播放| 国产欧美在线观看免费观看| 又大又大又大又粗爽高潮观看 | 91久热| 99色在线观看| 久热无码| 亚码激情| 五月天春色激情网| AV一二区| 一区| 精品九九淫乱男| 伊人久久亚洲色欲综合网站| 97精品在线| 做爱A级亚欧| 国产精品久久久久无码A√| 日韩成人私密一级精品av| 97超碰超| 91久久久亚洲| 日韩字幕一区| 日本精品无码三级网站| 蜜乳AV网址| 日本日逼视频网| 特级丰满少妇一级AAAA爱毛片| 久久激情亚洲精品无码?V| 免费自拍三级综合| 免费精品中文字幕| 欧美日韩精品一区二区三区高清| 亚洲欧综合另类无码一区| 超碰成人国产| 天天影视色香色欲| 97国产亚洲中文在线| 九一国产精品| 欧美姓爱综合网| 日本东京热久久久电影| 国产精品一区午夜福利| 91精品黄在线观看| 精品熟女一区=区三区| 传媒免费一区二区三区| 天天性射网| 国产女人视频三四五区| 国产欧美精选激情视频| 十八禁啪啦拍视频无遮挡| 一区二区三区 丝袜 高跟 美腿| 五月天久久婷婷亚洲| 成人开心网在线视频| 日本精品五区| 无码高清专| 夂久色| 一本久久精品中文字| 97色香蕉| 少妇人妻好深太紧了vr91| av资源在线播放天堂| 天天摸夜夜摸| 极品出轨视频网站| 人人看黄色视频| 在线国产探花| 午夜天堂精品久久| 国产精品一区二区三区在线| 偷拍亚洲熟女视频播放| 人妻久久久久久| 九区国产| 网友自拍第一页| 中文字幕性感少妇av| 亚州乱码中文字幕综合久久久| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 粉嫩av在线一区二区| 丝袜内射| 密臀视频三区免费网站| 婷婷午夜成人色中色| 亚洲天堂另类小说男人| 性欧美999| 日韩欧美中文日韩欧美色| 97高清啪啪| 综合欧美亚洲| 大香蕉五月天婷婷| 日韩中文9| 小日子操bb在线看| 97亚洲一区| 大香蕉中文网| 思思热免费视频观看| 伦理弟一页| 92性色国产午夜福利在线661| 志村玲子视频一区二区| 青青草在线视频美女| 91人妻做a观看视频| 三上制服丝AV| 久久精品国产Aⅴ| 韩国一区二区精品亚洲| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 男人高清无码一区二区| 亚洲淫色网中文| 国产精品人妻一区二区| 亚洲美女精品| 丁香色狠狠色综合久久小说| 96精品在线| 亚洲熟女诱惑| 九九色综合| 国产嫩草精品A88AV| 97人人模人人爽人人| 91日日夜夜| 人人摸人人叼| 一区二区三区四区五区久久久久久| 欧美日韩激情无码专区| 天天摸夜夜操视频| 久久久久久亚洲中文| 欧美少妇高潮久久91| 国产日韩欧美中文在线播放| 色偷偷色偷偷欧美日韩| 亚洲āv网址在线观看| 嫩草 人人网精品| 免费αV在线视频| 啊啊啊啊啊好大好舒服想要| 被男人添B超爽视频| 欧美日韩人妻婷婷一区| 日韩一级特黄av毛片| 人澡逼| 精品久久人妻成人网| 蜜臀AV一区二区三区| 长长久久免费视频| 99热| 亚洲Av噜噜一区二区三区妖精| 日日噜噜夜夜狠狠视频无| 亚码人妻| 桃花色涩综合影院| 国产乱子伦久久精品综合一区二区三| 啊啊啊com| 1人人看人人摸人人操| 欧美天天综合站| 伊人五月天| 久操免费在线| 欧美日韩亚洲高清不卡一区二区三区| 久操com| 96超碰网| 色呦呦、国产精品| www.91逼逼.com| 日日夜夜骑| 一区二区三区四区五区高清无码永久视频 | 2017天天插| 久久久久久性爱视频| 天天色黄色影院天天操| 春色综合免费| 91 丝袜在线| 日韩国产乱子伦App| 综合亚洲欧美| 精品视频97| 柠檬AV导航| AV一起草在线| 中文字幕免费在线观看| 日韩天堂av电影在线观看| 亚洲导航深夜福利| 亚洲97在线观看| 日日干夜夜骑| 蜜桃传媒一区二区亚洲| 亚洲 欧美 手机在线观看| 亚洲精品欧洲色| 校园春色中文字幕AV| 日韩人妻少妇 一区二区三区| 欧洲亚洲国产综合在线| 天天躁日日躁狠狠狠躁| av麻豆啪啪| 黑丝内射一区二区三区| 色色色欧美| 一级毛片电影免费看| 亚洲自拍小说| 超碰天天操你比| 性欧美另类高清| 黄aaaaaaaaaaaaaaaaaa色网站| 9色国产精品一区粉嫩| 精品少妇一区二区三区| 久久中文色图| 亚洲日本成人动漫| 日日碰狠狠添天天爽超| 国内精品a| 又大又大又大又粗爽高潮观看| 青青操日韩| 欧美熟女逼久久久久久| 吉田爱美AV在线| 亚洲激情深爱文学小说网站| 亚洲女毛多水多21P| 91AV入口| 亚洲综合20p| 九九五月天| 另类成人首页一区| 久久久久久久久久黄色网 | 国产人妻久久精品一区二区三区| 成人热久久精品| 精品99999久久久久久| 亚洲天堂,男人| 久久久国产成人一区二区三区在线| 欧美日韩另类在线播放| 天天看精品动漫视频一区| 欧美色图第一页| 国产sv美女内射| 极品少妇久久久久| 舔人妻中文免费视频| 黑人粗大V S日韩女优视频| 亚洲男人天堂2016| 97干天天| 精品国产72| 亚州人妻| 91爰爱欧美| 蜜屁Av| 不卡一区视频| 亚洲性猛交| 久久99精品九九久久久婷婷| 久久綜合很很很| 最新精品久久蜜桃| 成人热久久精品| 又摸又舔在线观看网站| 艳尻美人妻| silk lablo在线观看一区二区| 久久国产对白激情浪潮| a人欧美综合天堂麻豆| 磁力99AV| 大乔未久88一区| 亚州九九九精品视频| 风月影院男女十八禁| 欧美在线干| 另类欧美综合| 易易A毛视频| 白丝AV| 国产精品第一区第一页| 亚洲男人久久综合天堂| 欧美日日操| 大香蕉免费乱伦视频| 午夜精品视频777|