一诵竭、事務(wù)
1.數(shù)據(jù)庫(kù)的事務(wù)含義:是指一系列有序的數(shù)據(jù)庫(kù)操作:
- 要么全部成功
- 要么全部回退到操作前狀態(tài)
- 中間狀態(tài)對(duì)其它連接不可見
2.事務(wù)的基本操作
- start transaction開始事務(wù)
- commit 提交事務(wù)
- rollback 回滾事務(wù)
3.事務(wù)的基本屬性
- 原子性:包含在事務(wù)中的操作要么全部被執(zhí)行糟秘,要么都不執(zhí)行
- 一致性:事務(wù)的結(jié)果需要滿足數(shù)據(jù)的一致性約束,比如用戶賬號(hào)不能重復(fù)笆包,銀行余額不能是負(fù)數(shù)
- 隔離性:數(shù)據(jù)庫(kù)事務(wù)在提交完成前,中間的任何數(shù)據(jù)變化對(duì)其他的事務(wù)都是不可見的,InnoDB默認(rèn)可重復(fù)讀
- 持久性:提交完成的事務(wù)對(duì)數(shù)據(jù)庫(kù)的影響必須是永久性的
4.隔離現(xiàn)象
隔離現(xiàn)象 | 舉例 |
---|---|
臟讀(Dirty Read) | 事務(wù)B讀到事務(wù)A尚未提交的數(shù)據(jù)變更 |
不可重復(fù)讀(NonRepeatable Read) | 事務(wù)B前后兩次讀取一條記錄之間時(shí),該記錄被事務(wù)A修改并提交英遭,于是事務(wù)B讀到了不一樣的結(jié)果 |
幻讀(Phantom Read) | 事務(wù)B按條件匹配到了若干行記錄并修改。但是由于修改過(guò)程中事務(wù)A新插入了符合條件記錄亦渗,導(dǎo)致B更新完成后發(fā)現(xiàn)仍有符合條件卻未被更新的記錄 |
5.事務(wù)與并發(fā)寫
某個(gè)正在更新的記錄在提交或回滾前不能被其他事務(wù)同時(shí)更新
二挖诸、存儲(chǔ)引擎
-
定義:顧名思義,數(shù)據(jù)和sql語(yǔ)句經(jīng)過(guò)處理之后會(huì)交給存儲(chǔ)引擎層央碟,存儲(chǔ)引擎層會(huì)決定如何把數(shù)據(jù)記錄在磁盤上税灌。
2.InnoDB存儲(chǔ)引擎的特性(MySQL默認(rèn))
- 索引組織表
- 支持事務(wù)
- 支持行級(jí)鎖:寫不阻塞讀均函,不同行間的寫互相不阻塞,所以并發(fā)性能好
- 數(shù)據(jù)塊緩存:數(shù)據(jù)的讀寫需要經(jīng)過(guò)緩存菱涤;以整頁(yè)16K為單位讀取到緩存中;緩存中的數(shù)據(jù)采用LRU策略換出苞也;IO效率高、性能好粘秆。
- 日志持久化:事務(wù)日志(redo log)實(shí)時(shí)持久化(順時(shí)IO操作如迟、開銷小);內(nèi)存變化數(shù)據(jù)(臟數(shù)據(jù))增量異步刷出到磁盤(需要在磁盤尋找數(shù)據(jù)頁(yè)的位置攻走,隨機(jī)IO操作殷勘,開銷大)
- 穩(wěn)定可靠、性能好
3.MyISAM存儲(chǔ)引擎的特性
- 堆表
- 不支持事務(wù)
- 只維護(hù)索引緩存池昔搂,表數(shù)據(jù)緩存交給操作系統(tǒng)
- 鎖粒度大
- 優(yōu)點(diǎn):數(shù)據(jù)文件可以直接拷貝進(jìn)行遷移
- user表就是MyISAM表玲销,不經(jīng)常修改的元數(shù)據(jù)可以用MyISAM表(因?yàn)镸yISAM表修改數(shù)據(jù)時(shí)會(huì)鎖表,可能造成堵塞)
三摘符、InnoDB鎖
1.鎖?
控制對(duì)共享資源進(jìn)行并發(fā)訪問(wèn)贤斜,保護(hù)數(shù)據(jù)的完整性和一致性
數(shù)據(jù)庫(kù)中的鎖對(duì)象有:事務(wù)和線程,前者是在事務(wù)過(guò)程中保護(hù)數(shù)據(jù)庫(kù)邏輯內(nèi)容逛裤,后者是在臨界資源爭(zhēng)搶保護(hù)內(nèi)存數(shù)據(jù)結(jié)構(gòu)
2.事務(wù)鎖粒度
- 行鎖(row-level lock 如 InnoDB,Oracle)開銷大瘩绒、加鎖慢;會(huì)出現(xiàn)死鎖带族;鎖粒度最小锁荔,發(fā)生鎖沖突的概率最低,并發(fā)度最高
- 頁(yè)鎖(page-level lock 如 SQL Server) 會(huì)出現(xiàn)死鎖蝙砌,其它介于行鎖和表鎖之間
- 表鎖(table-level lock 如 MyISAM, Memory) 開銷小阳堕、加鎖快;不會(huì)出現(xiàn)死鎖拍霜;鎖粒度大嘱丢,發(fā)生鎖沖突的概率最高,并發(fā)度最低
表級(jí)鎖適合以查詢?yōu)橹? 如web應(yīng)用
行級(jí)鎖適合有大量按索引條件并發(fā)更新少量不同數(shù)據(jù)祠饺,同時(shí)又有并發(fā)查詢的應(yīng)用
3.InnoDB行鎖的實(shí)現(xiàn)——通過(guò)索引項(xiàng)加鎖實(shí)現(xiàn)(自增主鍵做條件更新越驻,性能最好)
- 只有條件走索引才能實(shí)現(xiàn)行級(jí)鎖
- 索引上有重復(fù)值,可能鎖住多個(gè)記錄
- 查詢有多個(gè)索引可以走道偷,可以對(duì)不同索引加鎖
- 是否對(duì)索引加鎖實(shí)際上取決于MySQL執(zhí)行計(jì)劃