鏈式方法呼叫的事務問題剖析
阿新 • • 發佈:2018-12-10
最近做了分散式的專案,當然沒有設計分散式事務的處理,一條邏輯線太長,方法調方法,所以之間的事務問題就暴露出來了 我已陣亡,直接碼程式碼吧
@Service public class TransactionalServiceImpl implements TransactionalService { @Autowired private CgpMngUserbraService cgpMngUserbraService; @Transactional @Override public void method() { List<CgpMngUserbra> cgpMngUserbras = cgpMngUserbraService.selectUserBraRules(0, 0); if (null == cgpMngUserbras || 0 == cgpMngUserbras.size()) { cgpMngUserbraService.insertUserBraRules(0, 0, "method"); } method2(); } // @Transactional//此處事務不會生效,原因可閱讀上一篇部落格 // 傳送門---> https://blog.csdn.net/fanxb92/article/details/81296005 public void method2() { List<CgpMngUserbra> cgpMngUserbras = cgpMngUserbraService.selectUserBraRules(0, 0); if (null == cgpMngUserbras || 0 == cgpMngUserbras.size()) { cgpMngUserbraService.insertUserBraRules(0, 0, "method2"); } TransactionalServiceImpl transactionalService = (TransactionalServiceImpl) AopContext.currentProxy(); transactionalService.method3(); } @Transactional // @Transactional(propagation = Propagation.REQUIRES_NEW) // @Transactional(propagation = Propagation.NESTED) public void method3() { List<CgpMngUserbra> cgpMngUserbras = cgpMngUserbraService.selectUserBraRules(0, 0); if (null == cgpMngUserbras || 0 == cgpMngUserbras.size()) { cgpMngUserbraService.insertUserBraRules(0, 0, "method3"); } } }
先介紹一下測試邏輯:method,method2,method3三個方法都會在一張表儲存同一條資料,並且鏈式呼叫。
method2加事務是不生效的,method2中事務和method中保持一致,參照程式碼中部落格連結。
method3上面三種事務處理方式 第一種@Transactional,method3中事務和前面保持一致(method方法上註解產生的事務中),全部執行完畢,資料庫中一條資料。 一定是全部執行完畢哦,中途打斷點,method中還為插入到資料庫,因為方法未結束,未commit。
第二種@Transactional(propagation = Propagation.REQUIRES_NEW),method3開啟了一個新的事務,會將已有的事務掛起, 同樣,方法全部執行完畢後資料庫兩條資料,資料庫記錄截圖如下:
後來才知道Hibernate也不支援Nested Transaction,測試不了,只能用jdbc事務了,使用JdbcTemplate。
好吧,就先聊這麼多吧。謝謝閱讀。