所有的數(shù)據(jù)訪(fǎng)問(wèn)技術(shù)都有事務(wù)處理機(jī)制,這些技術(shù)提供了API用來(lái)開(kāi)啟事務(wù)和提交事務(wù)來(lái)完成數(shù)據(jù)操作,或者在發(fā)生錯(cuò)誤的時(shí)候回滾數(shù)據(jù)。
Spring支持聲明式事務(wù),即使用注解來(lái)選擇使需要用事務(wù)的方法,它使用@Transactional注解在方法上,表明該方法需要事務(wù)支持。這是一個(gè)機(jī)遇AOP的實(shí)現(xiàn)操作。被注解的方法在被調(diào)用時(shí),Spring開(kāi)啟一個(gè)新的事務(wù),當(dāng)方法無(wú)異常運(yùn)行結(jié)束后,Spring會(huì)提交這個(gè)事務(wù)。
springboot開(kāi)啟事務(wù)很簡(jiǎn)單,只需要一個(gè)注解@Transactional 就可以了。因?yàn)樵趕pringboot中已經(jīng)默認(rèn)對(duì)jpa、jdbc、mybatis開(kāi)啟了事事務(wù),引入它們依賴(lài)的時(shí)候,事物就默認(rèn)開(kāi)啟。當(dāng)然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相關(guān)的事物管理器。
下面演示springboot整合mybatis使用聲明式事務(wù)。
創(chuàng)建項(xiàng)目
首先創(chuàng)建項(xiàng)目,

因?yàn)閟pring默認(rèn)支持事務(wù),所以不需要引入專(zhuān)門(mén)的事務(wù)依賴(lài)。
接下來(lái)配置數(shù)據(jù)源和mybatis:


上面都是一些簡(jiǎn)單的配置,不多說(shuō),下面開(kāi)始寫(xiě)物業(yè)代碼,首先是實(shí)體類(lèi):

然后是mapper類(lèi):

這里只定義了一個(gè)根據(jù)id修改name的方法,測(cè)試事務(wù)足夠了。接下來(lái)是service方法:

這里更新了兩個(gè)用戶(hù),接下來(lái)看controller類(lèi):

現(xiàn)在數(shù)據(jù)庫(kù)中手動(dòng)初始化兩個(gè)數(shù)據(jù):

然后啟動(dòng)項(xiàng)目測(cè)試接口:

根據(jù)鏈接可以看到更新了兩個(gè)名字:

數(shù)據(jù)庫(kù)中也更新成功了。
接下來(lái)讓中間發(fā)生一個(gè)異常:

0作為除數(shù)會(huì)引發(fā)運(yùn)行時(shí)異常,接下來(lái)啟動(dòng)項(xiàng)目執(zhí)行接口:

可以看到果然引發(fā)了異常,再來(lái)看看數(shù)據(jù)庫(kù):

可以看到一個(gè)成功,一個(gè)失敗,這顯然是沒(méi)有加事務(wù)的原因。接下來(lái)加上事務(wù):

然后重啟項(xiàng)目,訪(fǎng)問(wèn)接口:


可以看到依然報(bào)錯(cuò),并且數(shù)據(jù)庫(kù)也沒(méi)發(fā)生改變。
事務(wù)不僅可以加在修改之類(lèi)的方法上,還可以加在查詢(xún)方法上,需要設(shè)置屬性
readOnly =true
屬性默認(rèn)的值時(shí)false。
事務(wù)加在方法上默認(rèn)對(duì)一個(gè)方法起作用,加在類(lèi)上面默認(rèn)對(duì)類(lèi)中所有的方法起作用。比如可以在類(lèi)上面加一個(gè)只讀事務(wù)

這樣所有的方法都是只讀,但是在增刪改等方法上面加上讀寫(xiě)事務(wù)來(lái)覆蓋類(lèi)事務(wù):

除了readOnly屬性,還有rollbackFor屬性也常用,比如下面的意思就是碰到屬于Exception的異常就回滾:

springboot默認(rèn)的配置已經(jīng)可以滿(mǎn)足絕大部分需求,所以需要使用事務(wù)基本上直接使用注解即可,不需要像ssm那樣再配置其它的內(nèi)容。
代碼地址:?https://gitee.com/blueses/spring-boot-demo