1.概念
事務是指邏輯上的一組操作,這些操作要麼同時執行成功,要麼同時執行失敗。
2.特性
- 原子性
- 一致性
- 隔離性
- 永久性
3.接口介紹
Spring爲事務管理提供了3個高層抽象的接口。
- 平臺事務管理器(PlatformTranctionManager):爲不同的持久層框架提供了具體的實現類。
- 事務定義(TransactionDefinition):定義事務的隔離級別以及事務傳播特性等信息。
- 事務狀態(TransactionStatus):獲取事務管理過程中產生的相關信息。
4.PlatformTransactionManager接口介紹
Spring爲不同的持久化框架提供了不同PlatfromTransactionManager接口實現
- org.springframework.jdbc.datasource.DataSourceTransactionManager:使用Spring JDBC或iBatis進行持久化數據時使用
- org.springframework.orm.hhibernate3.HibernateTransactionManager:使用Hibernate3.0版本進行持久化數據時使用
5.TransactionDefinition
- 髒讀(Dirty Read):一個事務讀取了另一個事務未提交的數據,但這個數據是有可能回滾的。
- 不可重複讀(Unrepeated Read):在數據庫訪問中,一個事務範圍內兩個相同的查詢卻返回了不同數據。這是由於查詢時系統中其它事務修改的提交而引起的。例如:事務B中對某個查詢執行兩次,當第一個執行完時,事務A對其數據進行了修改。事務B中再次查詢時,數據發生了改變。
- 幻讀(Phantom read):指當前事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好像發生了幻覺一樣。
事務的隔離級別
- DEFAULT:使用的數據庫默認的隔離級別(spring中的選擇項)。
- READ_UNCOMMITED:允許讀取未提交但已修改的數據,可能導致髒,幻和不可重複讀。
- READ_COMMITED:允許在併發事務已經提交後讀取。可防止髒讀,幻讀但不可重複讀仍可發生。
- REPEATABLE_READ:對相同字段的多次讀取是一致的,除非數據被事務本身改變。可防止髒,不可重複讀但幻讀仍可能發生。
- SERIALIZABLE:完全服從ACID的隔離級別,確保不發生髒,幻和不可重讀,這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的數據表來完成的。
事務的傳播行爲(描述一個由事務傳播行爲修飾的方法被嵌套進另一個方法時,事務是如何傳播的)
public class Demo {
public void method1(){
method2();
}
@Transactional(Propagation = xxx)
public void method2(){
}
}
- PROPAGATION_REQUIRED:支持當前事務,如果不存在,就新建一個。
- PROPAGATION_SUPPORTS:支持當前事務,如果不存在,就不使用事務。
- PROPAGATION_MANDATORY:支持當前事務,如果不存在,拋出異常。
- PROPAGATION_REQUIRES_NEW:如果有事務存在,掛起當前事務,創建一個新的事務。
- PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果有事務存在,掛起當前事務。
- PROPAGATION_NEVER:以非事務方式運行,如果有事務存在,拋出異常。
- PROPAGATION_NESTED:如果當前事務存在,就嵌套事務執行。