1 事務(wù)
1.1 事務(wù)的特性
- 原子性:是指事務(wù)包含所有操作要么全部成功,要么全部失敗回滾。
- 一致性:指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換成另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。拿轉(zhuǎn)賬來說,假設(shè)用戶 A 和用戶 B 兩者的錢加起來一共是 5000,那么不管 A 和 B 之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是 5000,這就是事務(wù)的一致性。
- 隔離性:是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫(kù)時(shí),比如操作同一張表時(shí),數(shù)據(jù)表為每個(gè)用戶開啟的事務(wù),不能被其他事務(wù)所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
- 持久性:持久性是指一個(gè)事務(wù)一旦被提交,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的性況下也不會(huì)丟失提交事務(wù)的操作。
1.2 并發(fā)操作問題
- 臟讀:臟讀是指在一個(gè)事務(wù)處理過程中讀取到了另外一個(gè)未提交事務(wù)中的數(shù)據(jù)。
- 不可重復(fù)讀:不可重復(fù)讀是指在對(duì)于數(shù)據(jù)庫(kù)中的某個(gè)數(shù)據(jù),一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個(gè)事務(wù)修改并提交了。
- 虛讀(幻讀):幻讀發(fā)生在當(dāng)兩個(gè)完全相同的查詢執(zhí)行時(shí),第二次查詢所返回的結(jié)果集跟第一個(gè)查詢不相同。比如兩個(gè)事務(wù)操作,A 事務(wù)查詢狀態(tài)為 1 的記錄時(shí),這時(shí) B 事務(wù)插入了一條狀態(tài)為 1 的記錄,A 事務(wù)再次查詢返回的結(jié)果不一樣。
1.3 事務(wù)的隔離級(jí)別
- Serializable(串行化):可避免臟讀、不可重復(fù)讀、幻讀。(就是串行化讀數(shù)據(jù))
- Repeatable read(可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
- Read committed(讀已提交):可避免臟讀的發(fā)生。
- Read uncommitted(讀未提交):最低級(jí)別,任何情況都無(wú)法保證。
在 MySQL 數(shù)據(jù)庫(kù)中,支持上面四種隔離級(jí)別,默認(rèn)的為 Repeatable read (可重復(fù)讀);而在 Oracle 數(shù)據(jù)庫(kù)中,只支持 Serializable (串行化)級(jí)別和 Read committed (讀已提交)這兩種級(jí)別,其中默認(rèn)的為 Read committed 級(jí)別。