1. 程式人生 > >對於在@transactional註解起作用的前提下判斷事務是否成功的解決方式

對於在@transactional註解起作用的前提下判斷事務是否成功的解決方式

1、首先資料庫有差異。Mysql一般情況下(myisam引擎)不支援事務,只有innodb引擎支援事務,而且事務是自動提交的。Oracle支援事務的手動提交。Sqlserver(自動提交)

2、Ssm採用註解方式管理事務,採用的是spring提供的DataSourceTransactionManager類來進行管理事務。

當請求到來,spring該類首先判斷是否有該註解,如果有則表示支援事務,於是spring就看當前上下文是否存在事務,如果沒有,就new Transaction,看該事務是否有connection連結與之繫結,沒有就會從連線池拿一個con給當前事務。而jdbc的con預設是自動提交事務的,所以spring就會將自動改為手動,setAutoCommit(false)。在執行完之後又會設定為自動提交。這樣就達到了事務控制業務的目的。

當然如果不打這個Transactional註解,spring就不會建立事務,但是這不代表就沒有事務,只是不用transaction來控制而已。底層還是jdbc的Connection自帶事務提交策略,那就是自動提交。

關於@transactional註解

如果沒有異常,事務提交;如果有異常事務回滾。但是這個過程是隱式的,我們感知不到。但是對於正式的業務,如果失敗的話,我們應當給客戶一個提示。如果用try catch將整個service方法的程式碼包裹,出現異常就返回false,這種會給客戶提示,但是事務卻提交了。(原因:@transactional對於service層是根據方法是否執行完畢界定事務成功還是失敗的,也就是說如果用try catch將整個service方法的程式碼包裹,service方法執行結束,事務就會提交,@transactional註解沒有起作用;如過中間出現異常並且沒有try catch事務就不會提交)

對於在@transactional註解起作用的前提下判斷事務是否成功的解決方式

統一異常處理方式,service層不做處理,配置一款自己的異常處理器,當service層報錯,丟擲異常到controller層,controller方法出錯直接被異常處理器捕獲,跳轉到自己設定的jsp失敗頁面,或者往前臺返回json訊息