Spring AOP事務管理

1 Spring中AOP事務簡介

1.1 事務

事務(Transaction)是一個業務,是一個不可分割的邏輯工做單元,基於事務能夠更好的保證業務的正確性。spring

1.2 事務特性: (ACID特性)

原子性(Atomicity):一個事務中的多個操做要麼都成功要麼都失敗
一致性(Consistency): 操做先後總數應該是一致的。
隔離性(Isolation):事務與事務之間是相互隔離的
持久性(Durability):事務一旦提交數據會持久保存到數據庫sql

2 Spring中事務管理

2.1spring中事務方式概述

Spring框架中提供了一種聲明式事務的處理方式,此方式基於AOP代理,能夠將具體業務邏輯與事務處理進行解耦。也就是讓咱們的業務代碼邏輯不受污染或少許污染,就能夠實現事務控制。數據庫

在SpringBoot項目中,其內部提供了事務的自動配置,當咱們在項目中添加了指定依賴spring-boot-starter-jdbc時,框架會自動爲咱們的項目注入事務管理器對象,最經常使用的爲DataSourceTransactionManager對象。編程

2.2實際項目中最經常使用的註解方式的事務管理

基於@Transactional 註解進行聲明式事務管理的實現步驟

1) 啓用聲明式事務管理,在項目啓動類上添加@EnableTransactionManagement,我們新版本中也可不添加(例如新版Spring Boot項目)。安全

2) 將@Transactional註解添加到合適的業務類或方法上,並設置合適的屬性信息。併發

2.3 AOP 編程中基於註解方式的事務控制@Transactional

2.3.1@Transactional描述類表示類中全部方法都要進行事務控制,假如方法上也有該註解則方法上的事務註解特性優先級比較高
2.3.2 readOnly屬性 含義:是否爲只讀事務(只容許查詢操做 其餘操做不容許) 默認值是false。readOnly=false所註解的方法或類表明增長,刪除,修改業務.readOnly=true表明讀取數據
2.3.3 rollbackFor屬性含義是(什麼異常回滾事務) 默認值是(RuntimeException與Error 出現這倆個都會回滾事務 可是檢查異常(IllegalAccessException)不回滾)
2.3.4 noRollbackFor屬性 含義是什麼(什麼狀況下不回滾),沒有默認值
2.3.5 timeout 屬性
含義爲是否支持事務超時,默認沒有值,若爲-1默認不支持事務超時,咱們能夠定義超時時間。若是配置了具體時間,則超過該時間限制但事務尚未完成,則自動回滾事務。這個時間的記錄方式是在事務開啓之後到sql語句執行以前。
2.3.6 isolation=Isolation.READ_COMMITTED (默認寫成它就行 不出現髒讀),把事務隔離級別設置爲它,不容許出現髒讀(事務隔離級別較低)。隔離級別越高併發就會越小,性能越差,但更安全。框架

事務控制過程分析

image
Spring事務管理是基於接口代理(JDK)或動態字節碼(CGLIB)技術,而後經過AOP實施事務加強的。當咱們執行添加了事務特性的目標方式時,系統會經過目標對象的代理對象調用DataSourceTransactionManager對象,在事務開始的時,執行doBegin方法,事務結束時執行doCommit或doRollback方法。ide

3 Spring 中事務傳播特性

事務傳播(Propagation)特性指"不一樣業務(service)對象"中的事務方法之間相互調用時,事務的傳播方式。spring-boot

3.1經常使用事務傳播方式

3.1.1@Transactional(propagation=Propagation.REQUIRED)
若是沒有事務建立新事務, 若是當前有事務參與當前事務, Spring 默認的事務傳播行爲是PROPAGATION_REQUIRED,它適合於絕大多數的狀況。高併發

//代碼示例
@Transactional(propagation = Propagation.REQUIRED)

 @Override

 public List<Node> findZtreeMenuNodes() {

 return sysMenuDao.findZtreeMenuNodes();

 }

當有一個業務對象調用如上方法時,此方法始終工做在一個已經存在的事務方法,或者是由調用者建立的一個事務方法中。
3.1.2@Transactional(propagation=Propagation.REQUIRES_NEW)
必須是新事務, 若是有當前事務, 掛起當前事務而且開啓新事務。

//代碼示例
@Transactional(propagation = Propagation.REQUIRES_NEW)

 @Override

 public void saveObject(SysLog entity) {

 sysLogDao.insertObject(entity);

 }

當有一個業務對象調用如上業務方法時,此方法會始終運行在一個新的事務中。

相關文章
相關標籤/搜索