問題: 最近碰到一個比較棘手但是比較低級的問題,一直沒有找到原因,苦找了兩天才發現問題。場景就是訂單做了某一個操作之后(比如揀貨完成)然后到下一步(下道口)。
但是線上幾萬筆訂單 ,只有偶爾幾筆發現,到了下道口操作,但是揀貨明細數據丟失。百思不得其解
背景:A訂單,揀貨操作后,去下道口(改訂單狀態以及明細),下道口完成生成配貨任務量。
現在定義的pda操作是8秒鐘。
觸發流程。點擊揀貨完成。然后跳到下道口頁面 ,揀貨完成接口執行了十幾秒。就會導致前端報超時(其實后端處理中,此時訂單狀態已變成下道口中,但是揀貨數量沒有改變成正確的還是0,這兩個步驟剛好卡在8秒前后),然后進明細還會有一個操作就是吧揀貨為0的貨號自動下道口
超時之后pda操作人員會立即再點擊下道口操作。 此時訂單狀態已經變成下道口了,但是明細表沒有改變狀態以及下道口數量。所以第二次點擊會報訂單狀態待下道口但是明細都已經下道口完成,就會一直報找到不可以下道口的貨號
最終原因就是數據庫執行時間過長(那段時間數據庫有問題? ,然后隔離級別又是默認的 可重復讀)然后后面的下道口頁面也沒有加 讀已提交注解。所以偶爾就有問題
這里說一下? mysql的默認隔離級別? “可重復讀” 和 “讀未提交” 和’‘讀已提交’‘有什么區別
讀未提交:在此隔離級別下,其他事務修改了數據 但是還沒有提交, 該事務也能讀取到
讀提交:在此隔離級別下,一個事務只能看到其他事務已提交的更改。這意味著,同一個事務中的多次查詢可能會看到不同的數據,因為其他事務在此期間可能已經提交了更改。
可重復讀:在此隔離級別下,一個事務啟動時看到的數據是一致的。即使其他事務提交了更改,這些更改對當前事務也不可見,確保事務內的多次查詢結果一致。(默認的)