事務分類與特性
事務可從多種層面進行分類,數據庫角度、java角度、編程角度:
數據庫角度
根據數據源的數量分為本地事務和全局事務
本地事務:普通事務,獨立的一個數據庫,保證在該數據庫上操作的ACID。
分布式事務:涉及兩個或多個數據庫源的事務,即跨越多臺同類或異類數據庫的事務(由每臺數據庫的本地事務組成的),分布式事務旨在保證這些本地事務的所有操作的ACID,使事務可以跨越多臺數據庫;
java角度
根據規範分為JDBC事務和JTA事務
JDBC事務:普通事務,即數據庫事務中的本地事務,通過connection對象控制管理。
JTA事務:JTA指Java事務API(Java Transaction API),是Java EE數據庫事務規範
編程角度按
根據是否通過編程分為聲明式事務和編程式事務
聲明式事務:通過XML配置或者註解實現,更為簡單
編程式事務:通過編程代碼在業務邏輯時需要時自行實現,粒度更小。
----------------------------------------------------------------------------------
接下來從Spring層面上,讓我們總結一下事務的隔離級別和傳播行為。
隔離級別
有5大隔離級別,這是在TransactionDefinition接口中定義的。
1、ISOLATION_DEFAULT:
用底層數據庫的默認隔離級別,即數據庫管理員設置成什麽就是什麽;
2、ISOLATION_READ_UNCOMMITTED(未提交可讀):
最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀)
3、ISOLATION_READ_COMMITTED(提交可讀):
一個事務提交後才能被其他事務讀取到(會造成幻讀、不可重復讀)、sql server的默認級別
4、ISOLATION_REPEATABLE_READ(可重復讀):
可重復讀,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(該隔離基本可防止臟讀,不可重復讀(重點在修改),但會出現幻讀(重點在增加與刪除))(MySql默認級別,更改可通過set
transaction isolation level 級別)
5、ISOLATION_SERIALIZABLE(序列化):
代價最高最可靠的隔離級別(該隔離級別能防止臟讀、不可重復讀、幻讀)
默認為isolation_default(底層數據庫默認級別),其他四個隔離級別跟數據庫隔離級別一致。
備註:
幻讀:同樣的事務操作過程中,不同時間段多次(不同事務)讀取同一數據,讀取到的內容不一致(一般是行數變多或變少)。
不可重復讀:同一事務中,多次讀取內容不一致(一般行數不變,而內容變了)。
丟失更新:兩個事務同時更新一行數據,最後一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的數據丟失,這是由於沒有加鎖造成的;
臟讀:一個事務讀取到另外一個未提及事務的內容,即為臟讀。
傳播行為
可見:https://www.cnblogs.com/yanze/p/10249708.html
事務分類與特性