數(shù)據(jù)庫(kù)的四大特性
原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài)靶剑,也就是說(shuō)一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)稠茂。 拿轉(zhuǎn)賬來(lái)說(shuō)噪沙,假設(shè)用戶A和用戶B兩者的錢(qián)加起來(lái)一共是5000,那么不管A和B之間如何轉(zhuǎn)賬莹规,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢(qián)相加起來(lái)應(yīng)該還得是5000泌神,這就是事務(wù)的一致性良漱。隔離性(Isolation)
多個(gè)并發(fā)事務(wù)之間要相互隔離,一個(gè)事務(wù)不能被其他事務(wù)的操作所干擾。持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交了欢际,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的母市,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
數(shù)據(jù)庫(kù)的隔離級(jí)別
- Read uncommitted (讀未提交)
- Read committed(讀已提交)
- Repeatable read(可重復(fù)讀)
- Serializable (串行化)
數(shù)據(jù)庫(kù)隔離級(jí)別解決的問(wèn)題
臟讀
臟讀是指在一個(gè)事務(wù)處理過(guò)程里讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù)损趋。
示例:A在一個(gè)事務(wù)里患久,往T1表里插入了一條記錄,此時(shí)B另起一個(gè)事務(wù),查詢T1表可以看到該記錄墙杯,之后A回滾事務(wù)配并,B在沒(méi)有關(guān)閉事務(wù)的情況下,發(fā)現(xiàn)該記錄消失了高镐。不可重復(fù)讀
不可重復(fù)讀是指溉旋,在一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔嫉髓,被另一個(gè)事務(wù)修改并提交了观腊。
示例:A在一個(gè)事務(wù)里,查詢表T1的某個(gè)字段算行,此時(shí)B修改了T1表的這個(gè)字段梧油,A再次查詢時(shí),發(fā)現(xiàn)該字段發(fā)生了變化州邢。幻讀
幻讀是指儡陨,在一個(gè)事務(wù)執(zhí)行批量修改時(shí),有新的數(shù)據(jù)插入量淌,就好像批量修改沒(méi)玩完成一樣骗村。
示例:A在一個(gè)事務(wù)里,批量把表T1的某字段從1更新為2呀枢,此時(shí)B恰好往T1表里插入了一條字段為1的記錄胚股。A在執(zhí)行完操作發(fā)現(xiàn)還有一條沒(méi)修改。
很多人容易搞混不可重復(fù)讀和幻讀裙秋,確實(shí)這兩者有些相似琅拌。但不可重復(fù)讀重點(diǎn)在于update和delete,而幻讀的重點(diǎn)在于insert摘刑。
如果使用鎖機(jī)制來(lái)實(shí)現(xiàn)這兩種隔離級(jí)別进宝,在可重復(fù)讀中,該sql第一次讀取到數(shù)據(jù)后泣侮,就將這些數(shù)據(jù)加鎖即彪,其它事務(wù)無(wú)法修改這些數(shù)據(jù),就可以實(shí)現(xiàn)可重復(fù) 讀了活尊。
但這種方法卻無(wú)法鎖住insert的數(shù)據(jù)隶校,所以當(dāng)事務(wù)A先前讀取了數(shù)據(jù),或者修改了全部數(shù)據(jù)蛹锰,事務(wù)B還是可以insert數(shù)據(jù)提交深胳,這時(shí)事務(wù)A就會(huì) 發(fā)現(xiàn)莫名其妙多了一條之前沒(méi)有的數(shù)據(jù),這就是幻讀铜犬,不能通過(guò)行鎖來(lái)避免舞终。