之前搭建的Spring boot Mybatis 整合(注解版)中我們簡單的使用了springboot的事務(wù)管理,,那么接下來講解一下事務(wù)管理的詳細(xì)配置
之前的例子中我們使用了默認(rèn)的事務(wù)配置,可以滿足一些基本的事務(wù)需求,,但是當(dāng)我們項(xiàng)目較大較復(fù)雜時(shí)(比如,,有多個(gè)數(shù)據(jù)源等),這時(shí)候需要在聲明事務(wù)時(shí),,指定不同的事務(wù)管理器,。在聲明事務(wù)時(shí),只需要通過value屬性指定配置的事務(wù)管理器名即可,,例如:@Transactional(value="transactionManagerPrimary") ,。
除了指定不同的事務(wù)管理器之后,還能對(duì)事務(wù)進(jìn)行隔離級(jí)別和傳播行為的控制,,下面分別詳細(xì)解釋:
隔離級(jí)別
隔離級(jí)別是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度,,與我們開發(fā)時(shí)候主要相關(guān)的場(chǎng)景包括:臟讀取、重復(fù)讀、幻讀,。
我們可以看org.springframework.transaction.annotation.Isolation 枚舉類中定義了五個(gè)表示隔離級(jí)別的值:
public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8);
}
DEFAULT :這是默認(rèn)值,,表示使用底層數(shù)據(jù)庫的默認(rèn)隔離級(jí)別。對(duì)大部分?jǐn)?shù)據(jù)庫而言,,通常這值就是:READ_COMMITTED ,。
READ_UNCOMMITTED :該隔離級(jí)別表示一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)修改但還沒有提交的數(shù)據(jù)。該級(jí)別不能防止臟讀和不可重復(fù)讀,,因此很少使用該隔離級(jí)別,。
READ_COMMITTED :該隔離級(jí)別表示一個(gè)事務(wù)只能讀取另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)。該級(jí)別可以防止臟讀,,這也是大多數(shù)情況下的推薦值,。
REPEATABLE_READ :該隔離級(jí)別表示一個(gè)事務(wù)在整個(gè)過程中可以多次重復(fù)執(zhí)行某個(gè)查詢,并且每次返回的記錄都相同,。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢,,這些新增的記錄也會(huì)被忽略。該級(jí)別可以防止臟讀和不可重復(fù)讀,。
SERIALIZABLE :所有的事務(wù)依次逐個(gè)執(zhí)行,,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,,該級(jí)別可以防止臟讀,、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能,。通常情況下也不會(huì)用到該級(jí)別,。
指定方法:通過使用isolation屬性設(shè)置,例如:
@Transactional(isolation = Isolation.DEFAULT)
傳播行為
所謂事務(wù)的傳播行為是指,,如果在開始當(dāng)前事務(wù)之前,,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為,。
我們可以看org.springframework.transaction.annotation.Propagation 枚舉類中定義了6個(gè)表示傳播行為的枚舉值:
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
}
- REQUIRED:如果當(dāng)前存在事務(wù),,則加入該事務(wù);如果當(dāng)前沒有事務(wù),,則創(chuàng)建一個(gè)新的事務(wù),。
- SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù),;如果當(dāng)前沒有事務(wù),,則以非事務(wù)的方式繼續(xù)運(yùn)行。
- MANDATORY:如果當(dāng)前存在事務(wù),,則加入該事務(wù),;如果當(dāng)前沒有事務(wù),,則拋出異常。
- REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù),,如果當(dāng)前存在事務(wù),,則把當(dāng)前事務(wù)掛起。
- NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起,。
- NEVER:以非事務(wù)方式運(yùn)行,,如果當(dāng)前存在事務(wù),則拋出異常,。
- NESTED:如果當(dāng)前存在事務(wù),,則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù),,則該取值等價(jià)于REQUIRED,。
指定方法:通過使用propagation屬性設(shè)置,例如:
@Transactional(propagation = Propagation.REQUIRED)
原文作者:程序員didi
原文鏈接:http://blog./springboottransactional/
|