在SpringBoot項目中,我們經常會使用@Transactional注解進行聲明式事務控制,就簡單介紹一下@Transactional的使用。
要在Spring boot中支持事務,首先要導入Spring boot提供的JDBC或JPA依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <scope>test</scope> </dependency>
由於SpringBoot項目會自動開啟事務支持,所以啟動類上的@EnableTransactionManagement注解可以省略。
@Transactional不僅可以注解在方法上,也可以注解在類上。當注解在類上的時候意味着此類的所有public方法都是開啟事務的。如果類級別和方法級別同時使用了@Transactional注解,則使用在類級別的注解會重載方法級別的注解。
使用@Transactional注解進行事務控制時,可以在其中添加有關“隔離級別”和“傳播行為”的指定:
(1)隔離級別
DEFAULT :這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是: READ_COMMITTED 。
READ_UNCOMMITTED :該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀和不可重復讀,因此很少使用該隔離級別。
READ_COMMITTED :該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
REPEATABLE_READ :該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止臟讀和不可重復讀。
SERIALIZABLE :所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
指定方法:通過使用 isolation 屬性設置,例如:
@Transactional(isolation = Isolation.DEFAULT)
(2)傳播行為
REQUIRED :如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
SUPPORTS :如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
MANDATORY :如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
REQUIRES_NEW :創建一個新的事務,如果當前存在事務,則把當前事務掛起。
NOT_SUPPORTED :以非事務方式運行,如果當前存在事務,則把當前事務掛起。
NEVER :以非事務方式運行,如果當前存在事務,則拋出異常。
NESTED :如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於 REQUIRED 。
指定方法:通過使用 propagation 屬性設置,例如:
@Transactional(propagation = Propagation.REQUIRED)