@Transactional?是聲明式事務(wù)管理 編程中使用的注解
1 .添加位置
1)接口實(shí)現(xiàn)類或接口實(shí)現(xiàn)方法上,而不是接口類中。
2)訪問權(quán)限:public 的方法才起作用。@Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring?AOP?的本質(zhì)決定的。
系統(tǒng)設(shè)計(jì):將標(biāo)簽放置在需要進(jìn)行事務(wù)管理的方法上,而不是放在所有接口實(shí)現(xiàn)類上:只讀的接口就不需要事務(wù)管理,由于配置了@Transactional就需要AOP攔截及事務(wù)的處理,可能影響系統(tǒng)性能。
3)錯(cuò)誤使用:
1.接口中A、B兩個(gè)方法,A無@Transactional標(biāo)簽,B有,上層通過A間接調(diào)用B,此時(shí)事務(wù)不生效。
2.接口中異常(運(yùn)行時(shí)異常)被捕獲而沒有被拋出。
? 默認(rèn)配置下,spring 只有在拋出的異常為運(yùn)行時(shí) unchecked 異常時(shí)才回滾該事務(wù),
? 也就是拋出的異常為RuntimeException 的子類(Errors也會(huì)導(dǎo)致事務(wù)回滾),
? 而拋出 checked 異常則不會(huì)導(dǎo)致事務(wù)回滾 ??赏ㄟ^ @Transactional rollbackFor進(jìn)行配置。
3.多線程下事務(wù)管理因?yàn)榫€程不屬于 spring 托管,故線程不能夠默認(rèn)使用 spring?的事務(wù),
? 也不能獲取spring 注入的 bean 。
? 在被 spring 聲明是事務(wù)管理的方法內(nèi)開啟多線程,多線程內(nèi)的方法不被事務(wù)控制。
? 一個(gè)使用了@Transactional 的方法,如果方法內(nèi)包含多線程的使用,方法內(nèi)部出現(xiàn)異常,
? 不會(huì)回滾線程中調(diào)用方法的事務(wù)。
2.聲明式事務(wù)管理實(shí)現(xiàn)方式:

MyBatis 自動(dòng)參與到 spring 事務(wù)管理中,無需額外配置,
只要 org.mybatis.spring.SqlSessionFactoryBean 引用的數(shù)據(jù)源與
DataSourceTransactionManager 引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會(huì)不起作用。
<annotation-driven> 標(biāo)簽的聲明,
是在 Spring 內(nèi)部啟用 @Transactional 來進(jìn)行事務(wù)管理,使用 @Transactional 前需要配置。
事務(wù)的隔離級(jí)別:是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度
1.@Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀,不可重復(fù)讀) 基本不使用
2.@Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
3.@Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀)
4.@Transactional(isolation = Isolation.SERIALIZABLE):串行化
事務(wù)傳播行為:如果在開始當(dāng)前事務(wù)之前,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為
1. TransactionDefinition.PROPAGATION_REQUIRED:
? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。這是默認(rèn)值。
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:
? 創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
3. TransactionDefinition.PROPAGATION_SUPPORTS:
? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:
? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
5. TransactionDefinition.PROPAGATION_NEVER:
? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
6. TransactionDefinition.PROPAGATION_MANDATORY:
? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。
7. TransactionDefinition.PROPAGATION_NESTED:
? 如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;
? 如果當(dāng)前沒有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。
字段說明:
1. value :主要用來指定不同的事務(wù)管理器;
? 主要用來滿足在同一個(gè)系統(tǒng)中,存在不同的事務(wù)管理器。
? 比如在Spring中,聲明了兩種事務(wù)管理器txManager1, txManager2.然后,
? 用戶可以根據(jù)這個(gè)參數(shù)來根據(jù)需要指定特定的txManager.
2. value 適用場(chǎng)景:在一個(gè)系統(tǒng)中,需要訪問多個(gè)數(shù)據(jù)源或者多個(gè)數(shù)據(jù)庫,
? 則必然會(huì)配置多個(gè)事務(wù)管理器的
3. REQUIRED_NEW:內(nèi)部的事務(wù)獨(dú)立運(yùn)行,在各自的作用域中,可以獨(dú)立的回滾或者提交;
? 而外部的事務(wù)將不受內(nèi)部事務(wù)的回滾狀態(tài)影響。
4. ESTED 的事務(wù),基于單一的事務(wù)來管理,提供了多個(gè)保存點(diǎn)。
? 這種多個(gè)保存點(diǎn)的機(jī)制允許內(nèi)部事務(wù)的變更觸發(fā)外部事務(wù)的回滾。
? 而外部事務(wù)在混滾之后,仍能繼續(xù)進(jìn)行事務(wù)處理,即使部分操作已經(jīng)被混滾。
? 由于這個(gè)設(shè)置基于 JDBC 的保存點(diǎn),所以只能工作在 JDB C的機(jī)制。
5. rollbackFor:讓受檢查異?;貪L;即讓本來不應(yīng)該回滾的進(jìn)行回滾操作。
6. noRollbackFor:忽略非檢查異常;即讓本來應(yīng)該回滾的不進(jìn)行回滾操作。
