什么是事務(wù)、事務(wù)特性、事務(wù)隔離級別、spring事務(wù)傳播特性

引用地址

  1. 什么是事務(wù)?

    事務(wù)是程序中一系列嚴(yán)密的操作,所有操作必須成功完成,否則每個操作所做的操作將會撤銷,這是事務(wù)的原子性(要么成功,要么失敗),

  2. 事務(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é)果有任何影響。
  3. 事務(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ù)中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容