場景:我們在開發企業應用時,由於資料操作在順序執行的過程中,線上可能有各種無法預知的問題,
任何一步操作都有可能發生異常,異常則會導致後續的操作無法完成。此時由於業務邏輯並未正確的完
成,所以在之前操作過資料庫的動作並不可靠,需要在這種情況下進行資料的回滾。
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...