事務(wù)
事務(wù)特性
事務(wù)(Transaction)是由一系列對系統(tǒng)中數(shù)據(jù)進行訪問與更新的操作所組成的一個程序 執(zhí)行邏輯單元(Unit)津滞。事務(wù)具有四個特征,分別是原子性(Atomicity )、一致性(Consistency )、隔離性(Isolation) 和持久性(Durability),簡稱為事務(wù)的ACID特性。
- 原子性(Atomicity):原子性是指事務(wù)是一個不可分割的工作單位驱负,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生患雇。
- 一致性(Consistency):事務(wù)執(zhí)行前后數(shù)據(jù)的完整性必須保持一致跃脊。比如在轉(zhuǎn)賬事務(wù)操作中,事務(wù)執(zhí)行前后金額的總數(shù)應(yīng)保持不變庆亡。
- 隔離性(Isolation):事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時匾乓,數(shù)據(jù)庫為每一個用戶開啟的事務(wù)捞稿,不能被其他事務(wù)的操作數(shù)據(jù)所干擾又谋,多個并發(fā)事務(wù)之間要相互隔離。
- 持久性(Durability):持久性是指一個事務(wù)一旦被提交娱局,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的彰亥,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。
事務(wù)并發(fā)執(zhí)行帶來的問題
1.丟失修改(丟失更新):兩個事務(wù)T1和T2讀入同一數(shù)據(jù)并修改衰齐,T2的提交結(jié)果破壞了T1提交的結(jié)果任斋,導致T1的修改被丟失。
2.不可重復讀:事務(wù)T1讀取某一數(shù)據(jù)后耻涛,事務(wù)T2對其做了修改废酷,當事務(wù)T1再次讀該數(shù)據(jù)時瘟檩,得到與前一次不同的值。
3.幻讀:事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后澈蟆,事務(wù)T2刪除了其中部分記錄墨辛,當T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄消失了趴俘;或者說事務(wù)T2插入了部分新記錄睹簇,當T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多出來了部分數(shù)據(jù)寥闪。
注意:幻讀和不可重復讀的主要區(qū)別在于:
幻讀針對的是查詢結(jié)果為多個的場景太惠,出現(xiàn)了數(shù)據(jù)的增加 or 減少
不可重復度讀對的是某些特定的記錄,這些記錄的數(shù)據(jù)與之前不一致4.讀“臟”數(shù)據(jù):事務(wù)T1修改某一數(shù)據(jù)后疲憋,事務(wù)T2讀取同一數(shù)據(jù)凿渊,然后T1由于某種原因操作被撤銷(回滾),這時T1已修改過的數(shù)據(jù)恢復原值缚柳,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的真實數(shù)據(jù)不一致嗽元,這時T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)喂击。
隔離級別
在標準SQL規(guī)范中剂癌,定義了4個事務(wù)隔離級別,不同的隔離級別對事務(wù)的處理不同翰绊,分別是:未授權(quán)讀取佩谷,授權(quán)讀取,可重復讀取和串行化
傳播性
springBoot中的事務(wù)
SpringBoot中的事務(wù)控制
- Spring提供了一個@EnableTransactionManagement注解在配置類上來開啟聲明式事務(wù)的支持(開啟注解支持)监嗜。使用了@EnableTransactionManagement后谐檀,Spring容器會自動掃描注解@Transactional的方法和類。SpringBoot默認已開啟裁奇,可不用顯式注解桐猬。
- 要使用事務(wù),我們只需要在需要事務(wù)的類或方法上使用@Transactional 注解即可刽肠,當注解在類上的時候意味著此類的所有public方法都是開啟事務(wù)的溃肪。被注解的方法都成為一個事務(wù)整體,同一個事務(wù)內(nèi)共享一個數(shù)據(jù)庫連接音五,所有操作同時發(fā)生惫撰。如果在事務(wù)內(nèi)部執(zhí)行過程中發(fā)生了異常,則事務(wù)整體會自動進行回滾躺涝。
SpringBoot中的事務(wù)_阿阿阿安的博客-CSDN博客_springboot事務(wù)
spring中的事務(wù)
Spring事務(wù)傳播屬性(Propagation厨钻,7種傳播行為):
- REQUIRED(默認屬性)
如果存在一個事務(wù),則支持當前事務(wù)。如果沒有事務(wù)則開啟一個新的事務(wù)夯膀。
被設(shè)置成這個級別時诗充,會為每一個被調(diào)用的方法創(chuàng)建一個邏輯事務(wù)域。如果前面的方法已經(jīng)創(chuàng)建了事務(wù)诱建,那么后面的方法支持當前的事務(wù)其障,如果當前沒有事務(wù)會重新建立事務(wù)。
- REQUIRED(默認屬性)
- MANDATORY
支持當前事務(wù)涂佃,如果當前沒有事務(wù)励翼,就拋出異常。
- MANDATORY
- NEVER
以非事務(wù)方式執(zhí)行辜荠,如果當前存在事務(wù)汽抚,則拋出異常。
- NEVER
- NOT_SUPPORTED
以非事務(wù)方式執(zhí)行操作伯病,如果當前存在事務(wù)造烁,就把當前事務(wù)掛起。
- NOT_SUPPORTED
- REQUIRES_NEW
新建事務(wù)午笛,如果當前存在事務(wù)惭蟋,把當前事務(wù)掛起。
- REQUIRES_NEW
- SUPPORTS
支持當前事務(wù)药磺,如果當前沒有事務(wù)告组,就以非事務(wù)方式執(zhí)行。
- SUPPORTS
- NESTED
支持當前事務(wù)癌佩,新增Savepoint點木缝,與當前事務(wù)同步提交或回滾。
嵌套事務(wù)一個非常重要的概念就是內(nèi)層事務(wù)依賴于外層事務(wù)围辙。外層事務(wù)失敗時我碟,會回滾內(nèi)層事務(wù)所做的動作。而內(nèi)層事務(wù)操作失敗并不會引起外層事務(wù)的回滾姚建。
- NESTED
2.隔離級別:(5種隔離級別)Spring對數(shù)據(jù)庫來說隔離級別只有4種矫俺,不包括默認級別
- DEFAULT (默認)
這是一個PlatfromTransactionManager默認的隔離級別,使用數(shù)據(jù)庫默認的事務(wù)隔離級別掸冤。另外四個與JDBC的隔離級別相對應(yīng)厘托。
- DEFAULT (默認)
- READ_UNCOMMITTED (讀未提交)
這是事務(wù)最低的隔離級別,它允許另外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)贩虾。這種隔離級別會產(chǎn)生臟讀催烘,不可重復讀和幻像讀。
- READ_UNCOMMITTED (讀未提交)
- READ_COMMITTED (讀已提交)
保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取缎罢,另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級別可以避免臟讀出現(xiàn),但是可能會出現(xiàn)不可重復讀和幻像讀策精。
- READ_COMMITTED (讀已提交)
- REPEATABLE_READ (可重復讀)
這種事務(wù)隔離級別可以防止臟讀舰始、不可重復讀,但是可能出現(xiàn)幻像讀咽袜。它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外丸卷,還保證了不可重復讀
- REPEATABLE_READ (可重復讀)
- SERIALIZABLE(串行化)
這是花費最高代價但是最可靠的事務(wù)隔離級別,事務(wù)被處理為順序執(zhí)行询刹。除了防止臟讀谜嫉、不可重復讀外,還避免了幻像讀凹联。
- SERIALIZABLE(串行化)
spring的事務(wù)與數(shù)據(jù)庫的事務(wù)是否一樣沐兰?
本質(zhì)上其實是同一個概念,spring的事務(wù)是對數(shù)據(jù)庫的事務(wù)的封裝,最后本質(zhì)的實現(xiàn)還是在數(shù)據(jù)庫,假如數(shù)據(jù)庫不支持事務(wù)的話,spring的事務(wù)是沒有作用的.數(shù)據(jù)庫的事務(wù)說簡單就只有開啟,回滾和關(guān)閉,spring對數(shù)據(jù)庫事務(wù)的包裝,原理就是拿一個數(shù)據(jù)連接,根據(jù)spring的事務(wù)配置,操作這個數(shù)據(jù)連接對數(shù)據(jù)庫進行事務(wù)開啟,回滾或關(guān)閉操作.但是spring除了實現(xiàn)這些,還配合spring的傳播行為對事務(wù)進行了更廣泛的管理.其實這里還有個重要的點,那就是事務(wù)中涉及的隔離級別,以及spring如何對數(shù)據(jù)庫的隔離級別進行封裝.事務(wù)與隔離級別放在一起理解會更好些