Spring中的@Transactional的工作原理
1、原理
事務(wù)的概念想必大家都很清楚,其ACID特性在開(kāi)發(fā)過(guò)程中占有重要的地位。同時(shí)在并發(fā)過(guò)程中會(huì)出現(xiàn)一些一致性問(wèn)題,為了解決一致性問(wèn)題,也出現(xiàn)了四種隔離級(jí)別,這里就不再詳述了,感興趣的可以去查一下。下面我們討論一下Spring中的事務(wù)。
Spring中的事務(wù)有兩種:
- 編程式事務(wù)
- 聲明式事務(wù)
通常情況下我們使用聲明式事務(wù),它是基于SpringAOP實(shí)現(xiàn)的?;贏OP實(shí)現(xiàn)的事務(wù)極大得幫助了我們的開(kāi)發(fā)效率,其本質(zhì)是對(duì)方法進(jìn)行前后攔截,在目標(biāo)方法前加入一個(gè)事務(wù),在目標(biāo)完成后再加入一個(gè)事務(wù)進(jìn)行提交或者回滾,這種方式下我們并不需要在目標(biāo)方法中的代碼中摻雜事務(wù)管理代碼,輕松進(jìn)行事務(wù)管理。
而編程式事務(wù)就需要我們修改代碼來(lái)進(jìn)行事務(wù)管理。這種方法看似很麻煩,但是它的存在自有它的道理,上面我們講到的聲明式事務(wù)控制,其控制的細(xì)粒度只能作用到方法上,無(wú)法在代碼塊中實(shí)現(xiàn)聲明式事務(wù)控制。我們都知道,一旦加上事務(wù),程序的運(yùn)行效率就會(huì)降低,所以編程式事務(wù)也有它的用武之地。
但是我們的廣大勞動(dòng)人民也是智慧的。直接將需要事務(wù)的代碼塊獨(dú)立成方法,這樣仍然可以使用聲明式事務(wù)。當(dāng)然在開(kāi)發(fā)中具體情況要具體分析了。
2、用法
事務(wù)的傳播行為:
事務(wù)的隔離級(jí)別:
@Transactional屬性
示例代碼:
@Service @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) public class RoleServiceImpl implements RoleService { @Autowired private RoleDao roleDao; @Transactional(propagation = Propagation.SUPPORTS,readOnly = true) @Override public List<Role> findAllRoles() { return roleDao.selectAllRoles(); } }
3、拓展
1、為什么聲明式事務(wù)只能應(yīng)用于方法上?
- 因?yàn)槁暶魇绞聞?wù)是基于AOP實(shí)現(xiàn)的,AOP是基于動(dòng)態(tài)代理實(shí)現(xiàn)的。
- 動(dòng)態(tài)代理只會(huì)捕捉來(lái)自外部的方法調(diào)用,
- 意思就是類內(nèi)部的方法調(diào)用類內(nèi)部的另外方法,并不會(huì)發(fā)生事務(wù)行為。
到此這篇關(guān)于Spring中的@Transactional的工作原理的文章就介紹到這了,更多相關(guān)Spring @Transactional 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談Spring中@Transactional事務(wù)回滾及示例(附源碼)
- Spring事務(wù)@Transactional注解四種不生效案例場(chǎng)景分析
- springboot編程式事務(wù)TransactionTemplate的使用說(shuō)明
- spring聲明式事務(wù)@Transactional底層工作原理
- spring中12種@Transactional的失效場(chǎng)景(小結(jié))
- Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程
- 基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯(cuò)點(diǎn)、幻讀
- spring聲明式事務(wù) @Transactional 不回滾的多種情況以及解決方案
- Spring Transaction事務(wù)實(shí)現(xiàn)流程源碼解析
相關(guān)文章
Java設(shè)計(jì)模式七大原則之開(kāi)閉原則詳解
開(kāi)閉原則,又稱為OCP原則,即一個(gè)軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。本文將詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的開(kāi)閉原則,需要的可以參考一下2022-02-02Springboot基于enable模塊驅(qū)動(dòng)的實(shí)現(xiàn)
這篇文章主要介紹了Springboot基于enable模塊驅(qū)動(dòng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Spring Boot中使用JDBC Templet的方法教程
這篇文章主要給大家介紹了關(guān)于在Spring Boot中使用JDBC Templet的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03淺談Java讀寫注冊(cè)表的方式Preferences與jRegistry
這篇文章主要介紹了淺談Java讀寫注冊(cè)表的方式Preferences與jRegistry,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02SpringBoot使用SensitiveWord實(shí)現(xiàn)敏感詞過(guò)濾
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用SensitiveWord實(shí)現(xiàn)敏感詞過(guò)濾功能,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01老生常談設(shè)計(jì)模式之動(dòng)態(tài)代理
下面小編就為大家?guī)?lái)一篇老生常談設(shè)計(jì)模式之動(dòng)態(tài)代理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟
這篇文章主要為大家介紹了Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟,感興趣的小伙伴們可以參考一下2016-05-05