前言
Spring同時(shí)支持編程事務(wù)策略和聲明式事務(wù)策略董瞻,通常都推薦采用聲明式事務(wù)策略棕叫。使用聲明式事務(wù)策略的優(yōu)勢(shì)十分明顯仿贬。
1.聲明式事務(wù)能大大降低開(kāi)發(fā)者的代碼書(shū)寫(xiě)量前标,通過(guò)在類(lèi)或方法上使用注解@Transactional即可獲得事務(wù)支持(注意事務(wù)失效的情況)涝焙,不與業(yè)務(wù)代碼耦合卑笨。
2.由于Spring采用AOP的方式管理事務(wù),因此仑撞,可以在事務(wù)回滾動(dòng)作中插入用戶自己的動(dòng)作赤兴,而不僅僅是執(zhí)行系統(tǒng)默認(rèn)的回滾。
@Transactional
@Transactional注解為Spring提供聲明式事務(wù)支持隧哮,此注解定義如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
//事務(wù)管理器
@AliasFor("transactionManager")
String value() default "";
//事務(wù)管理器
@AliasFor("value")
String transactionManager() default "";
//事務(wù)傳播行為桶良,默認(rèn)是REQUIRED
Propagation propagation() default Propagation.REQUIRED;
//事務(wù)隔離級(jí)別
Isolation isolation() default Isolation.DEFAULT;
//事務(wù)超時(shí)時(shí)間,注意只有使用JdbcTemplate實(shí)現(xiàn)Dao時(shí)此屬性才能生效沮翔,使用Mybatis實(shí)現(xiàn)無(wú)法生效
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
//是否只讀
boolean readOnly() default false;
//需要進(jìn)行回滾的異常類(lèi)型
Class<? extends Throwable>[] rollbackFor() default {};
//需要進(jìn)行回滾的異常類(lèi)名
String[] rollbackForClassName() default {};
//不需要進(jìn)行回滾的異常類(lèi)型
Class<? extends Throwable>[] noRollbackFor() default {};
//不需要進(jìn)行回滾的異常類(lèi)名
String[] noRollbackForClassName() default {};
}
這里有兩個(gè)枚舉類(lèi)Isolation
陨帆, Propagation
需要重點(diǎn)關(guān)注
Isolation
Isolation表示事務(wù)的隔離級(jí)別,此枚舉類(lèi)定義如下:
public enum Isolation {
//使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
//未提交讀采蚀,會(huì)發(fā)生臟讀疲牵、不可重復(fù)讀以及幻讀
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
//提交讀,會(huì)發(fā)生不可重復(fù)讀和幻讀
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
//可重復(fù)讀榆鼠,會(huì)發(fā)生幻讀
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
//串行纲爸,可避免臟讀、不可重復(fù)讀以及幻讀
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
private final int value;
Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
Propagation
Propagation表示事務(wù)的傳播行為璧眠,此枚舉類(lèi)定義如下:
public enum Propagation {
//默認(rèn)的事務(wù)傳播行為缩焦,支持當(dāng)前事務(wù)读虏,如果當(dāng)前不存在事務(wù)則創(chuàng)建一個(gè)新的事務(wù)
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
//支持當(dāng)前事務(wù),如果當(dāng)前不存在事務(wù)則以非事務(wù)形式執(zhí)行
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
//必須以事務(wù)形式執(zhí)行袁滥,支持當(dāng)前事務(wù)盖桥,如果當(dāng)前不存在事務(wù)則拋出異常
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
//創(chuàng)建新的事務(wù),如果當(dāng)前已存在事務(wù)則先將當(dāng)前事務(wù)掛起
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
//以非事務(wù)形式執(zhí)行题翻,如果當(dāng)前已存在事務(wù)則將當(dāng)前事務(wù)掛起
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
//不支持事務(wù)揩徊,如果當(dāng)前存在事務(wù)則拋出異常
NEVER(TransactionDefinition.PROPAGATION_NEVER),
//如果當(dāng)前存在一個(gè)事務(wù),則該方法會(huì)在嵌套事務(wù)中執(zhí)行嵌赠,嵌套的事務(wù)可以獨(dú)立的進(jìn)行提交或回滾塑荒,
//如果當(dāng)前不存在事務(wù),則創(chuàng)建一個(gè)新事物姜挺,此時(shí)其行為與PROPAGATION_REQUIRED相同
NESTED(TransactionDefinition.PROPAGATION_NESTED);
}