SpringMVC+mybatis事務管理

1.事務的ACID性

·原子性:事務是由一個活多個活動所組成的一個工作單元。院子想確保事務中的所有操作全部發生或全部不發生。

·一致性:一旦事務完成(不管是成功還是失敗)系統必須確保它所建立的業務處理一致的狀態。實現的數據不應該被損壞

·隔離性:事務允許多個用戶對相同的數據進行操作,每個用戶的操作不會與其他用戶糾纏在一起。因此事務應該是被隔離的,避免發生同步讀寫相同數據的事情

·持久性:一旦事務完成,事務的結果應該持久化,這樣就能從任何的系統崩潰中恢復過來。這一般會 涉及將結果存儲到數據或其他形式的持久化存儲中

2.選擇事務管理器 (這裏使用jdbc管理器)

   ·jdbc事務

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>


DataSourceTransactionManager通過調用java.sql.Connection來管理事務。而後者是通過Datasource獲取到的。通過調用連接的commit()方法來提交事務。同樣,事務失敗時通過調用rollback方法來進行回滾。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
		p:url="jdbc:mysql://127.0.0.1:3306/test" p:username="root" p:password="root"
		p:maxActive="10" p:maxIdle="10">
	</bean>

3.定義事務的屬性。在Spring中聲明式事務是通過事務屬性來定義的。事務屬性面熟了事務策略如何應用到方法上。事務屬性包含了5個方面。傳播行爲,隔離級別,回滾原則,事務超時,是否只讀


  傳播行爲定義了客戶端與被調用方法之間的事務邊界,傳播規則回到了,新的事務應該被啓動還是被掛起,或者方法是否要在事務環境中運行。

隔離級別:

1.髒讀:髒讀放生在一個事務讀取了另一個事務改寫但是尚未提交的數據時。如果改寫在稍後被回滾了,那麼第一個失誤獲取的數據就是無效的。

        2.不可重複讀:發生在一個事務執行相同的查詢兩次或兩次以上,但是每次都得到不同的數據時。這通常是因爲另一個併發事務在兩次查詢期期間更新了數據

3.幻讀:和不可重複讀類似。他繁盛在一個事務讀取了幾行數據,接着另一個併發事務插入了一些數據時,在隨後的查詢中,第一個事務就會發現先多了一些原本不存在的記錄




回滾規則:

默認情況下,事務只有在遇到運行期異常時纔會回滾,而在遇到檢查型異常時不會回滾。

但是可以聲明事務在遇到特定的檢查性異常時想遇到運行期異常那樣回滾。同樣,你還可可以聲明事務遇到特定的異常不回滾,即使這些異常時運行期異常。

3.定義註解驅動的事務

applicationContext.xml中

<tx:annotation-driven transaction-manager="transactionManager"/>

<context:component-scan base-package="com.qunar.controller">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	</context:component-scan>

表示不再掃面Controller包了 因爲在我的xxx-servlet.xml中已經加載到容器,如果再次掃面 spring中cglib將不能產生代理

add方法  聲明爲事務 然後拋出異常看是否回滾

@RequestMapping(value = "/add", method = RequestMethod.GET)
	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public String add(User user) {
		try {
			userMapper.addUser(user);
			throw new ClassCastException();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "login";
	}

不知爲何 ,事務老是不會滾,用的mysql 引擎爲InnoDB 程序也沒有報錯,可是就是不能回滾,有待研究



發佈了93 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章