什麼是事務
事務是數據庫操作的最基本單元,邏輯上一組操作,要麼都成功,如果有一個失敗所有操作都失敗。
- 要麼都成功,要麼都失敗
- 事務在項目開發中,十分的重要,涉及到數據的一致性問題,不能馬虎
- 確保完整性和一致性
事務ACID原則:
- 原子性:要麼都成功,要麼都失敗
- 一致性:事務前後數據的完整性必須保持一致
- 隔離性:事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作數據所幹擾,多個併發事務之間要相互隔離
- 多個業務可能操作多個資源,防止數據損壞。
- 持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響
- 事務一旦提交,無論系統發生什麼問題,結果都不會被影響。數據被持久化的寫到存儲器中
Spring事務操作
-
事務添加到 JavaEE 三層結構裏面 Service 層(業務邏輯層)
-
在 Spring 進行事務管理操作
- 有兩種方式:編程式事務管理和聲明式事務管理(使用)
-
聲明式事務管理
- 基於註解方式(使用
- 基於 xml 配置文件方式
-
在 Spring 進行聲明式事務管理,底層使用 AOP 原理
-
Spring 事務管理 API
-
提供一個接口,代表事務管理器,這個接口針對不同的框架提供不同的實現類
-
Spring事務操作(基於註解操作聲明式事務)
-
在 spring 配置文件配置事務管理器
<!-- 配置聲明式事務--> <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入數據源--> <property name="dataSource" ref="dataSource"/> </bean>
<!-- 開啓事務的註解--> <tx:annotation-driven transaction-manager="TransactionManager"/>
-
在 service 類上面(或者 service 類裏面方法上面)添加事務註解
- @Transactional,這個註解添加到類上面,也可以添加方法上面
- 如果把這個註解添加類上面,這個類裏面所有的方法都添加事務
- 如果把這個註解添加方法上面,爲這個方法添加事務
@Service("UserService")
@Transactional//配置傳播行爲,設置隔離級別
public class UserServiceImpl implements UserService{
}
-
運行測試:
此時,經過事務的處理,出現異常的時候,回滾到之前的操作,存款金額沒發生變化。
事務操作(聲明式事務管理參數配置)
-
在 service 類上面添加註解@Transactional,在這個註解裏面可以配置事務相關參數
-
propagation:事務傳播行爲
-
多事務方法直接進行調用,這個過程中事務 是如何進行管理的
add()有事務,但是update()沒有事務。如果add調用update()方法,事務該如何傳播?
- Spring定義了7種類傳播行爲
- Spring定義了7種類傳播行爲
-
-
ioslation:事務隔離級別
-
事務有特性稱爲隔離性,多事務操作之間不會產生影響。不考慮隔離性產生很多問題
-
有三個讀問題:髒讀、不可重複讀、幻讀
-
==髒讀:==一個未提交的事務讀取到另一個未提交事務的數據
- A事務讀取B事務尚未提交的數據,此時如果B事務發生錯誤並執行回滾操作,那麼A事務讀取到的數據就是髒數據。
-
==不可重複讀:==一個未提交事務讀取到另一提交事務修改數據(前後多次讀取,數據內容不一致)
-
==幻讀:==事務A在執行讀取操作,需要兩次統計數據的總量,前一次查詢數據總量後,此時事務B執行了新增數據的操作並提交後,這個時候事務A讀取的數據總量和之前統計的不一樣,就像產生了幻覺一樣,平白無故的多了幾條數據,成爲幻讀。
- 幻讀可以通過增加版本號來控制
-
解決辦法:通過設置事務的隔離級別,解決讀的問題。
-
-
timeout:超時時間
- 事務需要在一定時間內進行提交,如果不提交進行回滾
- 默認值是 -1 ,設置時間以秒單位進行計算
-
readOnly:是否只讀
- 讀:查詢操作,寫:添加修改刪除操作
- readOnly 默認值 false,表示可以查詢,可以添加修改刪除操作
- 設置 readOnly 值是 true,設置成 true 之後,只能查詢
-
rollbackFor:回滾
- 設置出現哪些異常進行事務回滾
-
noRollbackFor:不回滾
- 設置出現哪些異常不進行事務回滾