事務引入緣由: 併發情況下對數據庫的連續操作進行管理。
重點目錄:
- 事務特性(ACID): 原子性、一致性、隔離型、持久性
- 事務的隔離級別
- 事務的傳播機制。
- @Transactional標籤的使用
- @Transactional標籤不作用 @Transaction不起作用解決方法
- 事務嵌套,項目示例異常: 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)