Spring中Transactional注解使用的心得(推薦)
事務(wù)特性
@Transactional注解是用于事務(wù)控制的,需要知道事務(wù)的ACID特征:即原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)、持久性(Durability)。
事務(wù)是用來(lái)控制數(shù)據(jù)的ACID特性的,用于保證數(shù)據(jù)的正確性和完整性。
@Transactional注解有兩種使用方式:
(1)標(biāo)注在類上面:當(dāng)作用于類上時(shí),該類的所有public方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該標(biāo)注來(lái)覆蓋類級(jí)別的定義。
(2)標(biāo)注在方法上面:當(dāng)作用于方法上時(shí),只有當(dāng)該方法發(fā)生了異常才會(huì)進(jìn)行回滾,其他的方法不受影響。
在項(xiàng)目中使用,@Transactional(rollbackFor=Exception.class),如果類加了這個(gè)注解,那么這個(gè)類里面的方法拋出異常,就會(huì)回滾,數(shù)據(jù)庫(kù)里面的數(shù)據(jù)也會(huì)回滾。在@Transactional注解中如果不配置rollbackFor屬性,那么事物只會(huì)在遇到RuntimeException的時(shí)候才會(huì)回滾,加上rollbackFor=Exception.class,可以讓事物在遇到非運(yùn)行時(shí)異常時(shí)也回滾。
今天看黑馬redis的課,里面講到了一個(gè)事務(wù)注解不生效的問(wèn)題。
究其原因,就在于Spring中事務(wù)注解生效的條件。那么接下來(lái)就說(shuō)一下自己的心得。
- 查了一下資料,就是說(shuō)如果想讓@Transactional注解生效,那么就只有當(dāng)被代理類對(duì)象調(diào)用它的事務(wù)方法時(shí),事務(wù)注解才會(huì)起作用。
- 那如何才能創(chuàng)建代理對(duì)象呢,這個(gè)Spring也幫我們做好了。
- 只要使用注入bean的方式(也就是依賴注入的方式)去創(chuàng)建bean對(duì)象,該bean對(duì)象調(diào)用被@T注解了的方法,那么就會(huì)走代理類,從而@T注解就起作用了。
以下說(shuō)一下例子吧
public class VoucherOrderServiceImpl implements IVoucherOrderService
@Override
public Result seckillVocher(Long voucherId) {
IVoucherOrderService o = (IVoucherOrderService) AopContext.currentProxy();
return o.secKill(voucherId);
}
@Override
@Transactional
public Result secKill(Long voucherId) {
}
}
- 在一個(gè)方法中調(diào)用另一個(gè)@T注釋的方法,如果直接this.xxx()去調(diào)用,那么@T不會(huì)生效,上面說(shuō)的原因嘛,沒(méi)有走動(dòng)態(tài)代理類。
- 那怎么辦呢,我們手動(dòng)的創(chuàng)建一個(gè)代理類對(duì)象就能解決改問(wèn)題。
- 為什么要生成IVoucherOrderService這個(gè)類型的動(dòng)態(tài)代理類對(duì)象呢?
-- 這樣想:1.我們要去調(diào)用該類的@T方法,肯定要指定成該對(duì)象類型。2.換個(gè)說(shuō)法,如果使用注入bean的方式調(diào)用該@T方法,不也是生成這個(gè)類型的代理類對(duì)象嗎
到此這篇關(guān)于Spring中Transactional注解使用的心得的文章就介紹到這了,更多相關(guān)Spring Transactional注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA運(yùn)行Java項(xiàng)目報(bào)錯(cuò)java: 錯(cuò)誤: 不支持發(fā)行版本 xx的解決方法
這篇文章主要介紹了IDEA運(yùn)行Java項(xiàng)目報(bào)錯(cuò)java: 錯(cuò)誤: 不支持發(fā)行版本 xx的解決方法,文中有詳細(xì)的解決方案供大家參考,對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下2025-04-04
使用springboot aop來(lái)實(shí)現(xiàn)讀寫分離和事物配置
這篇文章主要介紹了使用springboot aop來(lái)實(shí)現(xiàn)讀寫分離和事物配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
SpringCloud使用Nacos保存和讀取變量的配置方法
在使用SpringCloud開發(fā)微服務(wù)時(shí),經(jīng)常會(huì)遇到一些比較小的后臺(tái)參數(shù)配置,這些配置不足以單獨(dú)開一張表去存儲(chǔ),而且其他服務(wù)會(huì)讀取該參數(shù),這篇文章主要介紹了SpringCloud使用Nacos保存和讀取變量,需要的朋友可以參考下2022-07-07
java監(jiān)聽器的實(shí)現(xiàn)和原理詳解
這篇文章主要給大家介紹了關(guān)于java監(jiān)聽器實(shí)現(xiàn)和原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
java學(xué)習(xí)之一維數(shù)組中重復(fù)元素的去除
關(guān)于一維數(shù)組中有重復(fù)的元素該怎么剔除,作為java初學(xué)者的我整理出不調(diào)用任何特殊庫(kù)的基礎(chǔ)方法,這種思想在其他語(yǔ)言也適用,有需要的朋友可以借鑒參考下2021-09-09
基于springBoot配置文件properties和yml中數(shù)組的寫法
這篇文章主要介紹了springBoot配置文件properties和yml中數(shù)組的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
java解決動(dòng)態(tài)配置字段需求問(wèn)題
這篇文章主要介紹了java解決動(dòng)態(tài)配置字段需求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
SpringBoot項(xiàng)目整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)詳解(MYSQL轉(zhuǎn)換達(dá)夢(mèng)數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了MYSQL轉(zhuǎn)換達(dá)夢(mèng)數(shù)據(jù)庫(kù)以及SpringBoot項(xiàng)目整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的相關(guān)教程,文中的示例代碼講解詳細(xì),需要的可以參考下2025-03-03

