-
什么是事務(wù)?
事務(wù)是程序中一系列嚴(yán)密的操作,所有操作必須成功完成,否則每個操作所做的操作將會撤銷,這是事務(wù)的原子性(要么成功,要么失敗),
-
事務(wù)特性
事務(wù)特性分為四個:原子性(Atomicity),一致性(Consistency),隔離性(Isolation),持續(xù)性(Durability),簡稱ACID.
- 原子性:事務(wù)是數(shù)據(jù)庫邏輯工作單元,事務(wù)中包含的操作要么都執(zhí)行成功,要么都執(zhí)行失敗.
- 一致性:事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài).當(dāng)事務(wù)執(zhí)行成功后就說明數(shù)據(jù)庫處于一致性狀態(tài).如果執(zhí)行過程中發(fā)生錯誤,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫,這是數(shù)據(jù)庫就處于不一致狀態(tài).
- 隔離性:一個事務(wù)的執(zhí)行過程中不能影響到其他事務(wù)的執(zhí)行,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他事務(wù)是隔離的,并發(fā)執(zhí)行各個事務(wù)之間無不干擾。
- 持續(xù)性:即一個事務(wù)執(zhí)一旦提交,它對數(shù)據(jù)庫數(shù)據(jù)的改變是永久性的。之后的其它操作不應(yīng)該對其執(zhí)行結(jié)果有任何影響。
-
事務(wù)的隔離界別
事務(wù)的隔離級別也分為四種,由低到高依次分別為:read uncommited(讀未提交)、read commited(讀提交)、read repeatable(讀重復(fù))、serializable(序列化),這四個級別可以逐個解決臟讀、不可重復(fù)讀、幻讀這幾類問題。
臟讀 不可重復(fù)讀 幻讀 未提交讀 √ √ √ 提交讀 × √ √ 重復(fù)讀 × × √ 序列化 × × × - 未提交讀:最低的事務(wù)隔離界別,它允許另一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)
- 提交讀:保證一個事務(wù)提交后才能被另一個事務(wù)讀取,另一個事務(wù)不能讀取該事物未提交的數(shù)據(jù)
- 重復(fù)讀:這種隔離界別可以防止臟讀,不可重復(fù)讀.但可能出現(xiàn)幻讀,除了保證一個事務(wù)不能被另一個事務(wù)賭球未提交的數(shù)據(jù)之外還避免了不可重復(fù)讀.
- 序列化:這是花費代價最高但最可靠的隔離界別.事務(wù)被處理為順序執(zhí)行.
spring事務(wù)傳播特性:
事務(wù)傳播行為就是多個事務(wù)方法相互調(diào)用時,事務(wù)如何在這些方法間傳播。spring支持7種事務(wù)傳播行為:
- propagation_requierd:如果當(dāng)前沒有事務(wù),就新建一個事務(wù),如果已存在一個事務(wù)中,加入到這個事務(wù)中,這是最常見的選擇。
- propagation_supports:支持當(dāng)前事務(wù),如果沒有當(dāng)前事務(wù),就以非事務(wù)方法執(zhí)行。
- propagation_mandatory:使用當(dāng)前事務(wù),如果沒有當(dāng)前事務(wù),就拋出異常。
- propagation_required_new:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
- propagation_not_supported:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就當(dāng)前事務(wù)掛起。
- propagation_never:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前事務(wù)存在則拋出異常。
- propagation_nested:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行與propagation_required類似的操作
Spring 默認(rèn)的事務(wù)傳播行為是 PROPAGATION_REQUIRED,它適合于絕大多數(shù)的情況。假設(shè) ServiveX#methodX() 都工作在事務(wù)環(huán)境下(即都被 Spring 事務(wù)增強了),假設(shè)程序中存在如下的調(diào)用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那么這 3 個服務(wù)類的 3 個方法通過 Spring 的事務(wù)傳播機制都工作在同一個事務(wù)中。