/** * 用戶登錄接口 * * * 1明確事務方法前的命名規則 * 2保證事務方法執行的時間盡可能的短,不允許出現循環操作,不允許出現RPC等網絡請求操作 * 3不允許所有的方法都使用事務,節省服務器性能和縮短數據庫連接時間 * 4如果出現有多個地方需要事務回滾時,使用自定義或原有的異常進行拋出,異常必須繼承RunTimeError,否則不會觸發回滾操作 * 5使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();進行手動回滾 * */ @Transactional public UserModel login(UserModel user){ UserModel userEntity = new UserModel(); userEntity = userDao.login(user); if(userEntity == null) { return null; } userEntity = userDao.login(user); if(userEntity == null) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return null; } else { return userEntity; } }
直接給出一個例子代碼,上面只是記錄一下,下面才是干貨。
首先很多時候我們不會采用事務操作,但是當我們在一個服務層多次訪問數據庫特別是進行插入刪除操作的時候,我們需要使用事務進行操作,也就是一個不成功,所有的操作全部回滾。
那么具體的事務特性我就不多說了,規范我也打在最上面的注釋里面了。主要注意一下,
使用@Transactional 注解
如果第一次插入成功,第二次插入失敗,執行TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 這條語句之后,第一次的插入動作就被回滾了,也就是並沒有生效。
手動回滾看起來會比較實用一些。
然后對於拋出異常的那種自動回滾可以參考百度各種代碼。比較麻煩一些,就不列舉了。
補充一下:
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
設置回滾點,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint。
設置回滾點,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint。
后序補充詳細屬性配置(復雜)