spring支持聲明式事務管理和編程式事務管理兩種方式。spring
編程式事務使用TransactionTemplate來定義,可在代碼級別對事務進行定義。數據庫
聲明式事務基於aop來實現,缺點是其最細粒度的事務聲明只能到方法級別。編程
聲明式事務管理有兩種經常使用的方式,一種是基於tx和aop名字空間的xml配置文件,另外一種就是基於@Transactional註解。spa
<!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入數據庫鏈接池 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置基於註解的聲明式事務 --> <tx:annotation-driven transaction-manager="transactionManager" />
事務的隔離級別和超時回滾默認基於底層數據庫。設計
2. @Transactional註解能夠對事務實現元數據的配置。code
public class TransactionalService { @Transactional("order") public void setSomething(String name) { ... } @Transactional("account") public void doSomething() { ... } }
xml中應用的上下文聲明:xml
<tx:annotation-driven/> <bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ... <qualifier value="order"/> </bean> <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ... <qualifier value="account"/> </bean>
spring事務的回滾規則:blog
默認狀況下,spring在當前事務的上下文拋出一個非檢查性異常(同時包括error),即運行時異常(RuntimeException)和其子類時,事務纔會回滾。也就是說,默認狀況下,spring在程序運行時拋出IOException等一些非運行時異常是不會回滾的,只有在因爲程序設計漏洞而拋出的RuntimeException(好比NullPointerException)或者error時,事務纔回滾。事務