1.事務的兩種方式
spring 並不直接支援事務,只有當資料庫支援事務時,spring 才支援事務,spring 只不過簡化了開發人員實現事務的步驟。 spring 提供了兩種方式實現事務:①宣告式 ②程式設計式
2.宣告式事務和程式設計式事務
宣告式事務:由spring自動控制,事務在業務邏輯方法執行前開始,在業務邏輯方法正常結束後提交,在業務邏輯方法丟擲異常時回滾
程式設計式事務:需要編寫**控制事務在**開始,**提交,**回滾。
3.事務的性質
**原子性:**確保動作要麼全部完成要麼完全不起作用
**隔離性:**資料和資源就處於一種滿足業務規則的一致性狀態中
**一致性:**使用者的操作不能混淆
**永續性:**一旦事務完成, 無論發生什麼系統錯誤, 它的結果都不應該受到影響
4.事務的傳播行為
**propagation_required:**如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。
**propagation_requires_new:**建立乙個新的事務,如果當前存在事務,則把當前事務掛起。
**propagation_supports:**如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
**propagation_not_supported:**以非事務方式執行,如果當前存在事務,則把當前事務掛起。
**propagation_never:**以非事務方式執行,如果當前存在事務,則丟擲異常。
**propagation_mandatory:**如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
**propagation_nested:**如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於transactiondefinition.propagation_required。
5.併發事務所導致的問題
當同乙個應用程式或者不同應用程式中的多個事務在同乙個資料集上併發執行時, 可能會出現許多意外的問題。併發事務所導致的問題可以分為下面三種型別:
1)髒讀:對於兩個事物 t1, t2, t1 讀取了已經被 t2 更新但 還沒有被提交的字段. 之後, 若 t2 回滾, t1讀取的內容就是臨時且無效的.
**2)不可重複讀:**對於兩個事物 t1, t2, t1 讀取了乙個字段, 然後 t2 更新了該字段. 之後, t1再次讀取同乙個字段, 值就不同了.
**3)幻讀:**對於兩個事物 t1, t2, t1 從乙個表中讀取了乙個字段, 然後 t2 在該表中插入了一些新的行. 之後, 如果 t1 再次讀取同乙個表, 就會多出幾行.
6.事務的隔離級別
事務的隔離級別要得到底層資料庫引擎的支援, 而不是應用程式或者框架的支援。事務的隔離級別有以下幾種:
isolation_default:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是isolation_read_committed。
**isolation_read_uncommitted:**該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。
**isolation_read_committed:**該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。
**isolation_repeatable_read:**該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。
**isolation_serializable:**所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
注:oracle 支援的 2 種事務隔離級別:read_commited , serializable,mysql 支援 4 種事務隔離級別.
7.事務的其他屬性
**事務超時:**所謂事務超時,就是指乙個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 transactiondefinition 中以 int 的值來表示超時時間,其單位是秒。
**事務的唯讀屬性:**事務的唯讀屬性是指,對事務性資源進行唯讀操作或者是讀寫操作。所謂事務性資源就是指那些被事務管理的資源,比如資料來源、 jms 資源,以及自定義的事務性資源等等。如果確定只對事務性資源進行唯讀操作,那麼我們可以將事務標誌為唯讀的,以提高事務處理的效能。在 transactiondefinition 中以 boolean 型別來表示該事務是否唯讀。
**事務的回滾規則:**通常情況下,如果在事務中丟擲了未檢查異常(繼承自 runtimeexception 的異常),則預設將回滾事務。如果沒有丟擲任何異常,或者丟擲了已檢查異常,則仍然提交事務。這通常也是大多數開發者希望的處理方式,也是 ejb 中的預設處理方式。但是,我們可以根據需要人為控制事務在丟擲某些未檢查異常時任然提交事務,或者在丟擲某些已檢查異常時回滾事務。
以學生刷卡消費為例,目錄結構如下
program:
-stucard
-stucarddao
-stucarddaoimpl
-stucardservice
-stucardserviceimpl
exception:
-noenoughmoneyexception
1.stucard**如下
//引入lombok後@data註解會自動生成get set方法
@data
public
class
stucard
2.stucarddao**如下
public
inte***ce
stucarddao
3.stucardservice**如下
public
inte***ce
stucardservice
4.noenoughmoneyexception**如下
public
class
noenoughmoneyexception
extends
runtimeexception
public
noenoughmoneyexception
(string message, throwable cause,
boolean enablesuppression,
boolean writablestacktrace)
public
noenoughmoneyexception
(string message, throwable cause)
public
noenoughmoneyexception
(string message)
public
noenoughmoneyexception
(throwable cause)
}
5.stucarddaoimpl**如下
public
class
stucarddaoimpl
implements
stucarddao
/** * 更新學生卡資訊
*/public
void
updatestucardbycardno
(stucard sc)
/** * @return the jt
*/public jdbctemplate getjt()
/** * @param jt the jt to set
*/public
void
setjt
(jdbctemplate jt)
}
6.stucardserviceimpl**如下
public
class
stucardserviceimpl
implements
stucardservice
scdao.
updatestucardbycardno
(targetcard)
; system.out.
println
("支付完成!商品購買成功");
}public stucarddao getscdao()
public
void
setscdao
(stucarddao scdao)
}
總結:執行邏輯如下
方法執行時,首先呼叫stuserviceimpl物件中的方法transfermoney(),然後建立兩個stucard物件,乙個代表支付卡,乙個代表收款卡。首先將支付卡的money屬性值減去付款金額,將收款卡的money加上付款金額。然後驗證付款卡的金額是否足夠支付。若足夠則將兩張卡的資訊傳入資料庫,若不足則丟擲異常,事務回滾。
Spring開發基礎之Spring事務管理
spring提供的事務管理 spring提供的事務管理可以分為兩類 程式設計式的和宣告式的。程式設計式的,比較靈活,但是 量大,存在重複的 比較多 宣告式的比程式設計式的更靈活。傳統使用jdbc的事務管理 以往使用jdbc進行資料操作,使用datasource,從資料來源中得到connection,...
Spring 事務 事務控制
0 註解 autowire 自動注入 url url b 1 spring專案中事務手動回滾 b transactionaspectsupport.currenttransactionstatus setrollbackonly 或者丟擲異常 transactional rollbackfor pu...
Spring事務(一) Spring事務的使用
事務的經典舉例 某人要在商店使用電子貨幣購買100元的東西,當中至少包括兩個操作 該人賬戶減少100元 商店賬戶增加100元 事務就是要確保以上兩個操作 都能完成 或者 一起取消,否則就會出現100元平白消失或出現的情況。摘自wiki spring事務有兩種方式 程式設計式事務管理 宣告式事務管理 ...