Spring 事務管理:
- 編程式
- 注解式
事務的傳播機制
@Transactional(propagation=xx)
,選項如下:
Propagation.SUPPORTS
:如果調用的 bean 中開啟了事務,則加入事務,否則就不用事務。Propagation.NOT_SUPPORTED
:不開啟事務。Propagation.REQUIRED
:(默認形式)如果調用的 bean 中開啟了事務,則加入事務,否則就新建事務。Propagation.REQUIRES_NEW
:如果調用的 bean 中開啟了事務,則原來的事務掛起,新建事務,否則就新建事務。Propagation.MANDATORY
:必須在一個 已有 的事務中執行,否則拋出異常。Propagation.NEVER
:與 MANDATORY 相反,必須在一個 沒有 的事務中執行,否則拋出異常。
事務的超時設置
@Transactional(timeout=30)
設置為 30 秒
默認為 -1 秒,即永不超時。
事務的隔離級別
設置底層數據庫的隔離級別,用于處理 多事務并發 的情況。
@Transactional(isolation=xx)
,選項如下:
Isolation.READ_UNCOMMITTED
:讀取未提交的數據。會產生臟讀。Isolation.READ_COMMITTED
:(SQL Server 默認形式)讀取已提交的數據。Isolation.REPEATABLE_READ
:(MySQL 默認形式)可重復讀。Isolation.SERIALIZABLE
:將并發事務串行化處理。
Spring 事務 Transaction 開發實踐
配置數據源 dataSource:
<bean id="dataSource" class="C3P0數據源">
...
</bean>
通過 dataSource 配置 TransactionManager:
<bean id="transactionManager" class="DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx: annotation-driver transaction-manager="transactionManager" />
通過 注解 來使用:
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveUserInfo(User user) {
...
}