面試記錄:在spring中怎么聲明隔離級別和傳播行為

應(yīng)該是接著上個問題問的: 數(shù)據(jù)庫的隔離級別,但是我-------------
直接不會,之前寫項(xiàng)目也沒考慮過用事物。(菜死了)
Spring中事物管理的方式
在 Spring 中,事物管理有兩種方式,編程式事物管理和聲明式事物管理
編程式事物管理:在代碼中使用 TransactionTemplate或者 TransactionManager 配合異常處理手動管理事物,不推薦。
聲明式事物管理:使用注解進(jìn)行事物管理,建立在AOP上對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個事物,在執(zhí)行完目標(biāo)方法后根據(jù)執(zhí)行情況提交或者回滾事物.
使用 @Transactional 注解
使用方式:
在啟動類上添加@EnableTransactionManagement注解。
用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時,我們也可以在方法級別使用該標(biāo)注來覆蓋類級別的定義。
在項(xiàng)目中,@Transactional(rollbackFor=Exception.class),如果類加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數(shù)據(jù)庫里面的數(shù)據(jù)也會回滾。
在@Transactional注解中如果不配置rollbackFor屬性,那么事物只會在遇到RuntimeException的時候才會回滾,加上rollbackFor=Exception.class,可以讓事物在遇到非運(yùn)行時異常時也回滾
隔離級別
即之前文章中的四種隔離級別以及一種默認(rèn)的隔離級別。
Spring 中定義了一個 Isolation 枚舉類來幫助程序員使用。
TransactionDefinition.ISOLATION_DEFAULT :使用后端數(shù)據(jù)庫默認(rèn)的隔離級別,MySQL 默認(rèn)采用的 REPEATABLE_READ 隔離級別 Oracle 默認(rèn)采用的 READ_COMMITTED 隔離級別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED :最低的隔離級別,同上文TransactionDefinition.ISOLATION_READ_COMMITTED : 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),同上文
TransactionDefinition.ISOLATION_REPEATABLE_READ : 對同一字段的多次讀取結(jié)果都是一致的,同上文
TransactionDefinition.ISOLATION_SERIALIZABLE : 最高的隔離級別,事物同步執(zhí)行,同上文。
傳播行為
傳播行為是為了解決業(yè)務(wù)層中方法互相調(diào)用的事物問題。
主要體現(xiàn)在事物方法被另一個事物方法調(diào)用上。
Spring 同樣定義了注解來輔助配置
TransactionDefinition.PROPAGATION_REQUIRED? :? 使用最多,@Transactional注解默認(rèn)的事務(wù)傳播行為。如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。
TransactionDefinition.PROPAGATION_REQUIRES_NEW??:? 創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說不管外部方法是否開啟事:務(wù),Propagation.REQUIRES_NEW修飾的內(nèi)部方法會新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。
TransactionDefinition.PROPAGATION_NESTED?:?? 如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價
TransactionDefinition.PROPAGATION_MANDATORY??:? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。(mandatory:強(qiáng)制性)這個使用的很少
TransactionDefinition.PROPAGATION_SUPPORTS?:?? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行
TransactionDefinition.PROPAGATION_NOT_SUPPORTED?:?? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_NEVER??:? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常
后三種傳播行為有事物失效的風(fēng)險