狀況一:java
客戶端---------(調用)----------> 服務端 (服務端處理超時,但服務端整個事務處理正常且數據修改正常)。此狀況,無影響。spa
狀況二:code
服務端A-----------(調用)----------->服務端 B (服務端A在整個事務的最後調用服務B)事務
template.execute(new TransactionCallbackWithoutResult(){ try{ .....A事務...... .....A事務...... .....B事務...... } catch(){ transactionStatus.setRollbackOnly(); throw new RuntimeException(e.getMessage()); } });
狀況二---一、當A事務執行成功,B事務執行失敗,則回滾時只會A事務回滾,此時A事務、B事務都會回滾,不會形成數據異常。get
狀況二---二、當A事務執行成功,B事務執行超時可是數據修改爲功,A這邊接受到的信息是B執行失敗,此時A事務回滾。則此時,A數據回滾到原來狀態,B修改數據成功,形成數據異常。(目前解決辦法修改數據(******))it
狀況三:io
template.execute(new TransactionCallbackWithoutResult(){ try{ .....B事務...... .....A事務...... .....A事務...... } catch(){ transactionStatus.setRollbackOnly(); throw new RuntimeException(e.getMessage()); } });
這種狀況下,先調用B事務,當B事務執行成功,再往下執行時,若是出現異常,回滾時,只是回滾A事務,B事務,沒法回滾。class
綜上所述,通常狀況,都是將B事務寫在最後,下降數據異常的風險。狀況二---2 的解決辦法是增長超時時間,目前已增長到5分鐘,出現異常的狀況已降到最小了。。。。。。im