Spring Boot事務配置管理

2021-10-05 10:12:24 字數 2585 閱讀 3700

場景:我們在開發企業應用時,由於資料操作在順序執行的過程中,線上可能有各種無法預知的問題,

任何一步操作都有可能發生異常,異常則會導致後續的操作無法完成。此時由於業務邏輯並未正確的完

成,所以在之前操作過資料庫的動作並不可靠,需要在這種情況下進行資料的回滾。

1匯入依賴

springboot的事務管理需要匯入spring-boot-starter-jdbc;而我們匯入的mybatis-spring-boot-starter包含了它,所以無需重複匯入;

>

>

org.mybatis.spring.bootgroupid

>

>

mybatis-spring-boot-starterartifactid

>

>

2.1.1version

>

dependency

>

2.事務測試
@insert

("insert into tb_filminfo (typeid,filmname,ticketprice) values(#,#,#)"

)int

insert

(filminfopo po)

;

2)service介面

public

inte***ce

ifilminfoservice

4)controller類

@controller

("/film"

)public

class

filminfocontroller

else

}}

當沒有異常丟擲時新增成功,有異常出現新增失敗;

3事務處理的一些特殊情況

1)異常並沒有**獲到

異常並沒有被 」捕獲「 到,導致事務並沒有回滾。

spring boot 預設的事務規則是遇到執行異常(runtimeexception)和程式 錯誤(error)才會回滾。但是丟擲 sqlexception 就無法回滾了。

@transactional

@override

public

void

insert

(filminfopo po)

throws sqlexception

這樣就插入失敗了;

2)異常在方法中**獲導致事務回滾失敗

我們在處理異常時,有兩種方式, 要麼丟擲去,讓上一層來捕獲處理;要麼把異常 try catch 掉,在異常出現的地方給處理掉。就因為有 這中 try…catch,所以導致異常被 」吃「 掉,事務無法回滾。

@transactional

@override

public

intinsert

(filminfopo po)

catch

(exception e)

insert

(po)

;}

記錄成功被插入;

3)事務的範圍 衝突導致回滾失敗

許多業務需要在高併發的情況下保證資料唯一性所比要加synchronized關鍵字如乙個資料庫中,針對某個使用者,只有一條記錄,下乙個插入動作過來,會先判斷該資料庫 中有沒有相同的使用者,如果有就不插入,就更新,沒有才插入,所以理論上,資料庫中永遠就一條同一 使用者資訊,不會出現同一資料庫中插入了兩條相同使用者的資訊。

@transactional

(rollbackfor = exception.

class

)@override

public

synchronized

void

insert

(filminfopo po)

throws sqlexception

但是在壓測時,資料庫中確實可能有兩條同一使用者的資訊,分析其原因,在於事務的

範圍和鎖的範圍問題。

在執行該方法開始時,事務啟動,執行 完了後,事務關閉。但是 synchronized 沒有起作用,其實根本原因是因為事務的範圍比鎖的範圍大。 也就是說,在加鎖的那部分**執行完之後,鎖釋放掉了,但是事務還沒結束,此時另乙個執行緒進來 了,事務沒結束的話,第二個執行緒進來時,資料庫的狀態和第乙個執行緒剛進來是一樣的。即由於mysql innodb引擎的預設隔離級別是可重複讀(在同乙個事務裡,select的結果是事務開始時時間點的狀 態),執行緒二事務開始的時候,執行緒一還沒提交完成,導致讀取的資料還沒更新。第二個執行緒也做了插 入動作,導致了髒資料。

解決方案:

1.把事務去掉即可(不推薦);

2. 在呼叫該 service 的地方加鎖,保證鎖 的範圍比事務的範圍大即可。

springboot 事務aop自動配置

自動配置類org.springframework.boot.autoconfigure.transaction.transactionautoconfiguration 配置類 不貼了,但配置類中有個重要的註解是一定要的 enabletransactionmanagement target elem...

spring boot裡配置事務管理

具體看這裡 transactional propagation propagation.required 主要用於增刪改 使用當前的事務,如果當前沒有事務,則自己新建乙個事務,子方法是必須執行在乙個事務中的 如果當前存在事務,則加入這個事務,成為乙個整體 transactional propagat...

springboot mybatis 事務管理

宣告式的事務管理是基於aop的,在springboot中可以通過 transactional註解的方式獲得支援,這種方式的優點是 1 非侵入式,業務邏輯不受事務管理 的汙染。2 方法級別的事務回滾,合理劃分方法的粒度可以做到符合各種業務場景的事務管理。我們在springboot mybatis dr...