一、Spring事務(wù)管理方式及其實(shí)現(xiàn)
Spring 提供了多種管理事務(wù)的方式,包括編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。下面分別介紹這兩種方式及其實(shí)現(xiàn)方式:
1. 編程式事務(wù)管理
編程式事務(wù)管理是通過編寫代碼來手動管理事務(wù)。它需要在事務(wù)的開始和結(jié)束時,通過編程方式來控制事務(wù)的提交和回滾。Spring 提供了 PlatformTransactionManager
接口來實(shí)現(xiàn)編程式事務(wù)管理。通過該接口,我們可以手動管理事務(wù)的開始、提交和回滾等操作。
以下是一個簡單的編程式事務(wù)管理的示例代碼:
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
在上述示例中,我們使用 PlatformTransactionManager
接口實(shí)現(xiàn)了編程式事務(wù)管理。在 transferMoney()
方法中,我們手動管理了事務(wù)的開始、提交和回滾等操作。
2. 聲明式事務(wù)管理
Spring 提供了多種聲明式事務(wù)管理的方式,包括基于 XML 配置文件、基于注解和基于 Java 配置類等方式。
Spring 基于注解的聲明式事務(wù)實(shí)現(xiàn),可以通過在方法上添加事務(wù)注解來指定事務(wù)的屬性和行為。Spring 提供了多個事務(wù)注解,包括 @Transactional
、@Rollback
、@Commit
等。其中,@Transactional
注解是最常用的事務(wù)注解,用于標(biāo)識需要進(jìn)行事務(wù)管理的方法。
以下是一個基于注解的聲明式事務(wù)實(shí)現(xiàn)的示例代碼:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
accountDao.update(fromAccount);
accountDao.update(toAccount);
}
基于注解的聲明式事務(wù)實(shí)現(xiàn)可以更加方便地管理事務(wù),避免了手動管理事務(wù)的繁瑣和出錯的可能性。同時,它也提高了代碼的可讀性和可維護(hù)性。
總之,Spring 提供了多種管理事務(wù)的方式,包括編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。編程式事務(wù)管理需要手動管理事務(wù)的開始、提交和回滾等操作,而聲明式事務(wù)管理則是通過在配置文件中聲明事務(wù)規(guī)則,來自動管理事務(wù)。通過選擇適合自己的方式,可以更加方便地實(shí)現(xiàn)事務(wù)管理。
二、@Transactional詳解
@Transactional
是 Spring Framework 中最常用的事務(wù)注解之一,它可以用來標(biāo)識需要進(jìn)行事務(wù)管理的方法或類。@Transactional
注解可以指定事務(wù)的傳播行為、隔離級別、超時時間、只讀屬性、回滾規(guī)則等屬性。以下是對 @Transactional
注解的詳細(xì)解析:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
1. 屬性:事務(wù)傳播行為(Propagation)
Spring 中的事務(wù)傳播行為(Propagation)指的是多個事務(wù)之間的相互影響關(guān)系,即在一個事務(wù)方法調(diào)用另一個事務(wù)方法時,這兩個事務(wù)方法之間的關(guān)系。
Spring Framework 中定義了 7 種事務(wù)傳播行為,分別為:
-
Propagation.REQUIRED
:默認(rèn)值,如果當(dāng)前存在事務(wù),則加入該事務(wù),否則創(chuàng)建一個新事務(wù)。 -
Propagation.SUPPORTS
:如果當(dāng)前存在事務(wù),則加入該事務(wù),否則以非事務(wù)方式執(zhí)行。 -
Propagation.MANDATORY
:如果當(dāng)前存在事務(wù),則加入該事務(wù),否則拋出異常。 -
Propagation.REQUIRES_NEW
:創(chuàng)建一個新事務(wù),并掛起當(dāng)前事務(wù)(如果存在)。 -
Propagation.NOT_SUPPORTED
:以非事務(wù)方式執(zhí)行,并掛起當(dāng)前事務(wù)(如果存在)。 -
Propagation.NEVER
:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。 -
Propagation.NESTED
:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)中執(zhí)行,否則創(chuàng)建一個新事務(wù)。
2. 屬性:事務(wù)隔離級別(Isolation)
事務(wù)隔離級別指的是多個事務(wù)之間的數(shù)據(jù)隔離程度。Spring Framework 中定義了 5 種事務(wù)隔離級別,分別為:
-
Isolation.DEFAULT
:使用數(shù)據(jù)庫的默認(rèn)隔離級別。 -
Isolation.READ_UNCOMMITTED
:最低的隔離級別,允許讀取未提交的數(shù)據(jù)。 -
Isolation.READ_COMMITTED
:允許讀取已提交的數(shù)據(jù)。 -
Isolation.REPEATABLE_READ
:保證在同一事務(wù)中多次讀取同一數(shù)據(jù)時,得到的結(jié)果是一致的。 -
Isolation.SERIALIZABLE
:最高的隔離級別,完全禁止不可重復(fù)讀和幻讀。
3. 屬性:事務(wù)超時時間(timeout)
事務(wù)超時時間指的是事務(wù)執(zhí)行所允許的最大時間。如果事務(wù)執(zhí)行時間超過了指定的超時時間,則事務(wù)會被回滾。超時時間的單位為秒,默認(rèn)值為 -1,表示永不超時。
4. 屬性:只讀屬性(readOnly)
只讀屬性指的是事務(wù)是否只讀。如果將事務(wù)設(shè)置為只讀,那么在事務(wù)執(zhí)行期間,所有對數(shù)據(jù)庫的修改操作都會被禁止。只讀屬性可以提高事務(wù)的并發(fā)性能。
5. 屬性:回滾規(guī)則(rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName)
回滾規(guī)則指的是哪些異常會導(dǎo)致事務(wù)回滾??梢允褂?rollbackFor
、noRollbackFor
、rollbackForClassName
、noRollbackForClassName
等屬性來指定回滾規(guī)則。其中,rollbackFor
和 noRollbackFor
屬性用于指定需要回滾或不需要回滾的異常類型,而 rollbackForClassName
和 noRollbackForClassName
屬性用于指定需要回滾或不需要回滾的異常類名。文章來源:http://www.zghlxwxcb.cn/news/detail-583012.html
以上是 @Transactional
注解的常用屬性和含義。需要注意的是,在使用 @Transactional
注解時,必須要將它所在的類或接口注冊為 Spring Bean,且 @Transactional
注解只對 public 方法生效。文章來源地址http://www.zghlxwxcb.cn/news/detail-583012.html
到了這里,關(guān)于Spring Boot原理分析(四):聲明式事務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!