【快學springboot】9.使用 @Transactional 註解配置事務管理

介紹

springboot對數據庫事務的使用很是的方便,只須要在方法上添加@Transactional註解便可。Spring 爲事務管理提供了豐富的功能支持。Spring 事務管理分爲編程式和聲明式的兩種方式。編程式事務指的是經過編碼方式實現事務;聲明式事務基於 AOP,將具體業務邏輯與事務處理解耦。聲明式事務管理使業務代碼邏輯不受污染, 所以在實際使用中聲明式事務用的比較多。java

使用Transactional註解

Transactional註解使用起來是很是簡單的,只須要在相應的方法上面標識Transactional註解便可。spring

下面經過一個簡單的例子演示Transaction註解的使用數據庫

@Transactional
@Override
public void addUser() {
 User user1 = new User();
 user1.setUsername("happyjava1");
 user1.setPassword("123456");
 userRepo.save(user1);
 int i = 1 / 0;
 User user2 = new User();
 user2.setUsername("happyjava2");
 user2.setPassword("123456");
 userRepo.save(user2);
}
複製代碼

這裏保存兩個用戶,而後經過 1/0 的方式使程序出現異常。經過一個測試方法測試:編程

@Test
public void testTx() {
 userService.addUser();
}
複製代碼

若是數據庫沒有user1這條記錄,說明事物是起做用了的。springboot

【快學springboot】使用 @Transactional 註解配置事務管理

執行結果是預期的報錯了。bash

【快學springboot】使用 @Transactional 註解配置事務管理

數據庫也沒有jappyjava1這個字段。說明Transactional註解起做用了。app

Transactional註解經過noRollbackFor配置不回滾的異常

Transactional註解能夠配置發生某個異常時不進行回滾。好比我在Transaction註解上添加以下屬性,指定ArithmeticException不進行事務的回滾。ide

@Transactional(noRollbackFor = ArithmeticException.class)
複製代碼

再次運行測試方法。測試

【快學springboot】使用 @Transactional 註解配置事務管理

依然報錯了,可是查看數據庫,user1這條記錄已經插入數據庫了。編碼

【快學springboot】使用 @Transactional 註解配置事務管理

經過propagation屬性配置事務的傳播行爲

事務的傳播行爲,默認值爲 Propagation.REQUIRED。能夠手動指定其餘的事務傳播行爲,以下:

  • Propagation.REQUIRED

若是當前存在事務,則加入該事務,若是當前不存在事務,則建立一個新的事務。

  • Propagation.SUPPORTS

若是當前存在事務,則加入該事務;若是當前不存在事務,則以非事務的方式繼續運行。

  • Propagation.MANDATORY

若是當前存在事務,則加入該事務;若是當前不存在事務,則拋出異常。

  • Propagation.REQUIRES_NEW

從新建立一個新的事務,若是當前存在事務,暫停當前的事務。

  • Propagation.NOT_SUPPORTED

以非事務的方式運行,若是當前存在事務,暫停當前的事務。

  • Propagation.NEVER

以非事務的方式運行,若是當前存在事務,則拋出異常。

  • Propagation.NESTED

若是沒有,就新建一個事務;若是有,就在當前事務中嵌套其餘事務。

經過isolation 屬性配置事務的隔離級別

事務的隔離級別,默認值爲 Isolation.DEFAULT,這個跟數據庫的隔離級別有關係。能夠自定義隔離級別,以下:

  • Isolation.DEFAULT
  • Isolation.READ_UNCOMMITTED
  • Isolation.READ_COMMITTED
  • Isolation.REPEATABLE_READ
  • Isolation.SERIALIZABLE

事務的傳播行爲和隔離級別是比較抽象的東西,本文做爲springboot的教程課程暫且不作探討,等後續有時間會再寫文章作探討。

timeout 屬性

事務的超時時間,默認值爲-1。若是設置了該時間,超過該時間限制但事務尚未完成,則自動回滾事務。

總結

本文只是介紹了springboot能夠經過Transactional註解,快速的配置事務管理。數據庫事務,是一個很複雜的東西,若是要講清楚,就不該該放在一篇springboot相關的文章中進行講解,後續會再起篇幅,單獨講講事務相關的東西。

相關文章
相關標籤/搜索