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

我們提供的服務有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、都安ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的都安網(wǎng)站制作公司
-
原子性:事務應該當作一個單獨單元的操作,這意味著整個序列操作要么是成功,要么是失敗的。
-
一致性:這表示數(shù)據(jù)庫的引用完整性的一致性,表中唯一的主鍵等。
-
隔離性:可能同時處理很多有相同的數(shù)據(jù)集的事務,每個事務應該與其他事務隔離,以防止數(shù)據(jù)損壞。
- 持久性:一個事務一旦完成全部操作后,這個事務的結(jié)果必須是永久性的,不能因系統(tǒng)故障而從數(shù)據(jù)庫中刪除。
一個真正的 RDBMS 數(shù)據(jù)庫系統(tǒng)將為每個事務保證所有的四個屬性。使用 SQL 發(fā)布到數(shù)據(jù)庫中的事務的簡單視圖如下:
-
使用 begin transaction 命令開始事務。
-
使用 SQL 查詢語句執(zhí)行各種刪除、更新或插入操作。
- 如果所有的操作都成功,則執(zhí)行提交操作,否則回滾所有操作。
Spring 框架在不同的底層事務管理 APIs 的頂部提供了一個抽象層。Spring 的事務支持旨在通過添加事務能力到 POJOs 來提供給 EJB 事務一個選擇方案。Spring 支持編程式和聲明式事務管理。EJBs 需要一個應用程序服務器,但 Spring 事務管理可以在不需要應用程序服務器的情況下實現(xiàn)。
局部事務 vs. 全局事務
局部事務是特定于一個單一的事務資源,如一個 JDBC 連接,而全局事務可以跨多個事務資源事務,如在一個分布式系統(tǒng)中的事務。
局部事務管理在一個集中的計算環(huán)境中是有用的,該計算環(huán)境中應用程序組件和資源位于一個單位點,而事務管理只涉及到一個運行在一個單一機器中的本地數(shù)據(jù)管理器。局部事務更容易實現(xiàn)。
全局事務管理需要在分布式計算環(huán)境中,所有的資源都分布在多個系統(tǒng)中。在這種情況下事務管理需要同時在局部和全局范圍內(nèi)進行。分布式或全局事務跨多個系統(tǒng)執(zhí)行,它的執(zhí)行需要全局事務管理系統(tǒng)和所有相關(guān)系統(tǒng)的局部數(shù)據(jù)管理人員之間的協(xié)調(diào)。
編程式 vs. 聲明式
Spring 支持兩種類型的事務管理:
-
編程式事務管理 :這意味著你在編程的幫助下有管理事務。這給了你極大的靈活性,但卻很難維護。
- 聲明式事務管理 :這意味著你從業(yè)務代碼中分離事務管理。你僅僅使用注釋或 XML 配置來管理事務。
聲明式事務管理比編程式事務管理更可取,盡管它不如編程式事務管理靈活,但它允許你通過代碼控制事務。但作為一種橫切關(guān)注點,聲明式事務管理可以使用 AOP 方法進行模塊化。Spring 支持使用 Spring AOP 框架的聲明式事務管理。
Spring 事務抽象
Spring事務管理的五大屬性:隔離級別、傳播行為、是否只讀、事務超時、回滾規(guī)則
Spring 事務抽象的關(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;
}
| 序號 | 方法 & 描述 |
|---|---|
| 1 | TransactionStatus getTransaction(TransactionDefinition definition) 根據(jù)指定的傳播行為,該方法返回當前活動事務或創(chuàng)建一個新的事務。 |
| 2 | void commit(TransactionStatus status) 該方法提交給定的事務和關(guān)于它的狀態(tài)。 |
| 3 | void rollback(TransactionStatus status) 該方法執(zhí)行一個給定事務的回滾。 |
TransactionDefinition 是在 Spring 中事務支持的核心接口,它的定義如下:
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
| 序號 | 方法 & 描述 |
|---|---|
| 1 | int getPropagationBehavior() 該方法返回傳播行為。Spring 提供了與 EJB CMT 類似的所有的事務傳播選項。 |
| 2 | int getIsolationLevel() 該方法返回該事務獨立于其他事務的工作的程度。 |
| 3 | String getName() 該方法返回該事務的名稱。 |
| 4 | int getTimeout() 該方法返回以秒為單位的時間間隔,事務必須在該時間間隔內(nèi)完成。 |
| 5 | boolean isReadOnly() 該方法返回該事務是否是只讀的。 |
下面是隔離級別的可能值:
| 序號 | 隔離 & 描述 |
|---|---|
| 1 | TransactionDefinition.ISOLATION_DEFAULT 這是默認的隔離級別。 |
| 2 | TransactionDefinition.ISOLATION_READ_COMMITTED 表明能夠阻止誤讀;可以發(fā)生不可重復讀和虛讀。 |
| 3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED 表明可以發(fā)生誤讀、不可重復讀和虛讀。 |
| 4 | TransactionDefinition.ISOLATION_REPEATABLE_READ 表明能夠阻止誤讀和不可重復讀;可以發(fā)生虛讀。 |
| 5 | TransactionDefinition.ISOLATION_SERIALIZABLE 表明能夠阻止誤讀、不可重復讀和虛讀。 |
下面是傳播類型的可能值:
| 序號 | 傳播 & 描述 |
|---|---|
| 1 | TransactionDefinition.PROPAGATION_MANDATORY 支持當前事務;如果不存在當前事務,則拋出一個異常。 |
| 2 | TransactionDefinition.PROPAGATION_NESTED 如果存在當前事務,則在一個嵌套的事務中執(zhí)行。 |
| 3 | TransactionDefinition.PROPAGATION_NEVER 不支持當前事務;如果存在當前事務,則拋出一個異常。 |
| 4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED 不支持當前事務;而總是執(zhí)行非事務性。 |
| 5 | TransactionDefinition.PROPAGATION_REQUIRED 支持當前事務;如果不存在事務,則創(chuàng)建一個新的事務。 |
| 6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW 創(chuàng)建一個新事務,如果存在一個事務,則把當前事務掛起。 |
| 7 | TransactionDefinition.PROPAGATION_SUPPORTS 支持當前事務;如果不存在,則執(zhí)行非事務性。 |
| 8 | TransactionDefinition.TIMEOUT_DEFAULT 使用默認超時的底層事務系統(tǒng),或者如果不支持超時則沒有。 |
TransactionStatus 接口為事務代碼提供了一個簡單的方法來控制事務的執(zhí)行和查詢事務狀態(tài)。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
| 序號 | 方法 & 描述 |
|---|---|
| 1 | boolean hasSavepoint() 該方法返回該事務內(nèi)部是否有一個保存點,也就是說,基于一個保存點已經(jīng)創(chuàng)建了嵌套事務。 |
| 2 | boolean isCompleted() 該方法返回該事務是否完成,也就是說,它是否已經(jīng)提交或回滾。 |
| 3 | boolean isNewTransaction() 在當前事務時新的情況下,該方法返回 true。 |
| 4 | boolean isRollbackOnly() 該方法返回該事務是否已標記為 rollback-only。 |
| 5 | void setRollbackOnly() 該方法設(shè)置該事務為 rollback-only 標記。 |
當前名稱:創(chuàng)新互聯(lián)Spring教程:Spring事務管理
文章地址:http://www.5511xx.com/article/ccicgep.html


咨詢
建站咨詢
