數(shù)據(jù)庫事務(wù)具有ACID四個特性,即原子性苦锨、一致性、隔離性和持久性璧帝。
- 原子性指事務(wù)在commit之前要么全部成功叔锐,要么全部失敗回滾,不能出現(xiàn)成功一半的情況紧帕。A給B轉(zhuǎn)賬盔然,A扣掉100桅打,B加上100這兩個動作要一起完成,或一起失敗愈案,這提現(xiàn)了原子性挺尾。
- 一致性指數(shù)據(jù)處于語義上有意義且正確的狀態(tài),是對數(shù)據(jù)可見性的約束站绪,保證在一個事務(wù)對數(shù)據(jù)的多次操作的中間狀態(tài)對其他事務(wù)不可見遭铺。還是以A給B轉(zhuǎn)賬,因為未提交讀的隔離級別下恢准,會造成魂挂,A扣掉100,B只加上60顷歌,這結(jié)果保證了原子性锰蓬,但破壞了一致性。
- 隔離性指事務(wù)中對數(shù)據(jù)的修改眯漩,對其他事務(wù)不可見芹扭。
- 持久性指事務(wù)一旦被提交,對數(shù)據(jù)的修改就是永久的赦抖。
可見舱卡,想要保證數(shù)據(jù)強一致性,就要保證事務(wù)隔離級別越高队萤,最好是串行執(zhí)行轮锥,但是串行執(zhí)行就會嚴重影響性能。在權(quán)衡性能和一致性之間要尔,數(shù)據(jù)庫提供了4種隔離級別對應(yīng)數(shù)據(jù)4種可見性級別舍杜,可以讓用戶自主選擇。
- Read unCommitted讀未提交赵辕,事務(wù)B對數(shù)據(jù)修改后還未提交事務(wù)既绩,在事務(wù)A中就能看到修改后的結(jié)果,我們稱它為"臟讀"还惠,可見性最強饲握,隔離性最弱。
- Read committed讀已提交蚕键,對未提交的內(nèi)容進行了隔離救欧,避免了臟讀。但對事務(wù)B已提交的內(nèi)容锣光,事務(wù)A是可見的笆怠。這導致,事務(wù)A在兩次讀取同一份數(shù)據(jù)期間嫉晶,事務(wù)B對數(shù)據(jù)做了修改骑疆,事務(wù)A就可能會得到不同的結(jié)果田篇。即"不可重復(fù)讀"同一份數(shù)據(jù)。
- Repeatable read可重復(fù)讀箍铭,事務(wù)A通過對一次讀到的數(shù)據(jù)加鎖泊柬,使事務(wù)B不能修改這部分數(shù)據(jù),保證了數(shù)據(jù)可重復(fù)讀诈火。但是事務(wù)A加鎖只能保證數(shù)據(jù)不被修改兽赁,如果事務(wù)B新增一條數(shù)據(jù)符合事務(wù)A的查詢條件,那么事務(wù)A在第二次查詢時就多了一條數(shù)據(jù)冷守,造成兩次結(jié)果不一樣刀崖,這樣的現(xiàn)象成為"幻讀"。
- Serializable串行化拍摇,通過加鎖將事務(wù)串行處理亮钦,完全隔離開來。
Mysql默認是Repeatable Read充活,Postgres默認是Read Committed