《高性能mysql》筆記-基礎(chǔ)知識

并發(fā)控制

讀寫鎖

處理并發(fā)讀或?qū)憰r,由兩種類型的鎖組成的鎖系統(tǒng)來解決問題

1.共享鎖既讀鎖,多個客戶在同一時刻讀取同一個資源,互不干擾
2.排他鎖既寫鎖,一個寫鎖會堵塞其他的寫鎖和讀鎖,保證只有一個用戶能執(zhí)行寫入,并防止其他用戶讀取正在寫入的同一資源

鎖粒度

表鎖 進(jìn)行寫操作時,鎖住整張表,堵塞其他用戶對該表的所有讀寫操作

行級鎖
最大支持并發(fā),Innodb存儲引擎實現(xiàn)了

事務(wù)

1.ACID概念

  1. 原子性:一個事務(wù)必須被視為一個不可分割的最小工作單元,整個事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾
  2. 一致性:數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉(zhuǎn)換到另外一個一致性的狀態(tài)。
  3. 隔離性:一個事務(wù)所做的修改再最終提交以前,對其它事務(wù)是不可見的;
  4. 持久性:一旦事務(wù)提交,則其所做的修改就會永久保存到數(shù)據(jù)庫中。

隔離級別 https://www.cnblogs.com/snsdzjlz320/p/5761387.html#_label00

低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

READ UNCOMMITTED(未提交讀):事務(wù)中的修改,即使沒有提交,對其它事務(wù)也都是可見的,也稱臟讀,一般很少使用

READ COMMITTED(提交讀):一個事務(wù)從開始直到提交之前,所做的任何修改對其它事務(wù)都是不可見的,兩次相同的查詢,查詢結(jié)果可能不同,也稱不可重復(fù)讀

REPEATABLE READ(可重復(fù)讀):在同一個事務(wù)中多次讀取同樣記錄的結(jié)果是一致的;(MySQL默認(rèn)事務(wù)隔離級別),理論上會出現(xiàn)幻讀(某個事務(wù)在讀取范圍內(nèi)的數(shù)據(jù)時,另外一個事務(wù)在該范圍內(nèi)插入了新的記錄,當(dāng)之前事務(wù)重新讀取時,會出現(xiàn)幻行,innodb已通過機(jī)制解決)

SERIALIZABLE(可串行化):最高的隔離級別。通過強制事務(wù)串行化執(zhí)行,避免幻讀的問題。SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖,可能導(dǎo)致大量的超市和鎖爭用的問題。只有在非常需要去報數(shù)據(jù)一致性且可以接受沒有并發(fā)的情況下使用。

死鎖

指兩個或多個事務(wù)在同一資源上互相占用,并請求鎖定對方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象。
innodb解決方法:將持有最少行級排他鎖的事務(wù)進(jìn)行回滾。

image

事務(wù)提交

MySQL默認(rèn)采用自動提交(AUTOCOMMIT)模式。如果不是顯示開始一個事務(wù),則每個查詢都被當(dāng)作一個事務(wù)執(zhí)行提交操作。

可以通過設(shè)置AUTOCOMMIT變量來啟用或者禁用自動提交模式:

mysql> show variables like 'AUTOCOMMIT';
mysql> set AUTOCOMMIT=1;

*注意:alter table , lock tables 命令在執(zhí)行之前會強制執(zhí)行COMMIT提交當(dāng)前的活動事務(wù);

隱性和顯性鎖定

隱性鎖定,begin commit或rollback釋放

顯性鎖定:select ... Lock in share mode
select ... For update

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容