事務總述

事務引入緣由: 併發情況下對數據庫的連續操作進行管理。

重點目錄:

  1. 事務特性(ACID): 原子性、一致性、隔離型、持久性
  2. 事務的隔離級別
  3. 事務的傳播機制。
  4. @Transactional標籤的使用
  5. @Transactional標籤不作用 @Transaction不起作用解決方法
  6. 事務嵌套,項目示例異常: Transaction silently rolled back because it has been marked as rollback-only

 Spring對事務管理源碼解析:

public @interface Transactional {
    //@AliasFor: 指定別名(及兩者相同)。使用需求: 1. 成對出現。2.必須有默認值。3.屬性和默認值類型必須相同 
    @AliasFor("transactionManager")
    String value() default "";
    @AliasFor("value")
    String transactionManager() default "";
    //事務傳播方式
    Propagation propagation() default Propagation.REQUIRED;
    //事務隔離級別
    Isolation isolation() default Isolation.DEFAULT;    
    //超時時間
    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
    //是否只讀
    boolean readOnly() default false;
    //指定異常類回滾
    Class<? extends Throwable>[] rollbackFor() default {};
    //指定異常類名回滾
    String[] rollbackForClassName() default {};
    //指定異常類不回滾
    Class<? extends Throwable>[] noRollbackFor() default {};
    //指定異常類名不回滾
    String[] noRollbackForClassName() default {};
}
//事務傳播方式
public enum Propagation {
    // 需要事務。它是默認傳播行爲,如果當前存在事務,就沿用當前事務,否則新建一個事務運行子方法
    REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
    // 支持事務,如果當前存在事務,就沿用當前事務,如果不存在 ,則繼續採用無事務的方式運行子方法
    SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
    // 必須使用事務,如果當前沒有事務,則會拋出異常,如果存在當前事務 ,就沿用當前事務
    MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
    // 無論當前事務是否存在,都會創建新事務運行方法,這樣新事務就可以擁有新的鎖和隔離級別等特性,與當前事務相互獨立
    REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
    // 不支持事務,當前存在事務時,將掛起事務,運行方法
    NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
    // 不支持事務,如果當前方法存在事務,則拋出異常,否則繼續使用無事務機制運行
    NEVER(TransactionDefinition.PROPAGATION_NEVER),
    // 在當前方法調用子方法時,如果子方法發生異常,只因滾子方法執行過的 SQL,而不回滾當前方法的事務
    NESTED(TransactionDefinition.PROPAGATION_NESTED);

    private final int value;

    Propagation(int value) { this.value = value; }

    public int value() { return this.value; }

}
//事務隔離級別
public enum Isolation {
	//使用數據庫的隔離級別
	DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
	//讀不提交
	READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
	//讀提交
	READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
	//重複讀
	REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
	//序列化
	SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);

	private final int value;

	Isolation(int value) {
		this.value = value;
	}

	public int value() {
		return this.value;
	}
}

通過Spring中提供的事務源碼,清晰的可以看到事務中的囊括點。

事務的實現方式:AOP。AOP的實現方式:動態代理。

(共同學習:https://blog.csdn.net/weixin_38289303/article/details/100058865、                                            https://blog.csdn.net/weixin_38289303/article/details/99908331

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