Spring 事務(wù)管理

2020-10-09 09:28 更新

事務(wù)管理

一個(gè)數(shù)據(jù)庫(kù)事務(wù)是一個(gè)被視為單一的工作單元的操作序列。這些操作應(yīng)該要么完整地執(zhí)行,要么完全不執(zhí)行。事務(wù)管理是一個(gè)重要組成部分,RDBMS 面向企業(yè)應(yīng)用程序,以確保數(shù)據(jù)完整性和一致性。事務(wù)的概念可以描述為具有以下四個(gè)關(guān)鍵屬性說(shuō)成是 ACID

  • 原子性:事務(wù)應(yīng)該當(dāng)作一個(gè)單獨(dú)單元的操作,這意味著整個(gè)序列操作要么是成功,要么是失敗的。

  • 一致性:這表示數(shù)據(jù)庫(kù)的引用完整性的一致性,表中唯一的主鍵等。

  • 隔離性:可能同時(shí)處理很多有相同的數(shù)據(jù)集的事務(wù),每個(gè)事務(wù)應(yīng)該與其他事務(wù)隔離,以防止數(shù)據(jù)損壞。

  • 持久性:一個(gè)事務(wù)一旦完成全部操作后,這個(gè)事務(wù)的結(jié)果必須是永久性的,不能因系統(tǒng)故障而從數(shù)據(jù)庫(kù)中刪除。

一個(gè)真正的 RDBMS 數(shù)據(jù)庫(kù)系統(tǒng)將為每個(gè)事務(wù)保證所有的四個(gè)屬性。使用 SQL 發(fā)布到數(shù)據(jù)庫(kù)中的事務(wù)的簡(jiǎn)單視圖如下:

  • 使用 begin transaction 命令開(kāi)始事務(wù)。

  • 使用 SQL 查詢(xún)語(yǔ)句執(zhí)行各種刪除、更新或插入操作。

  • 如果所有的操作都成功,則執(zhí)行提交操作,否則回滾所有操作。

Spring 框架在不同的底層事務(wù)管理 APIs 的頂部提供了一個(gè)抽象層。Spring 的事務(wù)支持旨在通過(guò)添加事務(wù)能力到 POJOs 來(lái)提供給 EJB 事務(wù)一個(gè)選擇方案。Spring 支持編程式和聲明式事務(wù)管理。EJBs 需要一個(gè)應(yīng)用程序服務(wù)器,但 Spring 事務(wù)管理可以在不需要應(yīng)用程序服務(wù)器的情況下實(shí)現(xiàn)。

局部事務(wù) vs. 全局事務(wù)

局部事務(wù)是特定于一個(gè)單一的事務(wù)資源,如一個(gè) JDBC 連接,而全局事務(wù)可以跨多個(gè)事務(wù)資源事務(wù),如在一個(gè)分布式系統(tǒng)中的事務(wù)。

局部事務(wù)管理在一個(gè)集中的計(jì)算環(huán)境中是有用的,該計(jì)算環(huán)境中應(yīng)用程序組件和資源位于一個(gè)單位點(diǎn),而事務(wù)管理只涉及到一個(gè)運(yùn)行在一個(gè)單一機(jī)器中的本地?cái)?shù)據(jù)管理器。局部事務(wù)更容易實(shí)現(xiàn)。

全局事務(wù)管理需要在分布式計(jì)算環(huán)境中,所有的資源都分布在多個(gè)系統(tǒng)中。在這種情況下事務(wù)管理需要同時(shí)在局部和全局范圍內(nèi)進(jìn)行。分布式或全局事務(wù)跨多個(gè)系統(tǒng)執(zhí)行,它的執(zhí)行需要全局事務(wù)管理系統(tǒng)和所有相關(guān)系統(tǒng)的局部數(shù)據(jù)管理人員之間的協(xié)調(diào)。

編程式 vs. 聲明式

Spring 支持兩種類(lèi)型的事務(wù)管理:

  • 編程式事務(wù)管理 :這意味著你在編程的幫助下有管理事務(wù)。這給了你極大的靈活性,但卻很難維護(hù)。

  • 聲明式事務(wù)管理 :這意味著你從業(yè)務(wù)代碼中分離事務(wù)管理。你僅僅使用注釋或 XML 配置來(lái)管理事務(wù)。

聲明式事務(wù)管理比編程式事務(wù)管理更可取,盡管它不如編程式事務(wù)管理靈活,但它允許你通過(guò)代碼控制事務(wù)。但作為一種橫切關(guān)注點(diǎn),聲明式事務(wù)管理可以使用 AOP 方法進(jìn)行模塊化。Spring 支持使用 Spring AOP 框架的聲明式事務(wù)管理。

Spring 事務(wù)抽象

Spring事務(wù)管理的五大屬性:隔離級(jí)別、傳播行為、是否只讀事務(wù)超時(shí)、回滾規(guī)則

