(一) 事務簡介
1. 事務管理是企業級應用程序開發中必不可少的技術, 用來確保數據的完整性和一致性。
(通俗的講,就是一手交錢一手交貨。保證數據在開發過程中全部運行正確,主要應用於關聯數據)
2. 事務的四個關鍵屬性(ACID)
- 原子性(atomicity): 事務是一個原子操作, 由一系列動作組成。事務的原子性確保動作要麼全部完成要麼完全不起作用。
- 一致性(consistency): 一旦所有事務動作完成, 事務就被提交。 數據和資源就處於一種滿足業務規則的一致性狀態中。
- 隔離性(isolation): 可能有許多事務會同時處理相同的數據, 因此每個事物都應該與其他事務隔離開來, 防止數據損壞。
- 持久性(durability): 一旦事務完成, 無論發生什麼系統錯誤, 它的結果都不應該受到影響. 通常情況下, 事務的結果被寫到持久化存儲器中。
(二) Spring 中的事務管理
1. Spring 在不同的事務管理 API 之上定義了一個抽象層。
2.編程式事務管理: 將事務管理代碼嵌入到業務方法中來控制事務的提交和回滾。
3.聲明式事務管理: 大多數情況下比編程式事務管理更好用. 它將事務管理代碼從業務方法中分離出來, 以聲明的方式來實現事務管理. 事務管理作爲一種橫切關注點, 可以通過 AOP 方法模塊化. Spring 通過 Spring AOP 框架支持聲明式事務管理。
(三) Spring 中事務的實現
1. 在Xml文件中先配置事務管理器,再打開事務管理器,具體操作
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 啓用事務 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
2. 在類中實現事務的方法前面加上
@Transactional 註解
@Transactional
@Override
public void purchase(String username, String isbn) {
// TODO 自動生成的方法存根
//1. 獲取書的單價
double price = book.selctbookprice(isbn);
//2. 更新數的庫存
book.selctstock(isbn);
//3. 更新用戶餘額
book.selctbanlance(username, price);
}
(四) 事務管理中的其他屬性
1.事務傳播屬性
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Override
public void purchase(String username, String isbn) {
// TODO 自動生成的方法存根
//1. 獲取書的單價
double price = book.selctbookprice(isbn);
//2. 更新數的庫存
book.selctstock(isbn);
//3. 更新用戶餘額
book.selctbanlance(username, price);
}
(當事務方法被另一個事務方法調用時, 必須指定事務應該如何傳播. 例如: 方法可能繼續在現有事務中運行, 也可能開啓一個新事務, 並在自己的事務中運行)常用的爲下圖1 2 中的屬性 1 爲默認屬性
(1) REQUIRED 傳播行爲
(2) REQUIRES_NEW 傳播行爲
2. 隔離事務屬性
@Transactional 的 isolation 屬性中設置隔離級別。
3.回滾事務屬性
@Transactional 註解的 rollbackFor 和 noRollbackFor 屬性來定義。
4.超時事務屬性
@Transactional 註解的 timeout 屬性定義
5. 只讀事務屬性
@Transactional 註解的 readonly 屬性定義