1.邏輯架構(gòu)圖
2.并發(fā)控制
只要有多個(gè)查詢需要在同一個(gè)時(shí)刻修改數(shù)據(jù)導(dǎo)致出現(xiàn)并發(fā)問(wèn)題(讀取數(shù)據(jù)不會(huì)出現(xiàn)問(wèn)題)
解決并發(fā)控制的讀寫
通過(guò)實(shí)現(xiàn)兩種類型的鎖組成的鎖系統(tǒng)解決
讀寫鎖
- 共享鎖(讀鎖)
- 排他鎖(寫鎖)
什么是鎖
- 讀鎖: 多個(gè)客戶都可以在同一時(shí)刻讀取同一個(gè)資源并且是共享的(互不干擾)
- 寫鎖:只有一個(gè)用戶可以能執(zhí)行寫入,會(huì)阻塞其他的讀鎖和寫鎖,防止其他用戶讀取正在寫入的同一資源
鎖粒度
一種提高共享資源并發(fā)性的方式
出現(xiàn)問(wèn)題:加大開(kāi)銷损搬,消耗資源
- 例如:鎖的各種操作
- 獲取鎖 檢查鎖是否解除 釋放鎖等
鎖策略
鎖的開(kāi)銷和數(shù)據(jù)的安全性之間尋求平衡
常用的鎖策略
- 表鎖
1.基本鎖策略罪帖,開(kāi)銷最小
2.鎖住整張表
一個(gè)用戶操作表的話需要獲取到寫鎖热监,
這會(huì)阻塞其他用戶的對(duì)該表所有的讀寫操作,釋放掉寫鎖后,其他讀取用戶才可以操作(讀鎖[互不阻塞])
- 行級(jí)鎖(存儲(chǔ)引擎實(shí)現(xiàn))
1.最大程度的支持并發(fā)處理,開(kāi)銷最大
3.事務(wù)
一組原子性(不成功便成仁)的SQL查詢語(yǔ)句 (獨(dú)立工作的單元)
事務(wù)內(nèi)的語(yǔ)句膳音,要么全部執(zhí)行成功,要么全部執(zhí)行失敗(一條語(yǔ)句崩潰或者其他原因無(wú)法執(zhí)行)
開(kāi)啟事務(wù)
start transaction 語(yǔ)句開(kāi)啟事務(wù)
commit提交事務(wù)
roolback撤銷所有事務(wù)
例子:銀行應(yīng)用(轉(zhuǎn)賬)
所有事務(wù)必須經(jīng)過(guò)ACID測(cè)試
- A: atomicity 原子性
- C: consistency 一致性
- I: isolation 隔離性
- D: durability 持久性
原子性:
要執(zhí)行事務(wù)代碼邏輯成功铃诬,要么就執(zhí)行事務(wù)代碼失敗
一致性:
“一致性”在數(shù)據(jù)庫(kù)領(lǐng)域有兩個(gè)意義:
祭陷,一個(gè)是ACID中的C苍凛,也是普遍意義上的數(shù)據(jù)庫(kù)事務(wù)一致性,
另一個(gè)是CAP的C颗胡,有關(guān)分布式事務(wù)的一致性毫深。
舉例來(lái)說(shuō)吩坝,假設(shè)用戶A和用戶B兩者的錢加起來(lái)一共是1000毒姨,
那么不管A和B之間如何轉(zhuǎn)賬、轉(zhuǎn)幾次賬钉寝,
事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來(lái)應(yīng)該還得是1000弧呐,這就是事務(wù)的一致性。
ACIP
1.事務(wù)對(duì)數(shù)據(jù)完整性的遵循
約束可能包括主鍵約束嵌纲、外鍵約束或是一些用戶自定義約束俘枫。
事務(wù)執(zhí)行的前后都是合法的數(shù)據(jù)狀態(tài),不會(huì)違背任何的數(shù)據(jù)完整性
2.不能寫出錯(cuò)誤的事務(wù)邏輯
CAP
1.CAP定理是分布式系統(tǒng)理論的基礎(chǔ)
分布式系統(tǒng)(或者由于網(wǎng)絡(luò)隔離等原因產(chǎn)生的分區(qū)系統(tǒng))逮走,它無(wú)法同時(shí)保證一致性鸠蚪、可用性和分區(qū)容忍性,
而是必須要舍棄其中的一個(gè)师溅。
2.具體在數(shù)據(jù)庫(kù)上茅信,就是分布式數(shù)據(jù)庫(kù)中,
每一個(gè)節(jié)點(diǎn)對(duì)于同一個(gè)數(shù)據(jù)必須有相同的拷貝每個(gè)庫(kù)里的同一個(gè)數(shù)據(jù)內(nèi)容必須是一致的)
分布式事務(wù)
隔離性
當(dāng)多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)墓臭,比如同時(shí)操作同一張表時(shí)蘸鲸,數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù),
不能被其他事務(wù)的操作所干擾窿锉,多個(gè)并發(fā)事務(wù)之間要相互隔離
持久性
一個(gè)事務(wù)一旦被提交了酌摇,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,
即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作
隔離級(jí)別(隔離性)
- 未提交讀(臟讀)[READ UNCOMMITTED]
事務(wù)可以讀取為提交的的數(shù)據(jù)[問(wèn)題多,實(shí)際少用] - 提交讀(不可重復(fù)讀)[READ COMMITTED]
一個(gè)事務(wù)開(kāi)始到結(jié)束嗡载,所做的所有修改對(duì)其他事務(wù)是不可見(jiàn)的[兩次所執(zhí)行的查詢窑多,得到的結(jié)果可能不一樣] - 可重復(fù)讀[REPEATABLE READ]
- 解決臟讀問(wèn)題
2.保證同一事務(wù)中多次讀取同樣的記錄結(jié)果是一致的
3.幻讀:當(dāng)一個(gè)事務(wù)讀取某一范圍的記錄,又有新事務(wù)在這個(gè)范圍插入新的記錄洼滚,上一個(gè)事務(wù)再次讀取就會(huì)出現(xiàn)此問(wèn)題-->幻行
- 可串行化[SERALIZABLE]
1.強(qiáng)制事務(wù)串行執(zhí)行怯伊,避免幻行問(wèn)題
2.讀取的每一行數(shù)據(jù)上加鎖增大開(kāi)銷和爭(zhēng)鎖問(wèn)題(實(shí)際上少用除了非常需要保持?jǐn)?shù)據(jù)一致性且可以接受沒(méi)有并發(fā)的情況)
死鎖
兩個(gè)或者多個(gè)事務(wù)在同一資源上相互占用,請(qǐng)求鎖定對(duì)方的資源從而導(dǎo)致惡性循環(huán)現(xiàn)象
出現(xiàn)死鎖原因:
1.數(shù)據(jù)出現(xiàn)沖突
2.存儲(chǔ)引擎實(shí)現(xiàn)方式導(dǎo)致
解決:大多數(shù)情況只需要重新執(zhí)行因死鎖回滾的事務(wù)
·
Mysql 事務(wù)
常見(jiàn)事務(wù)存儲(chǔ)引擎:innodb NDB Cluster
Mysql 事務(wù)
多版本并發(fā)控制
Mysql存儲(chǔ)引擎
//查看存儲(chǔ)引擎顯示表的相關(guān)信息
SHOW TABLE STATUS LIKE 表名
- innoDB 存儲(chǔ)引擎