javascript
SpringBoot学习笔记(8):事物处理
SpringBoot學習筆記(8):事物處理
快速入門
在傳統的JDBC事務代碼開發過程中,業務代碼只有一部分,大部分都是與JDBC有關的功能代碼,比如數據庫的獲取與關閉以及事務的提交與回滾、大量的try..catch..finally語句。
Spring Boot利用AOP為我們提供了一個數據庫事務的約定流程。通過這個約定流程就可以減少大量的冗余代碼和一些沒必要的異常捕獲語句,讓開發者更加集中于業務的開發,而不是反復編寫如數據庫的獲取與關閉以及事務的提交與回滾、大量的try..catch..finally語句等。即只要我們遵循約定,就可以把自己開發的代碼織入約定的流程中。
下圖為Spring數據庫事務約定:
聲明式事務
通過使用@Transactional標注告訴Spring在什么地方啟用數據庫事務功能。這個注解可以標注在類或者方法上,標注在類上表示這個類所有功能非靜態的方法都啟用事務功能。
在Spring Boot中,當我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時候,框架會自動默認分別注入DataSourceTransactionManager或JpaTransactionManager。所以我們不需要任何額外配置就可以用@Transactional注解進行事務的使用。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency>?
示例
添加注解1:@EnableTransactionManagement啟動事物管理器
@SpringBootApplication @EnableTransactionManagement public class MsSupplyAndSaleApplication {public static void main(String[] args) {SpringApplication.run(MsSupplyAndSaleApplication.class, args);} }添加注解2:@Transaction在方法或類上啟動事物處理
@Service public class GoodsService {@Autowiredprivate GoodsMapper goodsMapper;@Transactionalpublic void addGoods(Goods goods){goodsMapper.addGoods(goods);}//.... }?
隔離級別
隔離級別是指若干個并發的事務之間的隔離程度,與我們開發時候主要相關的場景包括:臟讀取、重復讀、幻讀。
- DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是:READ_COMMITTED。
- READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀和不可重復讀,因此很少使用該隔離級別。
- READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
- REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止臟讀和不可重復讀。
- SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
指定事物的隔離級別:
@Transactional(isolation = Isolation.DEFAULT)傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。
- REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
- SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
- MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
- REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
- NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
- NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
- NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于REQUIRED。
指定事物的傳播行為:
@Transactional(propagation = Propagation.REQUIRED)
轉載于:https://www.cnblogs.com/MrSaver/p/8723559.html
總結
以上是生活随笔為你收集整理的SpringBoot学习笔记(8):事物处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 高级网络操作 - Pyth
- 下一篇: 我对外键的回忆