上面的例子中咱們使用了默認的事務配置,能夠知足一些基本的事務需求,可是當咱們項目較大較複雜時(好比,有多個數據源等),這時候須要在聲明事務時,指定不一樣的事務管理器。對於不一樣數據源的事務管理配置能夠見《Spring Boot多數據源配置與使用》中的設置。在聲明事務時,只須要經過value屬性指定配置的事務管理器名便可,例如:@Transactional(value="transactionManagerPrimary")
。html
除了指定不一樣的事務管理器以後,還能對事務進行隔離級別和傳播行爲的控制,下面分別詳細解釋:spring
#### 隔離級別數據庫
隔離級別是指若干個併發的事務之間的隔離程度,與咱們開發時候主要相關的場景包括:髒讀取、重複讀、幻讀。springboot
咱們能夠看org.springframework.transaction.annotation.Isolation
枚舉類中定義了五個表示隔離級別的值:併發
public enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8); }
DEFAULT
:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,一般這值就是:READ_COMMITTED
。READ_UNCOMMITTED
:該隔離級別表示一個事務能夠讀取另外一個事務修改但尚未提交的數據。該級別不能防止髒讀和不可重複讀,所以不多使用該隔離級別。READ_COMMITTED
:該隔離級別表示一個事務只能讀取另外一個事務已經提交的數據。該級別能夠防止髒讀,這也是大多數狀況下的推薦值。REPEATABLE_READ
:該隔離級別表示一個事務在整個過程當中能夠屢次重複執行某個查詢,而且每次返回的記錄都相同。即便在屢次查詢之間有新增的數據知足該查詢,這些新增的記錄也會被忽略。該級別能夠防止髒讀和不可重複讀。SERIALIZABLE
:全部的事務依次逐個執行,這樣事務之間就徹底不可能產生干擾,也就是說,該級別能夠防止髒讀、不可重複讀以及幻讀。可是這將嚴重影響程序的性能。一般狀況下也不會用到該級別。指定方法:經過使用isolation
屬性設置,例如:性能
@Transactional(isolation = Isolation.DEFAULT)
所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲。spa
咱們能夠看org.springframework.transaction.annotation.Propagation
枚舉類中定義了6個表示傳播行爲的枚舉值:code
public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW(3), NOT_SUPPORTED(4), NEVER(5), NESTED(6); }
REQUIRED
:若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務。SUPPORTS
:若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。MANDATORY
:若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。REQUIRES_NEW
:建立一個新的事務,若是當前存在事務,則把當前事務掛起。NOT_SUPPORTED
:以非事務方式運行,若是當前存在事務,則把當前事務掛起。NEVER
:以非事務方式運行,若是當前存在事務,則拋出異常。NESTED
:若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行;若是當前沒有事務,則該取值等價於REQUIRED
。指定方法:經過使用propagation
屬性設置,例如:htm
@Transactional(propagation = Propagation.REQUIRED)
源碼來源blog