主要是 公司的項目裏面 的 一個 service 方法對事務有着特殊的要求。 好比: 有 A , B , C 3個service 方法, A 方法裏面會執行到 B ,C 的方法。spring
可是要求, C方法若是出現了異常的時候, 讓事務 回滾的時候,不要 把B的事務給回滾掉。 並且 A 方法可能被其餘的 service 方法給調用到, 其餘的方法出現了異常,也是不但願 B的事務被回滾的。 好吧,其實B方法是記錄的日誌 表,並且是比較重要的內容。若是回滾掉了,就 沒有數據了,出現業務起來就比較麻煩了。這個是特殊要求。 並且 項目還使用到 hibernate ,而我對其 不怎麼熟悉。。。用的不多,算是 第一次接觸。。。 公司的 hibernate 事務配置也有點奇怪。。。安全
事務隔離級別:(五種), 事務傳播行爲:(七種) 等等。。。 我嘗試過了,,,什麼父子事務啊,,新建事務啊,,,都是沒用的,其實 出現了異常仍是都會回滾的。並且 是和 事務隔離級別 沒有一點關係的。測試
也就是使用 : NOT_SUPPORTED--以非事務方式執行操做,若是當前存在事務,就把當前事務掛起 這樣 B或者 C 加入事務便可。。。 但是因爲是 hibernate 就 出現了其餘的異常:.net
Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. could not initialize proxy - no Session
總之和 hibernate 特性有關係的,,,好吧, 不懂了,並且 隨便去 修改 hibernate 的配置什麼的,也不是好事。hibernate
也就是說 , 在 A方法裏面, 調用 B方法的時候, 手動提交它的事務。 關於這個百度就不少資料了。日誌
@Resource(name = "transactionManager") // 配置hibernate的 事務管理區的bean id private HibernateTransactionManager transactionManager; // 例子 手動提交 public void testx() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啓新事務,這樣會比較安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 得到事務狀態 try { UserBank userBank = userBankService.getUserBankById(10L); userBank.setBankname("66測試66666666"); userBankService.update(userBank);// bankservice 裏面是有事務的 System.out.println("==================66》》》》》》》》》》》》"); int aString = 1; if (aString == 2) { throw new NullPointerException("我是異常"); } System.out.println("===================提交"); transactionManager.commit(status); } catch (Exception e) { e.printStackTrace(); System.out.println("===================回滾"); transactionManager.rollback(status); } } 固然爲了 減小影響, 應該 A和C 的 方法配置的事務 最好是 REQUIRES_NEW--新建事務,若是當前存在事務,把當前事務掛起。 通過測試 ,, 能夠 解決。
若是聲明式事務和 註解事務 一塊兒共存的執行優先級: 若是不指定order 的話,那麼就 按照配置的順序來以爲優先級的,也就是嵌套事務了code
直接使用@Order註解來修飾一個切面類,使用 @Order 時可指定一個int型的value屬性,該屬性值越小,則優先級越高。blog