基礎知識:
編碼式事務處理:基於編碼實現
聲明式事務處理:基於AOP (本篇文章基於此方式)
實現方式:
配置文件:xml事務規則聲明
註解:@Transactional
-
@Transactional 實現:
1.聲明註解配置 DataSourceTransactionManager 也可使用註解@EnableTransactionManagement (在Springboot中可直接跳過此步驟)
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.使用@Transactional註解,在方法上、類上。
-
@Transactional各屬性描述
name
選擇指定的事務管理器(在存在多事務管理器時使用:TransactionManager)。
propagation
事務傳播行爲,默認爲REQUIRED。已有事務則加入,否則重新創建一個。
isolation
事務隔離級別,默認爲DEFAULT。
timeout
事務超時時間,默認爲-1, 如果超時未完成則回滾事務。
read-only
只讀事務,默認爲false,無需事務處理是 可設置read-only=true。
rollback-for
事務回滾的異常類型,如果多個則逗號隔開。需繼承自
RuntimeException 的異常類
no-rollback-for
拋出指定的異常類型,不回滾。
-
propagation:事務傳播行爲
REQUIRED required |
支持事務。存在則加入,不存在則新建 |
|
REQUIRES_NEW requires_new |
支持事務。存在則掛起當前事務,不存在則新建 |
|
NESTED nested |
支持事務。存在則嵌套成一個子事務,不存在則新建 |
|
SUPPORTS supports |
支持事務。存在則支持,不存在則不管他 |
不回滾 |
NOT_SUPPORTED not_supported |
不支持事務。存在則掛起,執行完後則恢復 |
不回滾 |
MONDATORY mondatory |
支持事務。存在則加入,不存在則拋出異常 |
|
NEVER |
不支持事務。存在則拋出異常 |
不回滾 |
-
isolation:事務隔離級別
DEFAULT |
默認使用數據庫默認的隔離級別 |
|
READ_UNCOMMITTED |
未提交的事務可以被讀取 |
產生髒讀、不可重複讀、幻讀 |
READ_COMMITTED |
已提交的事務纔可被讀取 |
產生不可重複讀、幻讀 |
REPEATABLE_READ |
|
產生幻讀 |
SERIALIZABLE |
|
防止髒讀、不可重複讀、幻讀 |
-
基於註解的實現機制
- 調用註解方法
- 生成代理對象 - CglibAopProxy 調用內部類的方法DynamicAdvisedInterceptor.intercept()
- TransactionInterceptor.invoke()攔截器攔截,在目標方法執行之前創建並加入事務
- AbstractPlatformTransactionManager抽象事務管理器操作數據源DataSource提交或回滾事務