之前搭建的Spring boot Mybatis 整合(注解版)中我們簡單的使用了springboot的事務(wù)管理,那么接下來講解一下事務(wù)管理的詳細配置
之前的例子中我們使用了默認的事務(wù)配置泛范,可以滿足一些基本的事務(wù)需求紊撕,但是當我們項目較大較復(fù)雜時(比如罢荡,有多個數(shù)據(jù)源等)对扶,這時候需要在聲明事務(wù)時,指定不同的事務(wù)管理器浪南。在聲明事務(wù)時,只需要通過value屬性指定配置的事務(wù)管理器名即可骡送,例如:@Transactional(value="transactionManagerPrimary")
昂羡。
除了指定不同的事務(wù)管理器之后各谚,還能對事務(wù)進行隔離級別和傳播行為的控制,下面分別詳細解釋:
隔離級別
隔離級別是指若干個并發(fā)的事務(wù)之間的隔離程度赴穗,與我們開發(fā)時候主要相關(guān)的場景包括:臟讀取、重復(fù)讀般眉、幻讀潜支。
我們可以看org.springframework.transaction.annotation.Isolation
枚舉類中定義了五個表示隔離級別的值:
public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8);
}
-
DEFAULT
:這是默認值,表示使用底層數(shù)據(jù)庫的默認隔離級別冗酿。對大部分數(shù)據(jù)庫而言,通常這值就是:READ_COMMITTED
裁替。 -
READ_UNCOMMITTED
:該隔離級別表示一個事務(wù)可以讀取另一個事務(wù)修改但還沒有提交的數(shù)據(jù)。該級別不能防止臟讀和不可重復(fù)讀弱判,因此很少使用該隔離級別。 -
READ_COMMITTED
:該隔離級別表示一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù)开伏。該級別可以防止臟讀,這也是大多數(shù)情況下的推薦值固灵。 -
REPEATABLE_READ
:該隔離級別表示一個事務(wù)在整個過程中可以多次重復(fù)執(zhí)行某個查詢株婴,并且每次返回的記錄都相同怎虫。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢困介,這些新增的記錄也會被忽略蘸际。該級別可以防止臟讀和不可重復(fù)讀。 -
SERIALIZABLE
:所有的事務(wù)依次逐個執(zhí)行粮彤,這樣事務(wù)之間就完全不可能產(chǎn)生干擾姜骡,也就是說屿良,該級別可以防止臟讀、不可重復(fù)讀以及幻讀尘惧。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別喷橙。
指定方法:通過使用isolation屬性設(shè)置,例如:
@Transactional(isolation = Isolation.DEFAULT)
傳播行為
所謂事務(wù)的傳播行為是指悬荣,如果在開始當前事務(wù)之前,一個事務(wù)上下文已經(jīng)存在氯迂,此時有若干選項可以指定一個事務(wù)性方法的執(zhí)行行為言缤。
我們可以看org.springframework.transaction.annotation.Propagation
枚舉類中定義了6個表示傳播行為的枚舉值:
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
}
- REQUIRED:如果當前存在事務(wù),則加入該事務(wù)轧简;如果當前沒有事務(wù),則創(chuàng)建一個新的事務(wù)哮独。
- SUPPORTS:如果當前存在事務(wù),則加入該事務(wù)皮璧;如果當前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行睹限。
- MANDATORY:如果當前存在事務(wù),則加入該事務(wù)羡疗;如果當前沒有事務(wù)别洪,則拋出異常叨恨。
- REQUIRES_NEW:創(chuàng)建一個新的事務(wù)挖垛,如果當前存在事務(wù)秉颗,則把當前事務(wù)掛起送矩。
- NOT_SUPPORTED:以非事務(wù)方式運行,如果當前存在事務(wù)栋荸,則把當前事務(wù)掛起。
- NEVER:以非事務(wù)方式運行蒸其,如果當前存在事務(wù),則拋出異常摸袁。
- NESTED:如果當前存在事務(wù),則創(chuàng)建一個事務(wù)作為當前事務(wù)的嵌套事務(wù)來運行蜂大;如果當前沒有事務(wù),則該取值等價于REQUIRED奶浦。
指定方法:通過使用propagation屬性設(shè)置踢星,例如:
@Transactional(propagation = Propagation.REQUIRED)
原文作者:程序員didi
原文鏈接:http://blog.didispace.com/springboottransactional/
微信公眾號
關(guān)注我的微信公眾號:CodeD
不定期分享新的技術(shù)知識