Spring 事務(wù)抽象的關(guān)鍵是由 org.springframework.transaction.PlatformTransactionManager 接口定義,如下所示:


public interface PlatformTransactionManager {
   TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
   void commit(TransactionStatus status) throws TransactionException;
   void rollback(TransactionStatus status) throws TransactionException;
}
序號(hào)方法 & 描述
1

TransactionStatus getTransaction(TransactionDefinition definition)

根據(jù)指定的傳播行為,該方法返回當(dāng)前活動(dòng)事務(wù)或創(chuàng)建一個(gè)新的事務(wù)。

2

void commit(TransactionStatus status)

該方法提交給定的事務(wù)和關(guān)于它的狀態(tài)。

3

void rollback(TransactionStatus status)

該方法執(zhí)行一個(gè)給定事務(wù)的回滾。

TransactionDefinition 是在 Spring 中事務(wù)支持的核心接口,它的定義如下:


public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}
序號(hào)方法 & 描述
1

int getPropagationBehavior()

該方法返回傳播行為。Spring 提供了與 EJB CMT 類(lèi)似的所有的事務(wù)傳播選項(xiàng)。

2

int getIsolationLevel()

該方法返回該事務(wù)獨(dú)立于其他事務(wù)的工作的程度。

3

String getName()

該方法返回該事務(wù)的名稱(chēng)。

4

int getTimeout()

該方法返回以秒為單位的時(shí)間間隔,事務(wù)必須在該時(shí)間間隔內(nèi)完成。

5

boolean isReadOnly()

該方法返回該事務(wù)是否是只讀的。

下面是隔離級(jí)別的可能值:

序號(hào)隔離 & 描述
1

TransactionDefinition.ISOLATION_DEFAULT

這是默認(rèn)的隔離級(jí)別。

2

TransactionDefinition.ISOLATION_READ_COMMITTED

表明能夠阻止誤讀;可以發(fā)生不可重復(fù)讀和虛讀。

3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

表明可以發(fā)生誤讀、不可重復(fù)讀和虛讀。

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

表明能夠阻止誤讀和不可重復(fù)讀;可以發(fā)生虛讀。

5

TransactionDefinition.ISOLATION_SERIALIZABLE

表明能夠阻止誤讀、不可重復(fù)讀和虛讀。

下面是傳播類(lèi)型的可能值:

序號(hào)傳播 & 描述
1

TransactionDefinition.PROPAGATION_MANDATORY

支持當(dāng)前事務(wù);如果不存在當(dāng)前事務(wù),則拋出一個(gè)異常。

2

TransactionDefinition.PROPAGATION_NESTED

如果存在當(dāng)前事務(wù),則在一個(gè)嵌套的事務(wù)中執(zhí)行。

3

TransactionDefinition.PROPAGATION_NEVER

不支持當(dāng)前事務(wù);如果存在當(dāng)前事務(wù),則拋出一個(gè)異常。

4

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

不支持當(dāng)前事務(wù);而總是執(zhí)行非事務(wù)性。

5

TransactionDefinition.PROPAGATION_REQUIRED

支持當(dāng)前事務(wù);如果不存在事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。

6

TransactionDefinition.PROPAGATION_REQUIRES_NEW

創(chuàng)建一個(gè)新事務(wù),如果存在一個(gè)事務(wù),則把當(dāng)前事務(wù)掛起。

7

TransactionDefinition.PROPAGATION_SUPPORTS

支持當(dāng)前事務(wù);如果不存在,則執(zhí)行非事務(wù)性。

8

TransactionDefinition.TIMEOUT_DEFAULT

使用默認(rèn)超時(shí)的底層事務(wù)系統(tǒng),或者如果不支持超時(shí)則沒(méi)有。

TransactionStatus 接口為事務(wù)代碼提供了一個(gè)簡(jiǎn)單的方法來(lái)控制事務(wù)的執(zhí)行和查詢(xún)事務(wù)狀態(tài)。


public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}
序號(hào)方法 & 描述
1

boolean hasSavepoint()

該方法返回該事務(wù)內(nèi)部是否有一個(gè)保存點(diǎn),也就是說(shuō),基于一個(gè)保存點(diǎn)已經(jīng)創(chuàng)建了嵌套事務(wù)。

2

boolean isCompleted()

該方法返回該事務(wù)是否完成,也就是說(shuō),它是否已經(jīng)提交或回滾。

3

boolean isNewTransaction()

在當(dāng)前事務(wù)時(shí)新的情況下,該方法返回 true。

4

boolean isRollbackOnly()

該方法返回該事務(wù)是否已標(biāo)記為 rollback-only。

5

void setRollbackOnly()

該方法設(shè)置該事務(wù)為 rollback-only 標(biāo)記。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)