Spring 宣告式事務的幾個使用的坑

2021-10-06 12:10:53 字數 3024 閱讀 8796

1.demo位址

github位址

2. 事務不生效

spring 預設通過動態**的方式實現 aop,對目標方法進行增強,private 方法無法被**到,spring 自然也無法動態增強事務處理邏輯

/**

* 一、事務不生效 1、spring 預設通過動態**的方式實現 aop,對目標方法進行增強,private 方法無法被**到,

* spring 自然也無法動態增強事務處理邏輯

** @param name

* @return

*/public

intcreateuserwrong1

(string name)

catch

(exception ex)

", ex.

getmessage()

);}return userrepository.

findbyname

(name)

.size()

;}// 這裡不生效,不會被**到

@transactional

private

void

createuserprivate

(userentity userentity)

}

必須通過**過的類從外部呼叫目標方法才能生效

/**

* 一、事務不生效 2、必須通過**過的類從外部呼叫目標方法才能生效

** @param name

* @return

*/public

intcreateuserwrong2

(string name)

catch

(exception ex)

", ex.

getmessage()

);}return userrepository.

findbyname

(name)

.size()

;}@transactional

public

void

createuserpublic

(userentity userentity)

}

spring 通過 cglb 通過繼承方式實現,private 在子類中不可見,自然無法進行事務增強, this 代表物件自己,spring 不可能注入 this,所以通過this方法訪問的必然不是**

@autowired

private userservice self;

/** * spring 通過 cglb 通過繼承方式實現,private 在子類中不可見,自然無法進行事務增強

* this 代表物件自己,spring 不可能注入 this,所以通過this方法訪問的必然不是**

** @param name

* @return

*/public

intcreateuserright

(string name)

catch

(exception ex)

", ex.

getmessage()

);}return userrepository.

findbyname

(name)

.size()

;}@transactional

public

void

createuserpublic

(userentity userentity)

}

3. 事務異常不回滾

異常必須丟擲**獲,或者手動設定回滾 transactionaspectsupport.currenttransactionstatus().setrollbackonly();

/**

* 二、事務異常不回滾 1、異常必須丟擲**獲,或者手動設定回滾

** @param userentity

*/@transactional

public

void

createuserpublic1

(userentity userentity)

catch

(exception ex)

預設捕獲 runtimeexception 和 error ,如果捕獲 checkedexception 需要通過註解設定 rollbackfor=exception.class

/**

* 二、事務異常不回滾 2、預設捕獲 runtimeexception 和 error ,

* 如果捕獲 checkedexception 需要通過註解設定 rollbackfor=exception.class

** @param userentity

* @throws ioexception

*/// @transactional(rollbackon = exception.class) // 解決:手動指定,可以回滾

@transactional

//原因:受檢查異常 預設不會回滾

public

void

createuserpublic2

(userentity userentity)

throws ioexception

private

void

orthertask()

throws ioexception

4. 事務傳播屬性配置

參考文章

spring 中的事務傳播

spring事務管理(詳解+例項)

@transactional 同乙個類中無事務方法a()內部呼叫有事務方法b()的問題

todo

5. controller呼叫多個service的事務方法

一般service方法是有事務的,把所有操作封裝在乙個service方法中是比較安全的。 如果在controller中呼叫多個service方法,只有查詢的情況下是可以這樣的。

Spring宣告式事務

net.sf.hibernate.dialect.oracle9dialect false true net.sf.hibernate.transaction.jdbctransactionfactory 1025 用heibernate來管理事務 當用spring和heibernate一起完成da...

spring宣告式事務

1.什麼是事務 事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性 要麼成功,要麼失敗 2.事務的特性 事務特性分為四個 原子性 atomicity 一致性 consistency 隔離性 isolation 持續性 durability ...

Spring 宣告式事務

propagation 事務傳播機制有如下幾種 required 預設值,表示如果存在乙個事務,則支援當前事務 如果沒有事務,則開啟乙個新事務。requires new 表示總是開啟乙個新的事務,如果乙個事務已經存在,則將這個存在的事務掛起,開啟新事務執行該方法。mandatory 表示如果存在乙個...