1. 程式人生 > >Spring 事物管理

Spring 事物管理

不可重復讀 isolation iso 事務回滾 速度 nested 整合 缺陷 支持

Spring在企業開發中,能和其他框架進行整合,Spring的職責在於Bean管理和事物操作

Spring配置文件中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。

事務使用ACID特性來衡量事務的質量。介紹如下:
1,原子性
事務必須是原子的,在事務結束的時候,事務中的所有任務必須全部成功完成,否則全部失敗,事務回滾到事務開始之間的狀態。
2,一致性
事務必須保證和數據庫的一致性,即數據庫中的所有數據和現實保持一致。如果事務失敗數據必須返回到事務執行之前的狀態,反之修改數據和現實的同步。
3,隔離性
隔離性是事務與事務之間的屏障,每個事務必須與其他事務的執行結果隔離開,直到該事務執行完畢,它保證了事務的訪問的任何數據不會受其他事務執行結果的影響。
4,持久性
如果事務成功執行,無論系統發生任何情況,事務的持久性都必須保證事務的執行結果是永久的。

xml配置的編寫

<!-- 配置事務管理器(聲明式的事務) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事務的控制-->
<bean id="stockServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
<property name="target" ref="stockService"></property>
<!--事物屬性-->
<property name="transactionAttributes">
<props>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
</props>
</property>

</bean>

事物之間的缺陷

1.臟讀取

當一個事務讀取了另一個事務尚未提交的更新,就叫臟讀取。在另一個事務回滾的情況下,當前事務所讀取的另一個事務的數據就是無效的。

2.不可重復讀取

在一個事務中執行多次同樣的查詢操作,但每次查詢的結果都不一樣,就叫做不可重復讀取,通常這種情況是由於數據在二次查詢之間被另一個並發的事務所修改。

3.幻象行

這是對事務危害最小的一個問候,它類似不可重復讀取,也是一個事務的更新結果影響到另一個事務問題。但是它不僅影響另一個事務查詢結果,而且還會使查詢語句返回一些不同的行錄行。
這3個問題危害程度依次為:臟讀取最大-->不可重復讀取-->幻影行最小。

Spring事務類型詳解

<property name="transactionAttributes">
<props>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
</props>
</property>

Spring中常用事務類型:

PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED--如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。

2,事務的隔離級別

為解決事務之間的3個缺陷,必須在事務之間建立隔離關系來保證事務的完整性。
ISOLATION_DEFAULT
使用數據庫默認的隔離級別

ISOLATION_COMMITTED
允許讀取其他並發事務已經提交的更新(防此臟讀)
ISOLATION_READ_UNCOMMITTED
允許讀取其他並發事務還未提交的更新,會導致事務之 間的3個缺陷發生,這是速度最快的一個隔離級別,但同 時它的隔離級別也是最低
ISOLATION_REPEATABLE_READ
除非事務自身修改了數據,否則規定事務多次重復讀取 數據必須相同(防此臟讀,不可重復讀)
ISOLATION_SERIALIZABLE
這是最高的隔離級別,它可以防此臟讀,不可重復讀和 幻讀等問題,但因其侵占式的數據記錄完全鎖定,導致

Spring 事物管理