天天看點

Spring事物備忘錄

第一該注解本身存在的問題

我一直認為是隻對資料庫有效

第二:如果同時存在mysql和redis,會復原麼

Spring事物的那些坑

https://www.jianshu.com/p/a4229aa79ace 據我所知,spring事物是有坑的,這裡要小心注意,也是需要認真嚴謹的去研究的

https://blog.csdn.net/qq_16605855/article/details/79653282

Spring本身是不實作事物,其中具體實作是對資料庫事物的封裝,對于需要事物的操作,spring在擷取資料連接配接時會擷取與事物相關的資料庫連接配接,而且對于一個事物來說連接配接是唯一的,也就是說不同的資料庫連接配接事物更是無從談起。

思考開發過程中的一個問題:

先把資料寫入到mysql,在把資料寫到redis,為了一緻性,是否可以使用事物

理論上事物是不會對兩個過程生效,即如果mysql寫入成功,但是redis寫入失敗,一緻性問題仍然會出現。

當然這裡有一個折中的方法,就是使用mysql事物,但是在redis操作地方進行異常捕捉,如果redis發生異常手動抛出可引起復原的異常。

關于spring事物的幾個坑:

  1. 接口上的注解:

    Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實作的任何接口上。你當然可以在接口上使用 @Transactional 注解,但是這将隻能當你設定了基于接口的代理時它才生效。因為注解是不能繼承的,這就意味着如果你正在使用基于類的代理時,那麼事務的設定将不能被基于類的代理所識别,而且對象也将不會被事務代理所包裝(将被确認為嚴重的)。是以,請接受Spring團隊的建議并且在具體的類上使用 @Transactional 注解。

    意思就是說:對于自己實作的接口沒必要加注解,注解不可繼承。真針對spring幫你實作的接口才有意義。比如jpa,mybatis的接口。

  2. 異常復原問題:

    Spring架構的事務基礎架構代碼将預設地隻在抛出運作時和unchecked exceptions時才辨別事務復原也就是說,當抛出個RuntimeException 或其子類例的執行個體時。(Errors 也一樣 - 預設地 - 辨別事務復原。)從事務方法中抛出的Checked exceptions将 ****不 被辨別進行事務復原。

  3. 手動多線程擷取連接配接時事物會失效,很好明白,事物肯定要在一個連接配接裡
  4. 事物逾時,事物逾時似乎隻對jdbcTemplate有效
    Spring事物備忘錄