spring基礎知識 (25) 事務的傳播行為

2021-08-19 23:49:13 字數 1654 閱讀 3131

還是小花給小明轉賬的問題:

本節只提供部分**,其餘的**請去上一節檢視:

認識事務並配置乙個jdbc事務管理

這次轉賬兩次,第一次轉賬100元,第二次50元。定義乙個batchtransfer方法,將兩次轉賬放在一起進行批量轉賬.

初始資料:

預設傳播屬性@transactional相當於@transactional(propagation=propagation.required)

//轉賬

@transactional

public

void

transfer(int money)

@autowired

private transferdao transferdao;

@transactional

public

void

batchtransfer()

transferservice transferservice = (transferservice) ctx.getbean("transferservice");

//執行轉賬

從截圖看很容易發現,確實轉賬了兩次,第一次轉賬成功,第二次發生了餘額不足的異常,但是檢視資料庫,發現賬戶餘額不變,這就是事務的預設傳播屬性:@transactional(propagation=propagation.required)

事務預設傳播屬性,兩次流程放在了乙個事務中管理,當所有流程結束再進行統一提交,出現問題也是一起整體回滾。

//轉賬

@transactional(propagation=propagation.requires_new)

public

void

transfer(int money)

其他的**不變.

賬戶餘額發生了變動,第一次轉賬成功了。 這就是requires_new,將兩次交易放在兩個分開的事務中,各自完成各自的工作。

transfer方法是業務處理方法,本應該定義在sevice中的,但是為了驗證requires_new,這裡將之定義在了dao層。批量轉賬和轉賬兩個方法必須在不同的類中requires_new才有效。

這個常用於只進行查詢的方法

事務基礎知識

幻讀和不可重複讀都是讀取了另一條已經提交的事務 這點就髒讀不同 所不同的是不可重複讀查詢的都是同乙個資料項,而幻讀針對的是一批資料整體 比如資料的個數 鎖在mysql資料庫中預設的隔離級別為repeatable read 可重複讀 serializable 序列化 可避免髒讀 不可重複讀 幻讀的發生...

spring基礎知識

通知 advice 通知定義了要織入目標物件的邏輯,以及執行時機。spring 中對應了 5 種不同型別的通知 前置通知 before 在目標方法執行前,執行通知 後置通知 after 在目標方法執行後,執行通知,此時不關係目標方法返回的結果是什麼 返回通知 after returning 在目標方...

spring基礎知識詳解

spring注入方式 xml配置注入 xml注入分為 構造方法注入 和setter方法注入 配置如下 使用p命名空間注入 詳情可參考spring spel表示式 簡化setter方法注入 setter方法注入 p命令空間 普通值 p 屬性名 值 引用值 p 屬性名 ref 引用名稱 前提 必須新增p...