1.ACID
⑴ 原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功眼五,要么全部失敗回滾,不可拆分的一體彤灶,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念看幼,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響幌陕。
⑵ 一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài)诵姜,也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
拿轉(zhuǎn)賬來說搏熄,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000棚唆,那么不管A和B之間如何轉(zhuǎn)賬暇赤,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000宵凌,這就是事務(wù)的一致性鞋囊。
⑶ 隔離性(Isolation)
隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時瞎惫,數(shù)據(jù)庫為每一個用戶開啟的事務(wù)溜腐,不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離瓜喇。
即要達(dá)到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2挺益,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束乘寒,要么在T1結(jié)束之后才開始矩肩,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別肃续,稍后會介紹到黍檩。
⑷ 持久性(Durability)
持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的始锚,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作刽酱。
例如我們在使用JDBC操作數(shù)據(jù)庫時,在提交事務(wù)方法后瞧捌,提示用戶事務(wù)操作完成棵里,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)以及正確提交姐呐,即使這時候數(shù)據(jù)庫出現(xiàn)了問題殿怜,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會造成我們看到提示事務(wù)處理完畢曙砂,但是數(shù)據(jù)庫因為故障而沒有執(zhí)行事務(wù)的重大錯誤头谜。
1,臟讀(我讀到了你未提交事物的數(shù)據(jù))
臟讀是指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)鸠澈。
2柱告,不可重復(fù)讀(再一個事物中,我第一次讀你沒修改笑陈,第二次讀你修改提交了)
不可重復(fù)讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù)际度,一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔涵妥,被另一個事務(wù)修改并提交了乖菱。
3,幻讀
我把表中的所有1改為2,還沒提交窒所,然后你查進(jìn)了一條數(shù)據(jù)1并提交娜氏,然后我就產(chǎn)生幻覺了,怎么肥死,有一個1沒有變成2.
幻讀和不可重復(fù)讀的區(qū)別就是墩新,不可重復(fù)查詢的是同一個數(shù)據(jù)項贸弥,而幻讀確是一批數(shù)據(jù)。
現(xiàn)在來看看MySQL數(shù)據(jù)庫為我們提供的四種隔離級別:
『Tā① Serializable (串行化):可避免臟讀绵疲、不可重復(fù)讀、幻讀的發(fā)生臣疑。
默認(rèn)② Repeatable read (可重復(fù)讀):可避免臟讀盔憨、不可重復(fù)讀的發(fā)生。
⊙渡颉③ Read committed (讀已提交):可避免臟讀的發(fā)生郁岩。
④ Read uncommitted (讀未提交):最低級別缺狠,任何情況都無法保證问慎。
2.數(shù)據(jù)庫索引的實現(xiàn)原理
數(shù)據(jù)庫索引,是數(shù)據(jù)庫管理系統(tǒng)中一個排序的數(shù)據(jù)結(jié)構(gòu)挤茄,以協(xié)助快速查詢如叼、更新數(shù)據(jù)庫表中數(shù)據(jù)。索引的實現(xiàn)通常使用B樹及其變種B+樹穷劈。
索引就是一個滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu)笼恰,指向數(shù)據(jù)。
代價:1.存儲空間 ????2.插入修改數(shù)據(jù)的話 索引也要變歇终,花時間
優(yōu)點:1.數(shù)據(jù)唯一性????2.加快數(shù)據(jù)查詢????3.加快分組和排序????4.加快表連接
可以加索引的列:1.經(jīng)常搜索的? ? 2.主鍵? ? 3.經(jīng)常用于連接的外鍵社证,加快連接
不該用的列:1.查的很少? ? 2.數(shù)據(jù)值很少(男女)
索引類型:
1.唯一索引
不允許索引值重復(fù),比如姓名
2.主鍵索引
唯一索引的特定類型评凝,數(shù)據(jù)庫自動為主鍵創(chuàng)建索引
3.聚集索引
索引值的邏輯順序規(guī)定其物理順序追葡,主鍵自動聚集索引,且唯一肥哎。
書本的分類為邏輯順序辽俗,書本的擺放為物理順序疾渣,邏輯分類決定了物理擺放位置(分類擺放)
局部性原理與磁盤預(yù)讀
局部性原理就是篡诽,當(dāng)一個數(shù)據(jù)要被使用事,通常附近的數(shù)據(jù)也要被使用榴捡,程序運(yùn)行時所需數(shù)據(jù)集中杈女。
磁盤所以為了提高I/O效率(本來磁盤很慢,讀取效率是主存 的幾百分之一)旭从,所以每次預(yù)讀一頁或者幾頁
頁是存儲器的邏輯塊(通常4k)
數(shù)據(jù)庫索引為什么要用 B+ 樹而不用紅黑樹呢淋袖?
索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù) 每次預(yù)讀頁的倍數(shù)
B-/B+樹剛好滿足姆打,子節(jié)點多根吁,存的元素多聋呢,紅黑樹就2個子節(jié)點损搬,浪費空間郭宝。
B-/B+樹的深度低重虑,所以i/o次數(shù)少蝇裤。
3.數(shù)據(jù)庫的鎖
鎖包括行級鎖廷支、表級鎖、悲觀鎖栓辜、樂觀鎖
? ? ?行級鎖:一種它鎖恋拍,防止另外事務(wù)修改此行
? ? 表級鎖:行共享 (ROW SHARE)??????行排他(ROW EXCLUSIVE)??????共享鎖(SHARE)????共享行排他(SHARE ROW EXCLUSIVE)?????排他(EXCLUSIVE)
悲觀鎖:
事務(wù)每次去操作數(shù)據(jù)的時候都假設(shè)有其他事務(wù)會修改需要訪問的數(shù)據(jù),每次我都有人跟我搶藕甩!
所以我要求在操作之前先上鎖施敢,實現(xiàn)靠數(shù)據(jù)庫的鎖機(jī)制
樂觀鎖:
每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改,所以不會上鎖狭莱,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)僵娃,可以使用版本號等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型
4.聚簇索引和非聚簇索引
5.數(shù)據(jù)庫的三級封鎖協(xié)議
基本的封鎖類型有兩種:
排它鎖(Exclusive locks 簡記為X鎖)寫鎖
共享鎖(Share locks 簡記為S鎖)讀鎖
?1 級封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖腋妙,直到事務(wù)結(jié)束才釋放悯许。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。
?2級封鎖協(xié)議是:1級封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖辉阶,讀完后即可釋放S鎖先壕。2級封鎖協(xié)議除防止了丟失修改,還可進(jìn)一步防止讀"臟"數(shù)據(jù)谆甜。
3級封鎖協(xié)議是:1級封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖垃僚,直到事務(wù)結(jié)束才釋放。3級封鎖協(xié)議除防止了丟失修改和不讀'臟'數(shù)據(jù)外规辱,還進(jìn)一步防止了不可重復(fù)讀谆棺。
6.MyISAM與InnoDB區(qū)別及選擇
選擇:
因為MyISAM相對簡單所以在效率上要優(yōu)于InnoDB.如果系統(tǒng)讀多,寫少罕袋。對原子性要求低改淑。那么MyISAM最好的選擇。且MyISAM恢復(fù)速度快浴讯《湎模可直接用備份覆蓋恢復(fù)。
如果系統(tǒng)讀少榆纽,寫多的時候仰猖,尤其是并發(fā)寫入高的時候捏肢。InnoDB就是首選了。
兩種類型都有自己優(yōu)缺點饥侵,選擇那個完全要看自己的實際類弄鸵赫。