Springboot @Transactional 源碼解讀

基礎知識:


編碼式事務處理:基於編碼實現
聲明式事務處理:基於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提交或回滾事務

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章