spring 事務的理解和控制剝離實踐

主要是 公司的項目裏面 的 一個 service 方法對事務有着特殊的要求。 好比: 有 A , B , C 3個service 方法, A 方法裏面會執行到 B ,C 的方法。spring

可是要求, C方法若是出現了異常的時候, 讓事務 回滾的時候,不要 把B的事務給回滾掉。 並且 A 方法可能被其餘的 service 方法給調用到, 其餘的方法出現了異常,也是不但願 B的事務被回滾的。 好吧,其實B方法是記錄的日誌 表,並且是比較重要的內容。若是回滾掉了,就 沒有數據了,出現業務起來就比較麻煩了。這個是特殊要求。 並且 項目還使用到 hibernate ,而我對其 不怎麼熟悉。。。用的不多,算是 第一次接觸。。。 公司的 hibernate 事務配置也有點奇怪。。。安全

1, 嘗試 使用spring不一樣的事務模式

事務隔離級別:(五種), 事務傳播行爲:(七種) 等等。。。 我嘗試過了,,,什麼父子事務啊,,新建事務啊,,,都是沒用的,其實 出現了異常仍是都會回滾的。並且 是和 事務隔離級別 沒有一點關係的。測試

2 , A service 配置沒有事務

也就是使用 : 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

3, 最後只能手動控制事務了

也就是說 , 在 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

http://blog.csdn.net/amyson/article/details/4142206事務

http://blog.csdn.net/jeep_ouc/article/details/43056977rem

相關文章
相關標籤/搜索