Spring事務(wù)框架之TransactionDefinition源碼解析
Spring事務(wù)的底層原理
- Spring事務(wù)的框架。
- Spring事務(wù)引入機(jī)制,主要學(xué)習(xí)@EnableTransactionManagement的相關(guān)內(nèi)容。
- Spring事務(wù)的控制機(jī)制,主要學(xué)習(xí)@Trasactional相關(guān)內(nèi)容。
先從Spring事務(wù)的框架開(kāi)始。
Spring事務(wù)框架中最重要的內(nèi)容主要包括:
- 事務(wù)管理器TransactionManager。
- 事務(wù)定義TransactionDefinition。
- 事務(wù)狀態(tài)TransactionStatus。
其中事務(wù)管理器是核心,研究事務(wù)管理器需要用到TransactionDefinition和TransactionStatus,所以我們先研究這兩部分。
TransactionDefinition
顧名思義,TransactionDefinition是用來(lái)定義事務(wù)屬性的。
有兩個(gè)比較重要的實(shí)現(xiàn)類,一個(gè)是DefaultTransactionAttribute.
另一個(gè)是DefaultTransactionTemplate:
下來(lái)看一下TransactionDefinition中定義的幾個(gè)事務(wù)屬性:
事務(wù)傳播機(jī)制,7個(gè)事務(wù)傳播機(jī)制的具體含義,我們?cè)谄渌恼轮幸呀?jīng)分析過(guò)了:
int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6;
隔離級(jí)別
數(shù)據(jù)庫(kù)隔離級(jí)別:
//數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別 int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8;
默認(rèn)超時(shí)
int TIMEOUT_DEFAULT = -1;
然后,有一個(gè)獲取默認(rèn)事務(wù)定義的方法(用意待考):
static TransactionDefinition withDefaults() { return StaticTransactionDefinition.INSTANCE; }
DefaultTransactionAttribute
其中比較重要的一個(gè)方式是rollbackOn:
public boolean rollbackOn(Throwable ex) { return (ex instanceof RuntimeException || ex instanceof Error); }
我們先來(lái)看看JavaDoc:
The default behavior is as with EJB: rollback on unchecked exception (RuntimeException), assuming an unexpected outcome outside of any business rules. Additionally, we also attempt to rollback on Error which is clearly an unexpected outcome as well. By contrast, a checked exception is considered a business exception and therefore a regular expected outcome of the transactional business method, i.e. a kind of alternative return value which still allows for regular completion of resource operations.
This is largely consistent with TransactionTemplate's default behavior, except that TransactionTemplate also rolls back on undeclared checked exceptions (a corner case). For declarative transactions, we expect checked exceptions to be intentionally declared as business exceptions, leading to a commit by default.
默認(rèn)行為與EJB相同:發(fā)生運(yùn)行時(shí)異?;虬l(fā)生Error時(shí)回滾。而對(duì)于check exception一般會(huì)被認(rèn)為是一個(gè)業(yè)務(wù)可以認(rèn)可或期望的結(jié)果,因此是允許交易完成的。這個(gè)默認(rèn)行為與TransactionTemplate的默認(rèn)行為是保持一致的。
大概的意思是說(shuō):默認(rèn)情況下發(fā)生運(yùn)行時(shí)異?;駿rror的時(shí)候事務(wù)回滾。而這個(gè)默認(rèn)行為就是通過(guò)這個(gè)rollbackOn方法來(lái)保證的:
public boolean rollbackOn(Throwable ex) { return (ex instanceof RuntimeException || ex instanceof Error); }
Spring事務(wù)控制中的事務(wù)定義的最終落地實(shí)現(xiàn)就是這個(gè)TransactionAttribute,不過(guò)他是通過(guò)TransactionAttributeSource持有的,后續(xù)分析Spring事務(wù)啟用機(jī)制@EnalbeTransactionManagment的時(shí)候會(huì)看到。
TransactionDefinition的研究就到這里,下一篇文章研究TransactionStatus。
以上就是Spring事務(wù)框架之TransactionDefinition源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Spring事務(wù)TransactionDefinition的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis基礎(chǔ)概念與高級(jí)應(yīng)用小結(jié)
這篇文章主要介紹了Mybatis基礎(chǔ)回顧與高級(jí)應(yīng)用,本文內(nèi)容有點(diǎn)小長(zhǎng),希望大家耐心閱讀,此文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06一小時(shí)迅速入門(mén)Mybatis之增刪查改篇
這篇文章主要介紹了迅速入門(mén)Mybatis之增刪查改篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09SpringBoot打印啟動(dòng)時(shí)異常堆棧信息詳解
在本篇文章里小編給大家整理的是關(guān)于SpringBoot打印啟動(dòng)時(shí)異常堆棧信息,有需要的朋友們可以學(xué)習(xí)下。2019-11-11IDEA報(bào)java:?java.lang.OutOfMemoryError:?Java?heap?space錯(cuò)誤
這篇文章主要給大家介紹了關(guān)于IDEA報(bào)java:?java.lang.OutOfMemoryError:?Java?heap?space錯(cuò)誤的解決辦法,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01SpringBoot使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用的示例
這篇文章主要介紹了SpringBoot使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Java注解機(jī)制之Spring自動(dòng)裝配實(shí)現(xiàn)原理詳解
這篇文章主要為大家詳細(xì)介紹了Java注解機(jī)制之Spring自動(dòng)裝配實(shí)現(xiàn)原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10