事務(wù)相關(guān)知識點

點擊上方「藍字」關(guān)注我們

0x01:事務(wù)的基本要素(ACID)
原子性(Atomicity):事務(wù)開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環(huán)節(jié)。事務(wù)執(zhí)行過程中出錯,會回滾到事務(wù)開始前的狀態(tài),所有的操作就像沒有發(fā)生一樣。也就是說事務(wù)是一個不可分割的整體,就像化學(xué)中學(xué)過的原子,是物質(zhì)構(gòu)成的基本單位;
一致性(Consistency):事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞 。比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到;
隔離性(Isolation):同一時間,只允許一個事務(wù)請求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬;
持久性(Durability):事務(wù)完成后,事務(wù)對數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回滾;
0x02:事務(wù)的并發(fā)問題
臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù);
不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果 不一致;
幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級,但是系統(tǒng)管理員B就在這個時候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀;
不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
MySQL事務(wù)隔離級別
| 事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
| 讀未提交(read-uncommitted) | 是 | 是 | 是 |
| 不可重復(fù)讀(read-committed) | 否 | 是 | 是 |
| 可重復(fù)讀(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
MySQL默認(rèn)的事務(wù)隔離級別為repeatable-read;Oracle默認(rèn)系統(tǒng)事務(wù)隔離級別是read-committed。
0x03:Spring五個不同的事務(wù)隔離級別
TransactionDefinition接口中定義了五個不同的事務(wù)隔離級別,其含義如下:
ISOLATION_DEFAULT:這是一個PlatfromTransactionManager默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別.另外四個與JDBC的隔離級別相對應(yīng);
ISOLATION_READ_UNCOMMITTED:這是事務(wù)最低的隔離級別,它充許別外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)。這種隔離級別會產(chǎn)生臟讀,不可重復(fù)讀和幻像讀;
ISOLATION_READ_COMMITTED:保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級別可以避免臟讀出現(xiàn),但是可能會出現(xiàn)不可重復(fù)讀和幻像讀;
ISOLATION_REPEATABLE_READ:這種事務(wù)隔離級別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀);
ISOLATION_SERIALIZABLE:這是花費最高代價但是最可靠的事務(wù)隔離級別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀;
0x04:Spring七個事務(wù)傳播行為
TransactionDefinition接口中定義了七個事務(wù)傳播行為;其含義如下:PROPAGATION_REQUIRED:如果存在一個事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟一個新的事務(wù);
PROPAGATION_SUPPORTS:如果存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。但是對于事務(wù)同步的事務(wù)管理器,PROPAGATION_SUPPORTS與不使用事務(wù)有少許不同;
PROPAGATION_MANDATORY:如果已經(jīng)存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有一個活動的事務(wù),則拋出異常;
PROPAGATION_REQUIRES_NEW:總是開啟一個新的事務(wù)。如果一個事務(wù)已經(jīng)存在,則將這個存在的事務(wù)掛起;
PROPAGATION_NOT_SUPPORTED:總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù);
PROPAGATION_NEVER:總是非事務(wù)地執(zhí)行,如果存在一個活動事務(wù),則拋出異常;
PROPAGATION_NESTED:如果一個活動的事務(wù)存在,則運行在一個嵌套的事務(wù)中. 如果沒有活動事務(wù), 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行;
0x05:分布式事務(wù)CAP理論

一致性(Consistency):一致性指的是數(shù)據(jù)的強一致性。每次的讀操作都是讀取的最新數(shù)據(jù)。即如果寫入某個數(shù)據(jù)成功的話,之后的讀取都應(yīng)該讀的是新寫入的數(shù)據(jù);如果寫入失敗的話,之后讀取的都不應(yīng)該是寫入失敗的數(shù)據(jù)。
可用性(Availability):可用性指的是服務(wù)的可用性。即每個請求都能在合理的時間內(nèi)獲得符合預(yù)期的響應(yīng)結(jié)果。
分區(qū)容錯性(Partition Tolerance):分區(qū)容錯性指的是當(dāng)節(jié)點之間的網(wǎng)絡(luò)出現(xiàn)問題之后,系統(tǒng)仍然能夠正常提供服務(wù)。
在分布式的系統(tǒng)中,P是基本要求,而單體應(yīng)用則是CA系統(tǒng)。微服務(wù)系統(tǒng)通常是一個AP系統(tǒng),即同時滿足可用性和分區(qū)容錯性。這樣就有了一個在分布式系統(tǒng)中保證數(shù)據(jù)強一致性的難題,這個難題的一個解決方案就是分布式事務(wù)。
