Spring 事務(wù)管理:
- 編程式
- 注解式
事務(wù)的傳播機(jī)制
@Transactional(propagation=xx)
,選項(xiàng)如下:
Propagation.SUPPORTS
:如果調(diào)用的 bean 中開啟了事務(wù)璧疗,則加入事務(wù)舞竿,否則就不用事務(wù)。Propagation.NOT_SUPPORTED
:不開啟事務(wù)。Propagation.REQUIRED
:(默認(rèn)形式)如果調(diào)用的 bean 中開啟了事務(wù),則加入事務(wù),否則就新建事務(wù)申屹。Propagation.REQUIRES_NEW
:如果調(diào)用的 bean 中開啟了事務(wù),則原來(lái)的事務(wù)掛起隧膏,新建事務(wù)哗讥,否則就新建事務(wù)。Propagation.MANDATORY
:必須在一個(gè) 已有 的事務(wù)中執(zhí)行胞枕,否則拋出異常杆煞。Propagation.NEVER
:與 MANDATORY 相反,必須在一個(gè) 沒(méi)有 的事務(wù)中執(zhí)行腐泻,否則拋出異常决乎。
事務(wù)的超時(shí)設(shè)置
@Transactional(timeout=30)
設(shè)置為 30 秒
默認(rèn)為 -1 秒,即永不超時(shí)派桩。
事務(wù)的隔離級(jí)別
設(shè)置底層數(shù)據(jù)庫(kù)的隔離級(jí)別构诚,用于處理 多事務(wù)并發(fā) 的情況。
參見(jiàn) 數(shù)據(jù)庫(kù)隔離級(jí)別 臟讀 VS 不可重讀讀 VS 幻讀
@Transactional(isolation=xx)
铆惑,選項(xiàng)如下:
Isolation.READ_UNCOMMITTED
:讀取未提交的數(shù)據(jù)范嘱。會(huì)產(chǎn)生臟讀。Isolation.READ_COMMITTED
:(SQL Server 默認(rèn)形式)讀取已提交的數(shù)據(jù)员魏。Isolation.REPEATABLE_READ
:(MySQL 默認(rèn)形式)可重復(fù)讀丑蛤。Isolation.SERIALIZABLE
:將并發(fā)事務(wù)串行化處理。
Spring 事務(wù) Transaction 開發(fā)實(shí)踐
配置數(shù)據(jù)源 dataSource:
<bean id="dataSource" class="C3P0數(shù)據(jù)源">
...
</bean>
通過(guò) dataSource 配置 TransactionManager:
<bean id="transactionManager" class="DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx: annotation-driver transaction-manager="transactionManager" />
通過(guò) 注解 來(lái)使用:
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveUserInfo(User user) {
...
}