所有的數(shù)據(jù)訪問技術(shù)都有事務(wù)處理機制外里,這些技術(shù)提供了API用來開啟事務(wù)和提交事務(wù)來完成數(shù)據(jù)操作,或者在發(fā)生錯誤的時候回滾數(shù)據(jù)狡忙。
Spring支持聲明式事務(wù)燎竖,即使用注解來選擇使需要用事務(wù)的方法,它使用@Transactional注解在方法上哥捕,表明該方法需要事務(wù)支持牧抽。這是一個機遇AOP的實現(xiàn)操作。被注解的方法在被調(diào)用時遥赚,Spring開啟一個新的事務(wù)阎姥,當(dāng)方法無異常運行結(jié)束后,Spring會提交這個事務(wù)鸽捻。
springboot開啟事務(wù)很簡單,只需要一個注解@Transactional 就可以了泽腮。因為在springboot中已經(jīng)默認(rèn)對jpa御蒲、jdbc、mybatis開啟了事事務(wù)诊赊,引入它們依賴的時候厚满,事物就默認(rèn)開啟。當(dāng)然碧磅,如果你需要用其他的orm碘箍,比如beatlsql,就需要自己配置相關(guān)的事物管理器鲸郊。
下面演示springboot整合mybatis使用聲明式事務(wù)丰榴。
創(chuàng)建項目
首先創(chuàng)建項目,
因為spring默認(rèn)支持事務(wù)秆撮,所以不需要引入專門的事務(wù)依賴四濒。
接下來配置數(shù)據(jù)源和mybatis:
上面都是一些簡單的配置,不多說职辨,下面開始寫物業(yè)代碼盗蟆,首先是實體類:
然后是mapper類:
這里只定義了一個根據(jù)id修改name的方法,測試事務(wù)足夠了舒裤。接下來是service方法:
這里更新了兩個用戶喳资,接下來看controller類:
現(xiàn)在數(shù)據(jù)庫中手動初始化兩個數(shù)據(jù):
然后啟動項目測試接口:
根據(jù)鏈接可以看到更新了兩個名字:
數(shù)據(jù)庫中也更新成功了。
接下來讓中間發(fā)生一個異常:
0作為除數(shù)會引發(fā)運行時異常腾供,接下來啟動項目執(zhí)行接口:
可以看到果然引發(fā)了異常仆邓,再來看看數(shù)據(jù)庫:
可以看到一個成功鲜滩,一個失敗,這顯然是沒有加事務(wù)的原因宏赘。接下來加上事務(wù):
然后重啟項目绒北,訪問接口:
可以看到依然報錯,并且數(shù)據(jù)庫也沒發(fā)生改變察署。
事務(wù)不僅可以加在修改之類的方法上闷游,還可以加在查詢方法上,需要設(shè)置屬性
readOnly =true
屬性默認(rèn)的值時false贴汪。
事務(wù)加在方法上默認(rèn)對一個方法起作用脐往,加在類上面默認(rèn)對類中所有的方法起作用。比如可以在類上面加一個只讀事務(wù)
這樣所有的方法都是只讀扳埂,但是在增刪改等方法上面加上讀寫事務(wù)來覆蓋類事務(wù):
除了readOnly屬性股耽,還有rollbackFor屬性也常用,比如下面的意思就是碰到屬于Exception的異常就回滾:
springboot默認(rèn)的配置已經(jīng)可以滿足絕大部分需求谓娃,所以需要使用事務(wù)基本上直接使用注解即可展东,不需要像ssm那樣再配置其它的內(nèi)容。
代碼地址:?https://gitee.com/blueses/spring-boot-demo